Bedingtes Startdrawing() wird nicht ausgelöst

Anfängerfragen zum Programmieren mit PureBasic.
Re57
Beiträge: 43
Registriert: 10.04.2020 12:19

Bedingtes Startdrawing() wird nicht ausgelöst

Beitrag von Re57 »

Hallo, ich möchte, daß testweise ein roter Punkt gemalt wird, wenn WinndowsMouseX() > 375 ist. Das geht aber nicht, obwohl es laut Debugger gehen müßte. Ich habe jetzt redlich den Code so geschrieben, wie ich das in dem heute morgigen Beispiel gezeigt bekommen hatte, obwohl es mir total gegen den Strich geht, nur mit WindowEvent() zu arbeiten, anstatt mit WaitWindowEvent(). Wieso wird jetzt der rote Punkt nicht gezeichnet, obwohl die Bedingung dafür vorliegt? Bitte helft mir jetzt, dann habt ihr mich auch so schnell wie möglich wieder vom Hals hier im Forum. Früher hatte ich immer geschafft, das programmieren zu können, was ich wollte und für mich selber ist das jetzt am allerschlimmsten, jetzt erstmal so elend kämpfen zu müssen. Hier ist der Code:

Code: Alles auswählen

#Flags = #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget

If InitMouse() = 0
  MessageRequester("InitMouse fehlgeschlagen", "Programm endet")
EndIf 

If InitKeyboard() = 0
  MessageRequester("InitKeyboard fehlgeschlagen", "Programm endet")
EndIf


If InitSprite() = 0
  MessageRequester("InitSprite fehlgeschlagen", "Programm endet")
EndIf  

