Problem mit Mausbewegung nach einem Klick auf Gadget
Verfasst: 21.11.2019 11:07
Hallo miteinander,
ich bin dabei, ein Memory-Spiel zu programmieren. Das funktioniert soweit auch ganz gut.
Allerdings gibt es ein Problem, das ich bisher nicht lösen kann.
Zum meinem Bedien-Prinzip:
Ich klicke die erste Spielkarte an, und sie zeigt ein Bild.
Dann klicke ich die zweite Spielkarte an, die dann ebenfalls ein Bild zeigt.
Mit dem dritten Klick irgendwo ins Fenster erfolgt dann erst die Reaktion, was ich genauso möchte (keine Timer-Lösung). Entweder werden bei verschiedenen Karten die Karten dann wieder zugedeckt, oder bei gleichen werden sie entfernt.
Soweit funktioniert das Ganze.
Das Problem ist jetzt folgendes:
Jede Spielkarte ist bei mir ein ImageGadget.
Und wenn ich beim Klick auf die zweite Spielkarte nur ein wenig die Maus bewege, dann wertet das die WaitWindowEvent()-Abfrage, die dahintersteckt, als einen weiteren Klick auf das ImageGadget, was zur Folge hat, dass sofort beide Karten entweder entfernt oder wieder zugedeckt werden, sodass man sie sich gar nicht mehr anschauen kann. Und diese Mausbewegung lässt sich in der Spielpraxis grundsätzlich nicht vermeiden, sodass dieser Fall relativ häufig vorkommt.
Ich hab das jetzt so lösen wollen, dass das Programm darauf wartet, dass die linke Maustaste wieder losgelassen wird und erst dann das Programm wieder weiterläuft, und zwar damit
While GetAsyncKeyState_(#VK_MBUTTON)
Wend
Meines Wissens nach wird damit die linke Maustaste direkt abgefragt, aber das stimmt so vielleicht auch gar nicht. Jedenfalls funktioniert es nicht. Es wird nicht gewartet. Warum auch immer.
Mit der gleichen Idee hatte ich es auch mit der MouseButton()-Abfrage versucht. Aber da bin ich auch nicht zurecht gekommen. Irgendwelche MouseInit()- undWindow- und Screen-Geschichten, die hier nötig waren, haben mich überfordert und hätten möglicherweise auch nicht zum Ziel geführt.
Dann hab ich gehofft, dass bei der WindowsEvent-Abfrage doch irgendwo in den Events eine Unterscheidung möglich wird, ob die Maus nur in das Gadget klickt, oder nach dem Klick noch bewegt wird, aber da hab ich keine Möglichkeit gesehen.
Ein Klick ins Gagdet erzeugt ein #PB_Event_Gadget, und wenn man die Maus danach bewegt, ohne die Maustaste loszulassen, wird zusätzlich gleich nochmal ein #PB_Event_Gadget erzeugt, ohne das ich das verhindern kann.
Ich muss dazu sagen, ich programmiere sehr selten und muss mir dann alles nötige mühsam erarbeiten.
Deshalb hab ich meine Frage ins Anfänger-Forum gestellt. Aber auch, weil vermutlich meine Frage eher die Grundlagen betrifft. Ich hoffe, das ist ok.
Das ganze Spiel kann ich hier nicht hochladen, da ich einige Inhalte verwende, für die ich keine Rechte besitze (Bild und Ton), und ich das Spiel deshalb nur zu meinem Privatvergnügen nutzen kann - aber das sollte auch nicht nötig sein.
Habt Ihr eine Idee, was ich tun kann?
Würd mich freuen.
Gruß
OlderCoder
ich bin dabei, ein Memory-Spiel zu programmieren. Das funktioniert soweit auch ganz gut.
Allerdings gibt es ein Problem, das ich bisher nicht lösen kann.
Zum meinem Bedien-Prinzip:
Ich klicke die erste Spielkarte an, und sie zeigt ein Bild.
Dann klicke ich die zweite Spielkarte an, die dann ebenfalls ein Bild zeigt.
Mit dem dritten Klick irgendwo ins Fenster erfolgt dann erst die Reaktion, was ich genauso möchte (keine Timer-Lösung). Entweder werden bei verschiedenen Karten die Karten dann wieder zugedeckt, oder bei gleichen werden sie entfernt.
Soweit funktioniert das Ganze.
Das Problem ist jetzt folgendes:
Jede Spielkarte ist bei mir ein ImageGadget.
Und wenn ich beim Klick auf die zweite Spielkarte nur ein wenig die Maus bewege, dann wertet das die WaitWindowEvent()-Abfrage, die dahintersteckt, als einen weiteren Klick auf das ImageGadget, was zur Folge hat, dass sofort beide Karten entweder entfernt oder wieder zugedeckt werden, sodass man sie sich gar nicht mehr anschauen kann. Und diese Mausbewegung lässt sich in der Spielpraxis grundsätzlich nicht vermeiden, sodass dieser Fall relativ häufig vorkommt.
Ich hab das jetzt so lösen wollen, dass das Programm darauf wartet, dass die linke Maustaste wieder losgelassen wird und erst dann das Programm wieder weiterläuft, und zwar damit
While GetAsyncKeyState_(#VK_MBUTTON)
Wend
Meines Wissens nach wird damit die linke Maustaste direkt abgefragt, aber das stimmt so vielleicht auch gar nicht. Jedenfalls funktioniert es nicht. Es wird nicht gewartet. Warum auch immer.
Mit der gleichen Idee hatte ich es auch mit der MouseButton()-Abfrage versucht. Aber da bin ich auch nicht zurecht gekommen. Irgendwelche MouseInit()- undWindow- und Screen-Geschichten, die hier nötig waren, haben mich überfordert und hätten möglicherweise auch nicht zum Ziel geführt.
Dann hab ich gehofft, dass bei der WindowsEvent-Abfrage doch irgendwo in den Events eine Unterscheidung möglich wird, ob die Maus nur in das Gadget klickt, oder nach dem Klick noch bewegt wird, aber da hab ich keine Möglichkeit gesehen.
Ein Klick ins Gagdet erzeugt ein #PB_Event_Gadget, und wenn man die Maus danach bewegt, ohne die Maustaste loszulassen, wird zusätzlich gleich nochmal ein #PB_Event_Gadget erzeugt, ohne das ich das verhindern kann.
Ich muss dazu sagen, ich programmiere sehr selten und muss mir dann alles nötige mühsam erarbeiten.
Deshalb hab ich meine Frage ins Anfänger-Forum gestellt. Aber auch, weil vermutlich meine Frage eher die Grundlagen betrifft. Ich hoffe, das ist ok.
Das ganze Spiel kann ich hier nicht hochladen, da ich einige Inhalte verwende, für die ich keine Rechte besitze (Bild und Ton), und ich das Spiel deshalb nur zu meinem Privatvergnügen nutzen kann - aber das sollte auch nicht nötig sein.
Habt Ihr eine Idee, was ich tun kann?
Würd mich freuen.
Gruß
OlderCoder