2012-11-29 6 views
5

Ich mache ein kleines Spiel mit Sprites, wo sich der Charakter bewegt, abhängig von der gedrückten Taste (Pfeile). Ich habe bemerkt, dass die .KeyDown() Methode aufgerufen wird, bis jeder Schlüssel freigegeben ist.Einfaches aber kniffliges Problem mit KeyDown() in C#

z.B. Wenn der Benutzer den Pfeil nach oben drückt, wird weiterhin die Methode .KeyDown() aufgerufen. Wenn der Abwärtspfeil gedrückt wird und der Pfeil nach oben gedrückt wird, empfängt der KeyEventArgs jetzt die Eingabe von dem Abwärtspfeil. Schließlich, wenn der Pfeil nach oben losgelassen wird, hört das .KeyDown() Ereignis auf, genannt zu werden, obwohl der Abwärtspfeil noch gedrückt wird.

Wie kann ich die Eingabe "zurücksetzen" und den Compiler anweisen, weiterhin .KeyDown() aufzurufen?

+0

Haben Sie versucht zu protokollieren, welcher Schlüssel für das KeyDown verantwortlich ist, damit Sie überprüfen können, wann Sie eine Schlüsselfreigabe erhalten? Auf diese Weise können Sie so weitermachen, als ob der Schlüssel immer noch gedrückt ist, bis der Schlüssel, an dem Sie interessiert sind, derjenige ist, der die Freigabe ausgelöst hat. – RonaldBarzell

+0

Wenn sich Ihre Spiellogik in einer Echtzeit-Ereignisschleife befindet, können Sie sie einfach aufrufen: 'Form_KeyDown (null, e)' –

Antwort

3

Eine sehr gute Frage- Ich glaube nicht, dass es eine Möglichkeit gibt, dieses Standardverhalten außer Kraft zu setzen, aber es wäre sicherlich möglich, diesen Effekt zu vermeiden, indem man die Tastendrücke selbst verfolgt, dh wenn .KeyDown() aufgerufen wird der Schlüssel zu einer Art von Struktur, die es verfolgt - und dann, wenn .KeyUp() aufgerufen wird, entfernen Sie den Schlüssel aus dieser Struktur.

Dann überprüfen Sie einfach diese Struktur für die aktuell gedrückten Tasten, und Basis Ihre Bewegung von , die, nicht was .KeyDown() Ihnen sagt.

+0

Den Keydowns und Keypads zu folgen ist der einzige Weg, den ich gefunden habe. Ich habe ein Array mit 255 Ints, wobei jedes Element einem Schlüsselcode entspricht. Jedes Mal durch die Schleife setze ich sie auf 0 (nicht gedrückt), 1 (neu gedrückt) oder 2 (immer noch gedrückt). Ich habe das getan, weil einige Funktionalität ständig gewünscht wird (wie die Cursor-Tasten, um sich zu bewegen) und einige, die Sie nur für den anfänglichen Tastendruck interessieren (wie 'M', um HUD zu schalten). – kbelder

0

Sie können versuchen, KeyUp zu verwenden, um zu erkennen, wann der Schlüssel losgelassen wird. Dann können Sie davon ausgehen, dass die Taste noch gedrückt wird, bis KeyUp aufgerufen wird.