2015-08-23 8 views
5

Also für ein Spiel, das ich arbeite, habe ich eine Reihe von verschiedenen Tasten, die verschiedene Dinge tun (zum Beispiel w-Taste lässt den Spieler nachschlagen und die e-Taste lässt das Zeichen richtig aussehen).Wie kann ich 2 separate Tastenbetätigungen als eine Taste erkennen?

Ich frage mich, gibt es eine Möglichkeit, die W + die D-Taste machen den Spieler richtig aussehen, obwohl diese Schlüssel bereits verwendet werden.

private void FrmGM_KeyDown(object sender, KeyEventArgs e) 
    {    
     if (e.KeyCode == Keys.W) 
     { 
      picplayer.BackgroundImage = ((System.Drawing.Image)(Properties.Resources.IPT_game_player1)); 
      bulletnumb = 1; 
     } 

     if (e.KeyCode == Keys.E) 
     { 
      picplayer.BackgroundImage = ((System.Drawing.Image)(Properties.Resources.IPT_game_player2)); 
      bulletnumb = 2; 
     } 

     if (e.KeyCode == Keys.D) 
     { 
      picplayer.BackgroundImage = ((System.Drawing.Image)(Properties.Resources.IPT_game_player3)); 
      bulletnumb = 3; 
     } 

     if (e.KeyCode == Keys.C) 
     { 
      picplayer.BackgroundImage = ((System.Drawing.Image)(Properties.Resources.IPT_game_player4)); 
      bulletnumb = 4; 
     } 

     if (e.KeyCode == Keys.X) 
     { 
      picplayer.BackgroundImage = ((System.Drawing.Image)(Properties.Resources.IPT_game_player5)); 
      bulletnumb = 5; 
     } 

     if (e.KeyCode == Keys.Z) 
     { 
      picplayer.BackgroundImage = ((System.Drawing.Image)(Properties.Resources.IPT_game_player6)); 
      bulletnumb = 6; 
     } 

     if (e.KeyCode == Keys.A) 
     { 
      picplayer.BackgroundImage = ((System.Drawing.Image)(Properties.Resources.IPT_game_player7)); 
      bulletnumb = 7; 
     } 

     if (e.KeyCode == Keys.Q) 
     { 
      picplayer.BackgroundImage = ((System.Drawing.Image)(Properties.Resources.IPT_game_player8)); 
      bulletnumb = 8; 
     } 

Dies ist der Code für meinen Schlüssel drückt

+0

Die Antwort ist unklar. Normalerweise sind Sie derjenige, der programmiert, was die Schlüssel tun sollen. Es könnte hilfreich sein, uns etwas Code zu zeigen. – PhilMasterG

Antwort

3

Die erste Zeile des Anstoßes für diese Art der Sache nur um sicher zu machen ist, dass jede Taste gleichzeitig aktiviert werden kann, und dass die Kombination der Wirkungen von Jeder Schlüssel hat das gewünschte Ergebnis. Ihr Code wird wartungsfreundlicher und einfacher zu schreiben sein, wenn Sie diesem Ansatz folgen, anstatt zu versuchen, die Eingabe des Kombinationsschlüssels zu spezialisieren.

Zum Beispiel können Sie eine Reihe von Flags haben, die den aktuellen Schlüsselstatus darstellen, und dann bei der Rahmenaktualisierung Ihres Spiels diese Flags prüfen und den Zeichenstatus auf die richtige Einstellung setzen (dh statt bestimmte Bilder in der Key-Handling selbst, wie Sie es jetzt tun).

So könnte man Fahnen haben wie:

bool lookUp, lookRight, lookDown, lookLeft; 

Dann Schlüssel-down für W würde stellen Sie die lookUp Flagge, während Schlüssel-up für den gleichen Schlüssel, die die Flagge löschen würde. Ähnlich z.B. für D, für die lookRight Flagge.

Dann auf Ihrem Spiel Rahmenupdate, überprüfen Sie die Flags. Wenn lookUp und lookRight beide gesetzt sind, verwenden Sie die Grafik "Nachschlagen und rechts". Wenn nur das eine oder das andere Flag gesetzt ist, verwenden Sie die einfache "Nachschlagen" - oder "Nach rechts" -Grafik. Ebenso für andere Schlüssel und deren Kombinationen. Sie könnten sogar lookUp und lookDown oder lookLeft und lookRight auflösen, wie auch immer die Standardgrafik aussehen würde (d. H. Als ob der Benutzer keine Taste gedrückt hätte).


Beachten Sie, wenn Sie bereit sind, p verwenden/aufrufen, können Sie die GetAsyncKeyState() Funktion nutzen zu können, und nicht einmal mit dem Schlüssel-Down-Ereignis stören. Überprüfe einfach den Schlüsselstatus vor jedem Frame-Update für das Spiel und aktualisiere die Visuals entsprechend dem aktuellen Tastaturstatus. Auf diese Weise lassen Sie Windows die gesamte Statusverfolgung durchführen und Sie verschwenden keine Zeit, um den Schlüsselstatus zu verfolgen, der keine Rolle spielt (z. B. wenn der Benutzer mehrere Änderungen am Schlüsselstatus zwischen Frames verursacht).


Das heißt, wenn Sie nicht/nicht eine der oben genannten tun, dann ja ... alles, was Sie tun müssen, um Prüfung für die Kombination ist zunächst (dh Sie den Schlüssel-down für beide bekam , ohne eine Taste für die anfänglich gedrückte Taste der Kombination).

Beachten Sie, dass Sie bei dieser Vorgehensweise immer noch den Effekt für die erste gedrückte Taste übernehmen und dann zum Kombinationseffekt wechseln müssen.

4

Speichern Sie Buchstaben in einem Satz, wenn die KeyDown Ereignisse ankommen, und entfernen Sie sie in der KeyUp Ereignishandler.Auf diese Weise Ihre KeyDown wäre in der Lage zu „sehen“, wenn der „Begleiter Taste“ gedrückt wurde:

private readonly ISet<char> keysCurrentlyDown = new HashSet<char>(); 

private void FrmGM_KeyDown(object sender, KeyEventArgs e) {    
    if (e.KeyCode == Keys.W) 
    { 
     if (keysCurrentlyDown.Contains('D')) { 
      // Call some method to handle W+D 
     } else { 
      ... 
     } 
     keysCurrentlyDown.Add('W'); 
    } else if (e.KeyCode == Keys.D) 
    { 
     if (keysCurrentlyDown.Contains('W')) { 
      // Call some method to handle W+D 
     } else { 
      ... 
     } 
     keysCurrentlyDown.Add('D'); 
    } 
    ... 
} 
private void FrmGM_KeyUp(object sender, KeyEventArgs e) {    
    if (e.KeyCode == Keys.W) { 
     keysCurrentlyDown.Remove('W'); 
    } else if (e.KeyCode == Keys.D) { 
     keysCurrentlyDown.Remove('D'); 
    } ... 
} 

} 
+0

