[PB 5.11] KeyboardReleased geschachtelt

Hier werden, insbesondere in den Beta-Phasen, Bugmeldungen gepostet. Das offizielle BugForum ist allerdings hier.
Benutzeravatar
Chimorin
Beiträge: 451
Registriert: 30.01.2013 16:11
Computerausstattung: MSI GTX 660 OC mit TwinFrozr III
6Gb DDR 3 RAM
AMD Phenom II X4 B55 @ 3,6GHz
Windows 7 Home Premium 64-bit

[PB 5.11] KeyboardReleased geschachtelt

Beitrag 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
Bild

- formerly known as Bananenfreak -
Benutzeravatar
Regenduft
Beiträge: 574
Registriert: 25.03.2008 15:07
Wohnort: THE LÄÄÄND!

Re: [PB 5.11] KeyboardReleased geschachtelt

Beitrag 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 ___________| |_________| |_____
PureBasic 5.73 LTE x86/x64 | Windows 7 (x64)
Benutzeravatar
Chimorin
Beiträge: 451
Registriert: 30.01.2013 16:11
Computerausstattung: MSI GTX 660 OC mit TwinFrozr III
6Gb DDR 3 RAM
AMD Phenom II X4 B55 @ 3,6GHz
Windows 7 Home Premium 64-bit

Re: [PB 5.11] KeyboardReleased geschachtelt

Beitrag 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).
Bild

- formerly known as Bananenfreak -
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: [PB 5.11] KeyboardReleased geschachtelt

Beitrag 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.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
Chimorin
Beiträge: 451
Registriert: 30.01.2013 16:11
Computerausstattung: MSI GTX 660 OC mit TwinFrozr III
6Gb DDR 3 RAM
AMD Phenom II X4 B55 @ 3,6GHz
Windows 7 Home Premium 64-bit

Re: [PB 5.11] KeyboardReleased geschachtelt

Beitrag 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
Bild

- formerly known as Bananenfreak -
Benutzeravatar
Regenduft
Beiträge: 574
Registriert: 25.03.2008 15:07
Wohnort: THE LÄÄÄND!

Re: [PB 5.11] KeyboardReleased geschachtelt

Beitrag 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
Zuletzt geändert von Regenduft am 19.08.2013 20:53, insgesamt 2-mal geändert.
PureBasic 5.73 LTE x86/x64 | Windows 7 (x64)
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: [PB 5.11] KeyboardReleased geschachtelt

Beitrag 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
Benutzeravatar
Chimorin
Beiträge: 451
Registriert: 30.01.2013 16:11
Computerausstattung: MSI GTX 660 OC mit TwinFrozr III
6Gb DDR 3 RAM
AMD Phenom II X4 B55 @ 3,6GHz
Windows 7 Home Premium 64-bit

Re: [PB 5.11] KeyboardReleased geschachtelt

Beitrag 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.
Bild

- formerly known as Bananenfreak -
Benutzeravatar
Regenduft
Beiträge: 574
Registriert: 25.03.2008 15:07
Wohnort: THE LÄÄÄND!

Re: [PB 5.11] KeyboardReleased geschachtelt

Beitrag 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.
PureBasic 5.73 LTE x86/x64 | Windows 7 (x64)
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: [PB 5.11] KeyboardReleased geschachtelt

Beitrag 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.
Antworten