2012-04-08 8 views
1

Ich verwende XNA (C#), um einen 2D Platformer zu entwickeln. Ich habe mich gefragt, wie ich am besten mit einem bestimmten Knopf umgehen kann. Je länger Sie beispielsweise halten, desto größer wird der Laserstrahl.Möglichkeit, die Bearbeitungsdauer eines Tastendrucks zu implementieren

Da ich bereits den Eingabemechanismus verwende, der die 2 letzten Zustände der Tastatur enthält, kann ich jeden Aktualisierungszyklus extra überprüfen, um die Dauer zu erhöhen. Aber dieser Ansatz ist ziemlich begrenzt, da er nur einen bestimmten Knopf (Feuerknopf, d. H.) Handhabt und er sollte es tun, aber ich frage mich, ob es vielleicht eine allgemeinere Lösung für das Problem gibt.

+0

Soweit ich das beim Lesen des X feststellen kann NA KeyboardState-Dokumentation, es gibt keine solche Einschränkung für die KeyboardState-Klasse wie die von Ihnen beschriebene. Ausgehend von der [MSDN-Dokumentation] (http://msdn.microsoft.com/en-us/library/bb203903%28v=xnagamestudio.10%29.aspx) sollten Sie in der Lage sein, sie zu verwenden, um den aktuellen Status von zu erhalten jede Taste, egal wie viele gedrückt werden und egal wie lange sie gedrückt wurden. Vielleicht gibt es ein Problem mit Ihrem Eingabecode? –

+0

Vielen Dank für die Überprüfung, ich habe Ihre Ergebnisse selbst bestätigt. Und ich bin mir auch der Input-Mechanik bewusst, es ist nur, dass ich nach einer Design-/Architekturlösung fischerte. – CodinRonin

Antwort

1
float ElapsedSecondsPerFrame = (float) gametime.Elapsed.TotalSeconds; 

KeyFirePressedTime = Keyboard.GetState().IsKeyDown(FireKey) 
         ? (KeyFirePressedTime + ElapsedSecondsPerFrame) 
         : 0; 

Generisches Verfahren

Dictionary<int, float> PressedKeysTime = new ... 


void Update(float Elapsed) 
{ 
     List<int> OldPressedKeys = PressedKeysTime.Keys.ToList(); 
     foreach (int key in Keyboard.GetState().GetPressedKeys.Cast<int>()) 
     { 
      if (!PressedKeysTime.ContainsKey(key)) 
      { 
       PressedKeysTime[key] = 0; 
      } else { 
       OldPressedKeys.Remove(key); 
       PressedKeysTime[key] += Elapsed; 
      } 
     } 
     foreach (int keynotpressed in OldPressedKeys) 
      PressedKeysTime.Remove(keynotpressed); 

} 
+0

Ja, es ist meinem Ansatz sehr ähnlich. – CodinRonin

+0

gibt es keine anderen Ansätze zur Handhabung der Dauer eines Tastendrucks, Sie müssen Zeit sammeln, wenn der Schlüssel Feuer gedrückt wird ... Ich kann nicht verstehen, wo ist die Sache ... – Blau

+0

Ich dachte mehr in der Zeile ein robusteres System für die Verwaltung der Dauer. Vielleicht eine Hilfsklasse mit einem allgemeineren Ansatz, 3rd-Party-Bibliothek als Referenz ... – CodinRonin

0

Um einen einzigen Tastendruck Detect ...

lastKeyboardState = CurrentKeyState; 
CurrentKeyState = Keyboard.GetState(); 

if ((CurrentKeyState.IsKeyUp(Keys.Enter)) && (lastKeyboardState.IsKeyDown(Keys.Enter)) 
     { 
      //Enter was pressed 
     } 

eine Taste gedrückt ...

lastKeyboardState = CurrentKeyState; 
CurrentKeyState = Keyboard.GetState(); 
if (CurrentKeyState.IsKeyDown(Keys.Enter) 
     { 
      //Enter was pressed (You could do BeamSize++ here 
     } 

, dass die beste Art und Weise gehalten, um erkennen zu werden, es zu tun scheint. Ist das die Methode, die Sie bereits verwenden?

0

hier ist ein einfaches Pseudo-Code Beispiel:

// to cancel immediately 
if key is pressed this frame, but was released last frame 
    begin effect 

else if key is pressed this frame, and also was last frame 
    increase magnitude of effect 

else if key is released this frame and effect is active 
    end effect 


// or to gradually decrease 
if key is pressed this frame, and effect is inactive 
    begin effect 

else if key is pressed this frame, and effect is active 
    increase magnitude of effect 

else if key is released this frame and effect is active 
    decrease magnitude of effect 
    if magnitude decreased enough, end effect 

Um speziell die Dauer zu messen, wie man es so etwas wie das sagt sein:

public void Update(GameTime pGameTime) 
{ 
    private TimeSpan mKeyDuration = TimeSpan.FromSeconds(0); 

    ... 

    if key is pressed this frame 
     mKeyDuration += pGameTime.ElapsedGameTime; 

    else if key was pressed last frame 
     mKeyDuration = TimeSpan.FromSeconds(0); 

    ... 
} 
+0

Ja, das ist ein bisschen eine Weise, die ich zurzeit umsetze. Aber ich fürchte, das Problem selbst ist in der Zählung der Dauer des Tastendrucks. In dem von Ihnen beschriebenen Szenario implementiere ich es im Schritt "Magnitude erhöhen". Ich habe nachgedacht, ob es vielleicht eine Out-of-the-Box-Funktionalität gibt. – CodinRonin