Was ist das Set 'Sie dort verwenden? Beachten Sie, dass Sie, wenn Sie die visuelle Statusverwaltung in der Tastatureingabeverwaltung beibehalten, den Duplizierungsaufwand reduzieren (z. B. haben Sie zwei verschiedene Stellen, die Sie behandeln müssen, "Tun Sie etwas auf W + D"). –

+0

@PeterDuniho Das ist der 'ISet ', danke. Was W + D gegen D + W angeht, hätte ich etwas ausführlicher kommentieren müssen: Was auch immer die Aktion auf W + D sein sollte, sollte der Code in einer Methode platziert werden, um Code zu duplizieren. – dasblinkenlight

+0

Sie überprüfen die W + D-Bedingung immer noch an zwei verschiedenen Stellen (wenn auch in unterschiedlicher Reihenfolge) und natürlich, während die Implementierung in einer einzigen Methode gekapselt sein kann, müssen Sie sie immer noch von zwei verschiedenen Stellen aus aufrufen. Es wäre besser, einfach den Zustand der Tastatur zu überprüfen, sobald alle Eingaben verarbeitet wurden, und kurz vor dem Update für den aktuellen Rahmen. –

0

die

PresentationCore.dll verwenden und die WindowsBase.dll als Referenz in Ihr Projekt

PresentationCore.dll hat eine Keyboard - Klasse und WindowsBase.dll hat eine Key - Klasse.

dann:

using System; 
    using System.Windows.Forms; 
    using System.Windows.Input; 

      namespace ViewTest 
      { 
       public partial class ViewTest : Form 
       { 
        private void ViewTest_KeyDown(object sender, KeyEventArgs e) 
        { 
         if (Keyboard.IsKeyDown(System.Windows.Input.Key.W) && 
          Keyboard.IsKeyDown(System.Windows.Input.Key.D)) 
         { 
          // do something 
         } 
        } 
      } 

es ist eine einfache Möglichkeit, dies in

+0

Also schlagen Sie bei jedem _ key-down-Ereignis die OP-Prüfung _jede_ mögliche Tastenkombination vor? Äh ... das scheint etwas nicht optimal zu sein, um es gelinde auszudrücken. –

+0

das macht er jetzt auch – Ryfang

+0

Ja, aber sein Code könnte in einen 'Schalter' umgewandelt werden (und sollte sein), und wäre daher effizienter. Das kann nicht sein. Beachten Sie auch, dass es im OP keine Hinweise darauf gibt, dass er WPF verwendet. In der Tat sieht es Winforms sehr ähnlich. Ziehen in den WPF-DLLs nur für die Behandlung des Schlüsselstatus ist auch nicht sehr effizient. –

-1

Blick zu tun :) Überschreiben der ProcessCmdKey

protected override bool ProcessCmdKey(ref Message m, Keys k) 
{ 
    if (k == (Keys.Control | Keys.D)) 
    { 
     MessageBox.Show("CTRL+D"); 

     return true; 
    } 

    return base.ProcessCmdKey(ref m, k); 
} 
Verwandte Themen