6

ゲームでのチャット、キャラクター名の入力、ファイル名の保存などにキーボードのテキスト入力を実装しようとしています。

入力文字列に追加できる文字に変換する最新の追加記号を取得しようとして KeyboardState をいじっていましたが、現在押されているキーの配列を何らかの順序で並べ替えているようです (キーコードで並べ替えられているはずです)。そのため、入力文字列に追加するために最後に押されたキーを簡単に見つけることができません。

最後に押されたテキスト キーを検出する簡単な方法はありますか (複数のキーが押された場合を含む)、または既存のソリューションを利用する方が簡単ですか?

C#やXNAを勉強中なので自分でできるようになりたいけど、最終的には自分のゲームを動かしたい。

4

2 に答える 2

6

テキスト入力を処理するには、キーが押されたときと離されたときを知る必要があります。残念ながら、XNA の KeyboardState はこれにはあまり役に立たないため、自分で行う必要があります。基本的に、現在の更新の PressedKeys を以前の更新の PressedKeys と比較するだけです。

public class KbHandler
{
    private Keys[] lastPressedKeys;

    public KbHandler()
    {
        lastPressedKeys = new Keys[0];
    }

    public void Update()
    {
        KeyboardState kbState = Keyboard.GetState();
        Keys[] pressedKeys = kbState.GetPressedKeys();

        //check if any of the previous update's keys are no longer pressed
        foreach (Keys key in lastPressedKeys)
        {
            if (!pressedKeys.Contains(key))
                OnKeyUp(key);
        }

        //check if the currently pressed keys were already pressed
        foreach (Keys key in pressedKeys)
        {
            if (!lastPressedKeys.Contains(key))
                OnKeyDown(key);
        }

        //save the currently pressed keys so we can compare on the next update
        lastPressedKeys = pressedKeys;
    }

    private void OnKeyDown(Keys key)
    {           
        //do stuff
    }

    private void OnKeyUp(Keys key)
    {
        //do stuff
    }
}

Game クラスに KbHandler を与え、Game の update メソッドから Update メソッドを呼び出します。

(ところで、foreach と Contains よりも 2 つの配列を比較するより効率的な方法があるかもしれませんが、比較する項目が非常に少ないため、それが問題になるとは思えません。)

于 2012-04-14T20:23:09.383 に答える
0

ここにリストされている例を試すことができます

KeyboardState keybState = Keyboard.GetState();
if (keybState.IsKeyDown(Keys.Left)) {
  // process left key
}
if (keybState.IsKeyDown(Keys.Right)) {
  // process right key
}

これにより、同時に押された複数のキーが処理されます。それを避けたい場合は、2 番目(および次のもの)のelse前にa を追加します。if

また、キーを押したままにすると、複数のキーダウン イベントが発生します。これが望ましくない場合は、キーが押されたときと押されていないときに反転する状態変数を導入する必要があります。キー押された

于 2012-04-14T13:45:14.947 に答える