KeyHitEx [gelöst]

Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Neue Antwort erstellen

Der Eisvogel

Betreff: KeyHitEx [gelöst]

BeitragFr, Mai 07, 2010 19:22
Antworten mit Zitat
Benutzer-Profile anzeigen
So, ich bin jetzt langsam echt am Rande der Verzweiflung. Ich wollte mit ein Funktion KeyHitEx schreiben, die die einen Snapshot der aktuellen KeyHits macht, damit ich danach darauf zugreifen kann, und nicht jeden einzelnen KeyHit selber speichern muss.
So sieht das ganze aus:
BlitzMax: [AUSKLAPPEN]
SuperStrict

Extern "Win32"
Function GetAsyncKeyState:Int(vKey:Int)
End Extern



Repeat
Delay 10
AsyncRecordKeyHits()
If AsyncKeyHitEx(65) Then Print "A"
If AsyncKeyHitEx(66) Then Print "B"
If AsyncKeyHitEx(67) Then Print "C"
If AsyncKeyHitEx(68) Then Print "D"
If AsyncKeyHitEx(69) Then Print "E"
If AsyncKeyHitEx(65) Then Print "A"
If AsyncKeyHitEx(66) Then Print "B"
If AsyncKeyHitEx(67) Then Print "C"
If AsyncKeyHitEx(68) Then Print "D"
If AsyncKeyHitEx(69) Then Print "E"
Forever



Function AsyncKeyDown:Int(vKey:Int)
If vKey<0 Or vKey>255 Then Return 0
Return GetAsyncKeyState(vKey:Int) Shl 16 Shr 31
End Function

Function AsyncKeyHit:Int(vKey:Int)
Global keystate:Byte[256]
If vKey<0 Or vKey>255 Then Return 0
Local hit:Int=(keystate[vKey]=False And AsyncKeyDown(vKey)=True)
For Local i:Int=0 To 255
keystate[i]=AsyncKeyDown(i)
Next
Return hit
End Function

Global AsyncRKH:Byte[256]
Function AsyncRecordKeyHits()
For Local i:Int=0 To 255
AsyncRKH[i]=AsyncKeyHit(i)
Next
End Function
Function AsyncKeyHitEx:Int(vKey:Int)
If vKey<0 Or vKey>255 Then Return 0
Return AsyncRKH[vKey]
End Function

Function AsyncFlushKeys()
For Local i:Int=0 To 255
GetAsyncKeyState(i)
Next
AsyncKeyHit(0)
End Function


Die Function AsyncKeyDown()/Hit() funktionieren Einwandfrei. Aber AsyncRecordKeyHits() und AsyncKeyHitEx() gehen nicht. Ich dachte eigentlich kann das nicht so schwer sein, aber irgendwie geht das nicht. Ich bin irgendwie grade nicht in der Lage den Fehler zu finden. Eigentlich waren für diese 2 Funktionen 5 min geplant, aber jetzt mache ich die schon seit ner halben Stunde. Ich könnte jetzt fluchen ohne Ende, so sauer bin ich grade auf micht. Fänds echt klasse, wenn mir jemand einen Schups geben könnte. Ich bin echt am Ende. Das muss ja irgendwie gehen.

EDIT: !!!Manno ich könnte mir in den Arsch beißen!!!
Der Fehler lag doch bei AsyncKeyHit(). Dort wurde der Status der Tasten nach jedem Aufruf aktualisiert. Das darf aber nicht sein, es darf nur der Status der grade abgerufen Taste aktialisiert werden.
Es tut mit Leid. Aber ich habe ein einer komplett falschen Stelle im Code geschaut. Sorry.
Hier jetzt einmal der Code wie er richtig funktioniert, falls das irgendwer mal in der Suche finden sollte, kann es es ja benutzen:
BlitzMax: [AUSKLAPPEN]
SuperStrict

Extern "Win32"
Function GetAsyncKeyState:Int(vKey:Int)
End Extern



Repeat
Delay 10
AsyncRecordKeyHits()
If AsyncKeyHitEx(65) Then Print "A"
If AsyncKeyHitEx(66) Then Print "B"
If AsyncKeyHitEx(67) Then Print "C"
If AsyncKeyHitEx(68) Then Print "D"
If AsyncKeyHitEx(69) Then Print "E"
If AsyncKeyHitEx(65) Then Print "A"
If AsyncKeyHitEx(66) Then Print "B"
If AsyncKeyHitEx(67) Then Print "C"
If AsyncKeyHitEx(68) Then Print "D"
If AsyncKeyHitEx(69) Then Print "E"
Forever



Function AsyncKeyDown:Int(vKey:Int)
If vKey<0 Or vKey>255 Then Return 0
Return GetAsyncKeyState(vKey:Int) Shl 16 Shr 31
End Function

Function AsyncKeyHit:Int(vKey:Int)
Global keystate:Byte[256]
If vKey<0 Or vKey>255 Then Return 0
Local hit:Int=(keystate[vKey]=False And AsyncKeyDown(vKey)=True)
keystate[vKey]=AsyncKeyDown(vKey)
Return hit
End Function

Global AsyncRKH:Byte[256]
Function AsyncRecordKeyHits()
For Local i:Int=0 To 255
AsyncRKH[i]=AsyncKeyHit(i)
Next
End Function
Function AsyncKeyHitEx:Int(vKey:Int)
If vKey<0 Or vKey>255 Then Return 0
Return AsyncRKH[vKey]
End Function

Function AsyncFlushKeys()
For Local i:Int=0 To 255
GetAsyncKeyState(i)
AsyncKeyHit(i)
Next
End Function


M traurigen G
Der Eisvogel
Ungarische Notation kann nützlich sein.
BlitzMax ; Blitz3D
Win 7 Pro 64 Bit ; Intel Core i7-860 ; 8 GB Ram ; ATI HD 5750 1 GB
Projekte: Window-Crasher
Ich liebe es mit der WinAPI zu spielen.

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group