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" :mrgreen:

Du solltest Dir vielleicht die PB-Hilfe erst nochmal durchlesen. :wink:
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 :D

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. :D
Ich habe meinen Code korrigiert. Ich nehme jetzt sollte er wie gewünscht funktionieren.