2012-04-08 15 views
1

私は2Dプラットフォームを開発するためにXNA(C#)を使用しています。 特定のボタンを押したままにするのが最善の方法であると思っていました。たとえば、レーザービームが大きくなるほど、より多くのレーザービームが得られます。キー押下の処理時間を実装する方法

これまでのところ、キーボードの最後の2つの状態を保持する入力メカニズムを使用しているため、各更新サイクルで余分なチェックを行って期間を長くすることができます。しかし、このアプローチは特定のボタン(火のボタンなど)しか扱わず、トリックを行う必要があるため、このアプローチはかなり限定されていますが、この問題に対するより一般的な解決方法があるのだろうかと思いました。単一のキー押下を検出する

+0

私がXを読んでいる限り、 NA KeyboardStateのドキュメントでは、説明したようなKeyboardStateクラスにはそのような制限はありません。 [MSDNドキュメント](http://msdn.microsoft.com/en-us/library/bb203903%28v=xnagamestudio.10%29.aspx)から判断すると、現在の状態を取得するために使用できます。どれくらいの数のキーが押されていても、どれくらい長く押されていようとも、すべてのキー。おそらくあなたの入力コードに問題がありますか? –

+0

それを確認していただきありがとうございます、私は自分の発見を自分で確認しました。 また、私は入力の仕組みも認識しています。それはもっと設計/アーキテクチャーの解決策を探していただけです。 – CodinRonin

答えて

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

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

ジェネリックメソッド

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

はい、それは私のアプローチに非常に似ています。 – CodinRonin

+0

キーストップの持続時間を処理する方法は他にはありませんが、キーを押すと時間が累積されます...私はどこにいるのか理解できません... – Blau

+0

私はもっと考えていました期間管理を処理するためのより堅牢なシステムです。たぶんより汎用的なアプローチのあるヘルパークラス、サードパーティライブラリを参考にしてください... – CodinRonin

0

...押されてキーを検出する

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

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

...

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

それを行うための最善の方法です。それはあなたがすでに使っている方法ですか?

0

は、ここでは簡単な擬似コードの例です:

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); 

    ... 
} 
:あなたはこのようなものになるだろうと言うと、特に時間を測定するため

// 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 

+0

はい、それは私が現在実装している方法のようです。 しかし、私はその問題自体がキー押しの持続時間を数えているのではないかと心配しています。あなたが記述したシナリオでは、私はそれを "magnitdeの増加"ステップで実装します。 すぐに使える機能があると思っていました。 – CodinRonin

関連する問題