Input-Probleme nach Systemdialog (gelöst)

Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Neue Antwort erstellen

BlitzMoritz

Betreff: Input-Probleme nach Systemdialog (gelöst)

BeitragMi, Aug 03, 2011 17:45
Antworten mit Zitat
Benutzer-Profile anzeigen
Wenn man Systemdialoge nutzt, reagiert MouseHit danach genau einmal nicht. Wie man im folgenden Code testen kann, verhält es sich nämlich so:
Klickt man mit der Maus, öffnet sich der Dialog, dort wählt man (ebenfalls) mit der Maus eine Taste aus, der Dialog schließt sich wieder. Wenn man dann wieder die Maustaste bedient, wird nichts registriert, erst beim zweiten Mal. Meine Frage: Woher kommt dieses Verhalten und wie kann man es austricksen?
Wenn man alles mit der Tastatur macht, also mit Enter den Dialog startet, mit Enter bestätigt und danach mit dem nächsten Enter wieder startet, gibt es gar kein Problem bzw. keine Aussetzer.
Wenn man aber drittens den Dialog mit Escape abbricht, reagiert prompt das folgende KeyHit(KEY_RETURN) genau einmal nicht, sehr mysteriös ...

BlitzMax: [AUSKLAPPEN]
'Nur bei Linux muss man dies importieren, damit die Dialoge nicht nur in einer vom späteren Spieler zumeist
'gar nicht geöffneten Konsole, sondern tatsächlich im eigenen Dialogfenster erscheinen - blöde Sache, wenn man's vergisst.
?Linux
Import maxgui.drivers
?
Graphics 400,300
Repeat
Cls
Local MausHit% = MouseHit(1)
Local Enter% = KeyHit(KEY_RETURN)
If MausHit = True Or Enter = True Then
Local Antwort% = Confirm("Soll die Hintergrundfarbe wechseln?")
If Antwort = True Then SetClsColor Rand(0,255), Rand(0,255), Rand(0,255)
FlushMouse() '<= muss eingefügt werden!
FlushKeys() '<= muss eingefügt werden!
End If
Flip
Until AppTerminate() Or KeyHit(KEY_ESCAPE)

Edit: Mist! Evil or Very Mad Immer muss ich's erst losschicken, bevor ich selbst auf die simple Lösung stoße:
Einfach ein FlushMouse() und FlushKeys() NACH dem erfolgten Systemdialog einfügen (wie oben), dann funzt alles wie gewünscht ... grrr ... der Thread kann evtl. gelöscht werden.
  • Zuletzt bearbeitet von BlitzMoritz am Mi, Aug 03, 2011 18:10, insgesamt 8-mal bearbeitet

Pebender

BeitragMi, Aug 03, 2011 17:58
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi,

also eine Antwort kann ich dir leider nicht geben, aber an dem selben Problem arbeite ich auch schon seit Tagen.
Man kann über einen Dialog eine Bilddatei laden, diese wird dann angezeigt, lädest du anschließend ein anderes Bild, wird das auch erst beim zweitenmal klicken sichtbar..... sonderbar.

Ich dachte es liegt an meinen minderen Fähigkeiten beim programmieren.

vielleicht kann ja ein Profi helfen .

mfg Peter
BMax & MaxGUI
 

PhillipK

BeitragMi, Aug 03, 2011 18:17
Antworten mit Zitat
Benutzer-Profile anzeigen
Hey! =)

Ich fand dieses verhalten grade beim austesten auch sehr seltsam.

Da habe ich gleich ein wenig rumgespielt! Very Happy

Anscheinend wird, nach dem Dialog, irgendwas falsch geleert. Zumindest erkläre ich mir das so.
Mein erster ansatz das zu umgehen, hat prompt geklapt: FlushMouse()

Vielleicht nicht grade schön, aber für mich nicht grade störend - ich lese generell einmal pro Frame eine Globale (oder locale) ein, welche mausanschläge realisiert.

Hier mal meine umgehung (haha, guter witz. Eine vollkommen dämliche funktion, aber naja!) - da FlushMouse() immer 0 zu returnen scheint und ich faul bin aber nicht unnötig viele Locals mag...
Ehm ja:

BlitzMax: [AUSKLAPPEN]
'Nur bei Linux muss man dies importieren, damit die Dialoge nicht nur in einer vom späteren Spieler zumeist
'gar nicht geöffneten Konsole, sondern tatsächlich im eigenen Dialogfenster erscheinen - blöde Sache, wenn man's vergisst.
?Linux
Import maxgui.drivers
?
Graphics 400,300
Repeat
Cls
Local MausHit:Int = GetMouseHit(1)

