1

私は XNA ゲームに取り組んでいますが、問題が発生しました。ゲームでキーを押すたびに、キーを押すことによってトリガーされるメソッドが複数回呼び出されます。たとえば、ユーザーが攻撃ボタン (スペース) を押すと、キャラクターは 1 回のキー操作で 10 回のように攻撃します。キーを押してメソッドを1回だけトリガーしたい。ユーザーがキーを押したままにしても、いくつかのメソッドを一度だけ呼び出す必要があります。今のところ、ボタンを押すたびに thread.sleep を書くことで解決しましたが、それは非常に非効率的です。私の問題が理解できることを願っています。前もって感謝します!

4

3 に答える 3

5

キーを押したときにボタンにフラグを立ててから、キーを押したときにボタンが押されていないことを示すフラグを立てる必要があります。キーダウンメソッド中に..ボタンがすでに押されているかどうかを確認します..押されている場合..キーアップが元に戻るまで何もしません。

この理由は、キーを押している間、アプリケーション/ゲーム/その他すべてが、メッセージ キューを介して毎秒数千のメッセージを受信して​​いるためです。スペースバーをすばやく叩いたとしても、最大 50 個の WM_KEYDOWN メッセージがメッセージ キューを介して処理される可能性があります。

例:

bool SpacebarPressed = false;

private void KeyDown() {
    if (!SpacebarPressed) {
        SpacebarPressed = true;
        DoSomethingWithSpacebarBeingPressed();
    }
}

private void KeyUp() {
    if (SpacebarPressed) SpacebarPressed = false;
}
于 2012-11-06T21:41:40.940 に答える
2

これは答えられていることは知っていますが、このような方法を使用できます。oldKeyBoardState を現在のフレームの 1 つ後ろに置き、IsKeyToggled(Keys.Space)

bool IsKeyToggled(Keys key)
{
    if (!oldKeyBoardState.IsKeyDown(key) && keyboardState.IsKeyDown(key))
       return true;
    else
       return false;
}

1 つ後ろに設定するには、2 つのグローバル変数が必要です。

 public static KeyboardState keyboardState;
 public static KeyboardState oldKeyBoardState;

メソッドUpdate()は次のようになります。

 protected override void Update(GameTime gameTime)
 {
   keyboardState = Keyboard.GetState();
   //TODO: Add update logic here
   //This comes last
   oldKeyBoardState = keyboardState;
 }
于 2012-11-06T22:56:35.250 に答える
0

キーが最初に押されたときに設定し、キーが離されたときにリセットするフラグが必要です。大まかな例:

if(keyIsPressed() && !myFlag)
{
   //do stuff
   myFlag = true;
}
else if(!keyIsPressed())
   myFlag = false;
于 2012-11-06T21:44:32.277 に答える