Alternative zu KeyDown und KeyUp
-
Hallo liebe Com,
ich suche schon länger nach einer Möglichkeit, KeyDown und KeyUp zu ersetzen, denn ich entwickle im Moment aus Spaß ein kleines 3d-Spiel, bei dem Maus und Tastatur verwendet werden.
Mein Problem ist folgendes:Wenn ich einen Tastendruck zb.: "w" drücke, gibt es einen kleinen delay von ka ich mein mal 100 ms oder so, bis er anfängt nach "vorn" zu gehn.
Wenn ich die Taste los lasse, gibt es wieder einen delay, bis er wieder stehen bleibt.
Wie kann ich dieses Problem lösen ?
Hier ein Codeschnipsel von der betroffenen Stelle:
unsigned char OpenGL_Init::key_pressed(){ if( PeekMessage( &msg, NULL, NULL, NULL, PM_REMOVE ) ){ if( msg.message == WM_QUIT ){ return true; } if( msg.message == WM_KEYDOWN ){ bKeys[msg.wParam] = true; // keyarray von 255 } if(msg.message == WM_KEYUP ){ bKeys[msg.wParam] = false; } TranslateMessage( &msg ); DispatchMessage( &msg ); } return false; }
-
Warum benutzt du kein switch statt der ifs?
Warum benutzt du ein Array statt GetKeyState zu verwenden?
Wenn du GetAsyncKeyState verwendest ist die Verzögerung < 1 Frame groß, wenn du bei jedem Frame die Tastatur abfragst, dafür können aber Tastendrücke verloren gehen. Bei GetKeyState geht nichts verloren, dafür kann es eine Verzögerung geben, wenn Nachrichten schneller reinkommen als du sie abarbeiten kannst, was aber nicht vorkommen sollte.
-
und wie wäre das dann zu realisieren ?
-
Versuchs mal so:
bool bkey[255]; for(int i=0;i<255;i++) { if(GetAsyncKeyState(i & 0x8000)) bkey[i] = true; else bkey[i] = false; }
Wo lernt man Spieleprogrammierung, kannst du mir ein gutes Tutorial oder Buch empfehlen?
-
ehauser schrieb:
Wo lernt man Spieleprogrammierung, kannst du mir ein gutes Tutorial oder Buch empfehlen?
Kann er wohl eher nicht, wenn er eine Klasse baut die OpenGL_Init heißt, eine Methode key_pressed ohne Parameter mit unsigned char als Rückgabetyp hat, bei der er dann noch true oder false zurückgibt. Noch mehr Stilfehler in so wenig Code sind schwer möglich.
@lilbeat
Wie wäre es mit Nachrichten im Callback verarbeiten? Da hab' ich bei mir genau 0 Verzögerung. Die GetAsyncKeyState Methode gefällt mir auch nicht besonders. Aber überhaupt, wie hast du dir das gedacht? Da können doch auch ganz andere Nachrichten kommen. Du solltest dein gesamtes Design noch mal überdenken, das macht so alles keinen Sinn.
-
nicht gleich so negativ o.O
so, wie ich es habe, war es mir in dem moment gerade recht
-
Lass dieses bkey array weg. Windows hat bereits dieses Array und mit GetKeyState/GetAsyncKeyState greifst du auf die Elemente zu. Dieses Array in jedem Frame zu kopieren bringt dir keinerlei Vorteile, es macht nur das Spiel langsamer.
Ich nehme an du hast irgendwo sowas wieif (bkey['w']) goForward(); else if (bkey['a']) goLeft(); ...
Das ersetzt du durch
if (GetAsyncKeyState('w')) goForward(); else if (GetAsyncKeyState('a')) goLeft(); ...
Für Bewegungstasten ist das sinnvoll, da du da sofort reagieren willst. Angenommen die Leertaste springt oder aktiviert irgendwas, dann willst du auf die WM_KEYDOWN reagieren, damit das Springen auch funktioniert, wenn die Leertaste gedrückt und wieder losgelassen wird, bevor dein Spiel das abfragen kann.
-
ehauser schrieb:
Versuchs mal so:
bool bkey[255]; for(int i=0;i<255;i++) { if(GetAsyncKeyState(i & 0x8000)) bkey[i] = true; else bkey[i] = false; }
Wo lernt man Spieleprogrammierung, kannst du mir ein gutes Tutorial oder Buch empfehlen?
Könnte man nicht auch einfach GetKeyboardState() in deinem Fall verwenden?
Natürlich nur, wenn man alle abfragen will...^^ Ansonsten wie es mit Performance aussieht, weiß ich nicht, deshalb die Frage.