PureBoard
http://forums.purebasic.com/german/

Bedingtes Startdrawing() wird nicht ausgelöst
http://forums.purebasic.com/german/viewtopic.php?f=16&t=31957
Seite 1 von 2

Autor:  Re57 [ 11.04.2020 16:19 ]
Betreff des Beitrags:  Bedingtes Startdrawing() wird nicht ausgelöst

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:
#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.

Autor:  Kurzer [ 11.04.2020 17:20 ]
Betreff des Beitrags:  Re: Bedingtes Startdrawing() wird nicht ausgelöst

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

Autor:  Kiffi [ 11.04.2020 17:30 ]
Betreff des Beitrags:  Re: Bedingtes Startdrawing() wird nicht ausgelöst

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

Der EnableExplicit - Tipp gilt allerdings immer.

Grüße ... Peter

Autor:  Kurzer [ 11.04.2020 17:56 ]
Betreff des Beitrags:  Re: Bedingtes Startdrawing() wird nicht ausgelöst

Oh danke Kiffi, da war ich in der Tat zu übereifrig. :shock:

Autor:  GPI [ 11.04.2020 18:17 ]
Betreff des Beitrags:  Re: Bedingtes Startdrawing() wird nicht ausgelöst

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.

Autor:  Kurzer [ 11.04.2020 18:21 ]
Betreff des Beitrags:  Re: Bedingtes Startdrawing() wird nicht ausgelöst

@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:
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?

Autor:  Re57 [ 11.04.2020 18:59 ]
Betreff des Beitrags:  Re: Bedingtes Startdrawing() wird nicht ausgelöst

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:

Autor:  mk-soft [ 11.04.2020 19:13 ]
Betreff des Beitrags:  Re: Bedingtes Startdrawing() wird nicht ausgelöst

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.

Autor:  Kurzer [ 11.04.2020 19:18 ]
Betreff des Beitrags:  Re: Bedingtes Startdrawing() wird nicht ausgelöst

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

Autor:  Re57 [ 11.04.2020 19:34 ]
Betreff des Beitrags:  Re: Bedingtes Startdrawing() wird nicht ausgelöst

@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.

Seite 1 von 2 Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/