Seite 1 von 2
[PB 5.11] KeyboardReleased geschachtelt
Verfasst: 14.07.2013 19:58
von Chimorin
Halli Hallo,
ich weiß nicht recht, ob dies hier ein Bug ist, könnte ja auch ein "Feature" sein oder es geht eben von der Logik her nur so.
Drückt man Escape, bekommt man 2 Meldungen, das Programm beendet sich. Bei KeyboardPushed() klappt die Verschachtelung also.
Rufe ich aber einmal #PB_Any mit KeyboardReleased() ab, wird das A-Event verworfen, bzw. "vergessen" im Sinne von erledigt markiert?!
Würde gerne von euch noch Feedback hören, bevor ich das ins englische Forum werfe
Code: Alles auswählen
EnableExplicit
#Window = 1
InitKeyboard()
InitSprite()
OpenWindow(#Window, 0, 0, 1, 1, "")
OpenWindowedScreen(WindowID(#Window), 0, 0, 1, 1)
Repeat
ExamineKeyboard()
If KeyboardPushed(#PB_Any)
Debug "Pushed"
If KeyboardPushed(#PB_Key_Escape)
Debug "Pushed here, too."
End
EndIf
EndIf
If KeyboardReleased(#PB_Any)
Debug "Released"
If KeyboardReleased(#PB_Key_A)
Debug "But not here released."
End
EndIf
EndIf
ForEver
Gruß,
Banane
Re: [PB 5.11] KeyboardReleased geschachtelt
Verfasst: 18.08.2013 14:14
von Regenduft
Nachtrag: Du hast
#PB_Key_All mit
#PB_Any verwechselt! Auch wenn die Konstanten den selben Wert haben: "press any key" <> "press all keys"
Du solltest Dir vielleicht die PB-Hilfe erst nochmal durchlesen.

Vielleicht kann ein kleines Pseudo-Signaldiagramm als Starthilfe dienen:
Code: Alles auswählen
== KeyboardPushed =====
#True _____ _____
| | | |
#False _____| |_____| |_______
. . . .
. . . .
. . . .
. . . .
. . . .
== Zustand der Taste == . . . .
. . . .
betätigt ._____. ._____.
| | | |
nicht betätigt _____| |_____| |_______
. .
. .
. .
. .
. .
== KeyboardReleased === . .
. .
#True ._ ._
| | | |
#False ___________| |_________| |_____
Re: [PB 5.11] KeyboardReleased geschachtelt
Verfasst: 19.08.2013 10:10
von Chimorin
#PB_Any und #PB_Key_All macht hier keinen Unterschied, aber ja danke, da gehört eigentlich Letzteres hin.
Jup, und was soll mir dein schönes Diagramm sagen? Ich sehe immer noch das Problem, dass PB das Event nach einmaligem Aufruf vergisst (Ich rede von einem Zyklus, nicht von mehreren).
Re: [PB 5.11] KeyboardReleased geschachtelt
Verfasst: 19.08.2013 10:36
von STARGÅTE
Ich würde (wie viele andere auch) einfach selbst eine Prozedur schreiben, die deiner Verwendung gerecht wird.
KeyboardPushed() funktioniert ja "wie gewollt".
Mit einem Array kannst du nun zB den Status der Tasten speichern, sodass du genau prüfen kannst, wann eine Taste wieder losgelassen wurde.
Den Status kannst du dann wann du willst zurücksetzen, falls du deine Funktion mehrmals nutzen willst.
Ansonsten KeyboardReleased() nur einmal verwenden, und den Status selber speichern.
Re: [PB 5.11] KeyboardReleased geschachtelt
Verfasst: 19.08.2013 14:48
von Chimorin
Das wäre natürlich eine Lösung, aber das ist doch offensichtlich ein BUG und ich bin doch hier in der BUGsektion... Ich möchte nur mir offensichtliche Fehler melden

Re: [PB 5.11] KeyboardReleased geschachtelt
Verfasst: 19.08.2013 16:30
von Regenduft
Ach! Entschuldigung, da hatte ich Dich total falsch verstanden und mich von der Verschachtlung in die Irre leiten lassen (und in die Anfängerecke sortiert).
Du hast meiner Meinung nach Recht, das ist ein Bug. Hatte das früher so verwendet.
Code: Alles auswählen
ExamineKeyboard()
If KeyboardReleased(#PB_Key_A)
Debug "A1 OK"
EndIf
If KeyboardReleased(#PB_Key_A)
Debug "A2 FEHLT"
EndIf
Re: [PB 5.11] KeyboardReleased geschachtelt
Verfasst: 19.08.2013 20:21
von NicTheQuick
Interessant.
Ich habe mal kurz einen ungetesteten Code zusammengeschustert, der das Problem beheben sollte, wenn man ihn an den Anfang seines Codes setzt.
Code: Alles auswählen
Procedure.i _KeyboardReleased(KeyID.i = -2)
Static Dim released.i(255)
Protected i.i, result.i = 0
Select KeyID
Case -2:
For i = 0 To 255
released(i) = 0
Next
Case #PB_Key_All
For i = 0 To 255
released(i) | KeyboardReleased(i)
result | released(i)
Next
Default
released(KeyID) | KeyboardReleased(KeyID)
result = released(KeyID)
EndSelect
ProcedureReturn result
EndProcedure
Procedure _ExamineKeyboard()
ExamineKeyboard()
_KeyboardReleased(-2)
EndProcedure
Macro KeyboardReleased(KeyID)
_KeyboardReleased(KeyID)
EndMacro
Macro ExamineKeyboard()
_ExamineKeyboard()
EndMacro
Der Code ist übrigens deswegen ungetestet, weil ich von der OpenGL-Unterstützung von Purebasic unter Linux nur schlechte Erfahrung habe und das System bisher fast immer unbenutzbar wurde oder abgestürzt ist. Seitdem führe ich sowas hier nicht mehr aus. ^^
Edit: Fehler korrigiert
Re: [PB 5.11] KeyboardReleased geschachtelt
Verfasst: 23.08.2013 08:40
von Chimorin
Nope, bei mir ändert sich da nix.
Woher weiß eig PB, welche Funktion, Makro, Befehl,... ich haben will? Du machst ein Makro, welches doch genau so wie ein Befehl lautet. Woher will PB jetzt wissen, dass ich das Makro meine und nicht den Befehl?! Auch mit den Funktionen, die vorne dran ein _ haben, keine Änderung.
Re: [PB 5.11] KeyboardReleased geschachtelt
Verfasst: 23.08.2013 08:59
von Regenduft
Das Makro wird zuerst aufgelöst. Das bedeutet, wenn ein Makro wie eine PB-Funktion heißt, dann ist diese Funktion nicht mehr erreichbar.
Re: [PB 5.11] KeyboardReleased geschachtelt
Verfasst: 23.08.2013 12:30
von NicTheQuick
Bananenfreak hat geschrieben:Nope, bei mir ändert sich da nix.
Woher weiß eig PB, welche Funktion, Makro, Befehl,... ich haben will? Du machst ein Makro, welches doch genau so wie ein Befehl lautet. Woher will PB jetzt wissen, dass ich das Makro meine und nicht den Befehl?! Auch mit den Funktionen, die vorne dran ein _ haben, keine Änderung.
Mein Fehler. Ich hatte etwas zu viel Copy-Paste gemacht.

Ich habe meinen Code korrigiert. Ich nehme jetzt sollte er wie gewünscht funktionieren.