Local Enter:Int = KeyHit(KEY_RETURN)
If MausHit = True Or Enter = True Then
Local Antwort:Int = Confirm("Soll die Hintergrundfarbe wechseln?")

If Antwort = True Then SetClsColor Rand(0,255), Rand(0,255), Rand(0,255)
End If

Flip
Until AppTerminate() Or KeyHit(KEY_ESCAPE)

Function GetMouseHit:Int(taste:Int)
Return MouseHit(taste)+ FlushMouse()
End Function


Ps: Das Return MouseHit(taste) + FlushMouse() wird in der reihenfolge abgearbeitet wie es da steht. FlushMouse gibt immer 0 zurück und so verhindere ich das temporäre speichern von MouseHit() in einer variable.
Sinniger wäre es evtl, eine generelle clear-funktion zu schreiben welche einmal pro frame aufgerufen wird und alles wichtige zurücksetz (so stände in diesem fall wahrscheinlich auch FlushMouse() darin)

Nunja, mein testen hat ausserdem ergeben, das OHNE flushmouse kein moushit realisiert wird.

Midimaster

BeitragMi, Aug 03, 2011 18:38
Antworten mit Zitat
Benutzer-Profile anzeigen
"Wer MaxGui sagt, sollte auch Event() und Canvas sagen!"

Hier mal ein "Minimum"-Programm als Demo für "MaxGui und eigene Grafik"

BlitzMax: [AUSKLAPPEN]
Import MaxGUI.Drivers 
Global Window:TGadget , Canvas:TGadget

FensterErstellen()

CreateTimer 60
While WaitEvent()
Local tmpGadget:TGadget
'Print EventID()
Select EventID()
Case EVENT_TIMERTICK
HauptSchleife
RedrawGadget canvas

Case EVENT_GADGETPAINT
Local Fenster:TGraphics=CanvasGraphics(canvas)
SetGraphics Fenster
SetClsColor 255,255,255
Cls
Flip
Case EVENT_WINDOWCLOSE
ProgrammEnde

Case EVENT_APPTERMINATE
ProgrammEnde

Case EVENT_MENUACTION

Case EVENT_MOUSEDOWN
tmpGadget = TGadget(EventSource())
If tmpGadget=Canvas
Print "maus " + mausx + " " + mausy
EndIf
Case EVENT_MOUSEMOVE
tmpGadget= TGadget(EventSource())
If tmpGadget=Canvas
MausX=EventX()
MausY=EventY()
EndIf
Case EVENT_GADGETACTION
End Select
Wend
ProgrammEnde


Function ProgrammEnde()
End
End Function

Function Hauptschleife()

End Function


Function FensterErstellen()
Local flags%=WINDOW_TITLEBAR | WINDOW_CLIENTCOORDS|WINDOW_CENTER
Window= CreateWindow("Leeres Test Window" , 0 , 0 , 600 , 400 , Null , Flags%)
Canvas=CreateCanvas(5 , 5 , 400, 300 , Window)

End Function

BlitzMoritz

BeitragMi, Aug 03, 2011 21:52
Antworten mit Zitat
Benutzer-Profile anzeigen
@Midi: Ich weiß nicht, was das mit dem Thema zwingend zu tun haben soll.
Weder unter Windows, noch unter OSX muss man das Maxgui-Modul importieren, um jene kleinen Botschafts-Dialoge wie Notify etc. zu nutzen. Dass das oben steht, ist ja nur ausnahmsweise unter Linux so.
Und wenn man da und dort mal ein Notify o.ä. braucht (und wie oben gezeigt mit Flush... ja auch problemlos verwenden kann), ist das doch kein Grund, das ganze "Ungetüm" Maxgui aufzufahren und sich mit Gadgets, Canvas und dem anderen Kram abzugeben.

Midimaster

BeitragMi, Aug 03, 2011 22:33
Antworten mit Zitat
Benutzer-Profile anzeigen
upps...

da hab ich was falsch verstanden, ich dachte der Fehler tritt im Beispiel nur jedesmal auf, wenn die MaxGUI eingebunden wird....


also dann war mein vorheriger Beitrag völlig unnnötig und tatsächlich am Thema vorbei....

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group