If OpenWindow(1,0,0,1366,700,"",#Flags) = 0
  MessageRequester("OpenWindow fehlgeschlagen", "Programm endet")
EndIf  

If OpenWindowedScreen(WindowID(1),0,0,1366,700) = 0
  MessageRequester("OpenWindowedScreen fehlgeschlagen", "Programm endet")
EndIf

StartDrawing(ScreenOutput())
Box(0,0,1366,700,RGB(0,200,0))
StopDrawing()


Repeat     
   Repeat
     ExamineKeyboard()
     ExamineMouse() : ReleaseMouse(#True) 
     Event = WindowEvent() 
     
     Select event
       Case #WM_LBUTTONDOWN
         wmx = WindowMouseX(1) : Debug wmx   
         
       Case #PB_Event_CloseWindow
         schliessen = 1
     EndSelect    
         
       If wmx > 375
         StartDrawing(ScreenOutput())
         Circle(300,290,7,RGB(200,0,0))
         StopDrawing()
       EndIf
       
   Until Event = 0
Until schliessen = 1 Or #PB_Event_CloseWindow Or KeyboardPushed(#PB_Key_Escape)     
End
Danke.
Benutzeravatar
Kurzer
Beiträge: 1614
Registriert: 25.04.2006 17:29
Wohnort: Nähe Hamburg

Re: Bedingtes Startdrawing() wird nicht ausgelöst

Beitrag von Kurzer »

Hallo, ich bin zwar gerade nur am Smartphone, sehe aber so schon, dass du Event mal groß und mal klein schreibst. Diese Art von Fehler kann dir bei Verwendung der Compileranweisung EnableExplicit nicht passieren.

Schreib das als erste Zeile in deinen Code und dann debugge ihn erstmal.

Gruß Kurzer

Gesendet von einem Smartphone
"Never run a changing system!" | "Unterhalten sich zwei Alleinunterhalter... Paradox, oder?"
PB 6.02 x64, OS: Win 7 Pro x64 & Win 11 x64, Desktopscaling: 125%, CPU: I7 6500, RAM: 16 GB, GPU: Intel Graphics HD 520
Useralter in 2023: 56 Jahre.
Benutzeravatar
Kiffi
Beiträge: 10621
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: Bedingtes Startdrawing() wird nicht ausgelöst

Beitrag von Kiffi »

@Kurzer: Falsch abgebogen. :wink: Variablennamen sind in PB zum Glück case insentive.

Der EnableExplicit - Tipp gilt allerdings immer.

Grüße ... Peter
Hygge
Benutzeravatar
Kurzer
Beiträge: 1614
Registriert: 25.04.2006 17:29
Wohnort: Nähe Hamburg

Re: Bedingtes Startdrawing() wird nicht ausgelöst

Beitrag von Kurzer »

Oh danke Kiffi, da war ich in der Tat zu übereifrig. :shock:
"Never run a changing system!" | "Unterhalten sich zwei Alleinunterhalter... Paradox, oder?"
PB 6.02 x64, OS: Win 7 Pro x64 & Win 11 x64, Desktopscaling: 125%, CPU: I7 6500, RAM: 16 GB, GPU: Intel Graphics HD 520
Useralter in 2023: 56 Jahre.
GPI
Beiträge: 1511
Registriert: 29.08.2004 13:18
Kontaktdaten:

Re: Bedingtes Startdrawing() wird nicht ausgelöst

Beitrag von GPI »

Mein Tip ist: Nicht auf den Bildschirm zeichnen! Bei meinen aktuellen Spiel hat das nur zu unkontrollierbaren Problemen geführt. Erstell dir ein Sprite, mal in den Sprite und benutzt den dann. Das geht auch um ein vielfaches schneller.
CodeArchiv Rebirth: Deutsches Forum Github Hilfe ist immer gern gesehen!
Benutzeravatar
Kurzer
Beiträge: 1614
Registriert: 25.04.2006 17:29
Wohnort: Nähe Hamburg

Re: Bedingtes Startdrawing() wird nicht ausgelöst

Beitrag von Kurzer »

@Re57,

hier mal eine bereinigte Version des codes mit ein paar Anpassungen.
Ich weiß nicht warum du die Auswertung mit einem Mausklick brauchst, aber dieser Code hier wertet die Position fortlaufend aus. Sobald du die Maus nach rechts über die Grenzlinie (375 Pixel) ziehst, wird dein Kreis gezeichnet.

Code: Alles auswählen

EnableExplicit

#Flags = #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget

Define.i event, wmx, wmy, border, width, height
border = 375
width = 1366
height = 700

If InitKeyboard() = 0
	MessageRequester("InitKeyboard fehlgeschlagen", "Programm endet")
	End
EndIf


If InitSprite() = 0
	MessageRequester("InitSprite fehlgeschlagen", "Programm endet")
	End
EndIf 

If OpenWindow(1, 0, 0, width, height, "", #Flags) = 0
	MessageRequester("OpenWindow fehlgeschlagen", "Programm endet")
	End
EndIf 

If OpenWindowedScreen(WindowID(1), 0, 0, width, height) = 0
	MessageRequester("OpenWindowedScreen fehlgeschlagen", "Programm endet")
	End
EndIf

Repeat     
	ExamineKeyboard()
	
	;event = WindowEvent()
	event = WaitWindowEvent()
	
	wmx = WindowMouseX(1)
	wmy = WindowMouseY(1)
	
	If wmx > border
		StartDrawing(ScreenOutput())
		Box(0, 0, width, height, RGB(0, 200, 0))
		Line(border, 0, 1, height, RGB(200, 0, 0))
		Circle(wmx, wmy, 7, RGB(200, 0, 0))
		StopDrawing()
		FlipBuffers()
	Else
		StartDrawing(ScreenOutput())
		Box(0, 0, width, height, RGB(0, 200, 0))
		Line(border, 0, 1, height, RGB(200, 0, 0))
		StopDrawing()
		FlipBuffers()
	EndIf
	
Until event = #PB_Event_CloseWindow Or KeyboardPushed(#PB_Key_Escape)     
End
PS: Warum sollte es mit WaitWindowEvent() nicht gehen?
"Never run a changing system!" | "Unterhalten sich zwei Alleinunterhalter... Paradox, oder?"
PB 6.02 x64, OS: Win 7 Pro x64 & Win 11 x64, Desktopscaling: 125%, CPU: I7 6500, RAM: 16 GB, GPU: Intel Graphics HD 520
Useralter in 2023: 56 Jahre.
Re57
Beiträge: 43
Registriert: 10.04.2020 12:19

Re: Bedingtes Startdrawing() wird nicht ausgelöst

Beitrag von Re57 »

Vielen Dank, vor allem an Kurzer für den Code. Ich habe das verstanden. Vor allem fehlte in meinem eigenen Code Flipbuffers(). Und ich habe jetzt auch in meinem Code diese innere Schleife entfernt. Jetzt läuft es super, auch mit WaitWindowsEvent()!

EnableExplicit hatte ich auch mal ausprobiert und demnach sollte etwas mit der Variablen wmx nicht stimmen oder mit Event = WindowsEventI() außer der Groß- und Kleinschreibung. Tempo spielt bei dem, was ich vor habe, überhaupt keine Rolle, daher ist es auch voll OK, direkt auf den Screen zu zeichnen. Danke nochmals!

Edit: Ursprünglich hatte ich hier etwas Frust gepostet, der allerdings nur temporär war. Jetzt bin ich aber wieder motiviert :allright:
Zuletzt geändert von Re57 am 11.04.2020 19:50, insgesamt 2-mal geändert.
Benutzeravatar
mk-soft
Beiträge: 3695
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: Bedingtes Startdrawing() wird nicht ausgelöst

Beitrag von mk-soft »

Vergiss mal alles was du damals mit PB gemacht hast und lerne wieder von vorne...

Wenn man nicht mal in die Hilfe von PB schaut, die sehr gut geschrieben ist, kommt man auch nicht weiter.
Purebasic hat sich natürlich weiterentwickelt, aber vieles gilt heute genau so wie in der alten Version.

Etwas Grundlagen lernen, wie Event Management und Variablen deklarieren, gehören einfach dazu.
Wenn du das nicht möchtest, gibt es immer noch im Museum die alten Versionen und Purebasic.

Sorry, wenn das etwas hart klingt. Aber wenn man wieder einsteigen möchte, gehört auch neu lernen dazu.
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Benutzeravatar
Kurzer
Beiträge: 1614
Registriert: 25.04.2006 17:29
Wohnort: Nähe Hamburg

Re: Bedingtes Startdrawing() wird nicht ausgelöst

Beitrag von Kurzer »

Ich glaube auch nicht, dass PureBasic eine Wissenschaft geworden ist.

Vermutlich bist du mit einer bestimmten Vorstellung an die Sache heran gegangen, von der du denkst, dass es der Weg ist, wie man das zu programmieren hat. Das führt nicht immer zum Erfolg, vor allem, wenn man bei den grundlegenden Funktionsweisen eine falsche Annahme hat (jetzt nur rein hypothetisch gesprochen) und versucht nun den code auf Basis dieser Annahme zum laufen zu bringen.

Du siehst z.B., dass dein code auch mit einer Repeat Schleife funktioniert. Deine Herangehensweise war vermutlich zu kompliziert, wenn du eine innere Repeat-Schleife programmierst, die nur verlassen wird, wenn kein Event kommt. Das konnte ich alles weg-rationalisieren, weil die Eventschleife im Prinzip eigentlich sehr einfach ist und nicht sehr viel komplizierten code benötigt.

Schau dir evtl. noch ein paar einfache Beispiele aus der PB Hilfe an oder die Grundlagenkapitel in der Hilfe und konzentriere dich dabei nicht so sehr auf das Verstehen der einzelnen codezeilen, sondern mache dir ein Bild von den Prinzipien, die da angewendet werden. Ich komme selbst vom Amiga (Assembler, lange ist es her) und habe mir am Anfang meiner PB Zeit (und auch lange Zeit danach noch) sehr oft an den Kopf fassen müssen, was ich mir da für einen Quark zusammengetippt habe. Auf dem Amiga waren einige Dinge ganz anders zu lösen, weil man dort unter Umständen an das Videotiming (50 Hz) gebunden war. :-) )

Also nicht verzagen und nicht zu viel auf einmal "können wollen". Einfach mal zurücklehnen und ein paar Beispielcodes auf der Prinzipienebene analysieren.

Gruß Kurzer
"Never run a changing system!" | "Unterhalten sich zwei Alleinunterhalter... Paradox, oder?"
PB 6.02 x64, OS: Win 7 Pro x64 & Win 11 x64, Desktopscaling: 125%, CPU: I7 6500, RAM: 16 GB, GPU: Intel Graphics HD 520
Useralter in 2023: 56 Jahre.
Re57
Beiträge: 43
Registriert: 10.04.2020 12:19

Re: Bedingtes Startdrawing() wird nicht ausgelöst

Beitrag von Re57 »

@mk-soft
Ist völlig richtig, was Du geschrieben hattest (allerdings sehe ich natürlich schon immer zuerst ins Handbuch). Variablen deklarieren werde ich mir auf jeden Fall mal ansehen, denn davon wußte ich bisher noch gar nichts. Ich weiß, daß das Handbuch sehr gut ist, das ist auch voll meine eigene Meinung. Auch wie schnell man direkt aus dem Programm heraus Hilfe aufrufen kann über F1 und dafür nicht mal online sein zu braucht, ist äußerst lobenswert gemacht. Ich bin halt manchmal etwas ungeduldig, aber so schnell gebe ich andererseits auch wiederum nicht auf. Wenn man dann wiedermal eine Hürde hinter sich hat, und dabei ist ja auch das Forum super, hat man ja auch wieder Auftrieb. In meinem obigen Fall war es ja eigentlich nur eine Kleinigkeit, aber drauf kommen muß man eben. Danke.

@Kurzer
Daß ich das heute mit der inneren zusätzlichen Schleife versucht hatte, war die unmittelbare Beeinflussung des Codebeispiels, was ich mir heute morgen angesehen hatte. So wie der Code jetzt ist, ist mir das aber auch viel lieber. Danke für Deinen Nachtrag.
Zuletzt geändert von Re57 am 11.04.2020 21:44, insgesamt 1-mal geändert.
Antworten