Seite 1 von 2
Bedingtes Startdrawing() wird nicht ausgelöst
Verfasst: 11.04.2020 16:19
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.
Re: Bedingtes Startdrawing() wird nicht ausgelöst
Verfasst: 11.04.2020 17:20
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
Re: Bedingtes Startdrawing() wird nicht ausgelöst
Verfasst: 11.04.2020 17:30
von Kiffi
@Kurzer: Falsch abgebogen.
Variablennamen sind in PB zum Glück case insentive.
Der EnableExplicit - Tipp gilt allerdings immer.
Grüße ... Peter
Re: Bedingtes Startdrawing() wird nicht ausgelöst
Verfasst: 11.04.2020 17:56
von Kurzer
Oh danke Kiffi, da war ich in der Tat zu übereifrig.
Re: Bedingtes Startdrawing() wird nicht ausgelöst
Verfasst: 11.04.2020 18:17
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.
Re: Bedingtes Startdrawing() wird nicht ausgelöst
Verfasst: 11.04.2020 18:21
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?
Re: Bedingtes Startdrawing() wird nicht ausgelöst
Verfasst: 11.04.2020 18:59
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
Re: Bedingtes Startdrawing() wird nicht ausgelöst
Verfasst: 11.04.2020 19:13
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.
Re: Bedingtes Startdrawing() wird nicht ausgelöst
Verfasst: 11.04.2020 19:18
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
Re: Bedingtes Startdrawing() wird nicht ausgelöst
Verfasst: 11.04.2020 19:34
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.