4

MonoGame では、文字列の形式でどのキーボード キーが押されたかを読み取るにはどうすればよいですか?

試してみString pressedKey = Keyboard.GetState().ToString();ましたが、「Microsoft.Xna.Framework.Input.KeyboardState」が表示されます。

4

6 に答える 6

5

ゲームでは、キーは文字列ではなく状態を持つボタンと考えるのが一般的です。これは、通常、キャラクターを動かしたり、撃ったり、ジャンプしたりするためにボタンが上か下かを確認するためです。

他の人が言ったように、テストしたいキーがすでにわかっている場合は、 IsKeyDown と IsKeyUp を使用する必要があると言いました。ただし、どのキーが押されているかだけを知りたい場合もあります。そのために、キーボードで現在押されているキーの配列を取得する GetPressedKeys メソッドを使用できます。

これらのキーを文字列に変換したい場合は、おそらく更新メソッドで次のようにすることができます。

    private string _stringValue = string.Empty;

    protected override void Update(GameTime gameTime)
    {
        var keyboardState = Keyboard.GetState();
        var keys = keyboardState.GetPressedKeys();

        if(keys.Length > 0)
        {
            var keyValue = keys[0].ToString();
            _stringValue += keyValue;
        }

        base.Update(gameTime);
    }

ただし、これは完璧ではないことに注意してください。大文字と小文字の SHIFT キーを処理するコードを追加する必要があり、Ctrl や Alt などの他のキーを除外する必要があります。おそらく、入力を英数字のみに制限するなど..

幸運を。

于 2014-03-22T03:34:57.923 に答える
2

コメントするには担当者が少なすぎますが、AZ のみを入力として許可し、モノゲーム (およびおそらく XNA) を使用している場合は、Keys 列挙型を見て、テストしているキー値がその範囲内にあるかどうかを確認できます。

の線に沿った何か

if((int)key > 64 && (int)key <  91)
   {
      keyValue = key.ToString();
      this.EnteredString += keyValue;
   }

64 は列挙型の A の下のキーで、91 は列挙型の z の上のキーです:)

同じ考え方で数値を許可できます:

else if ((int)key > 47 && (int)key < 58)
     {
     keyValue = key.ToString();
     keyValue = keyValue.TrimStart('D');

     this.EnteredString += keyValue;
     }

表示される不要な「D」文字をトリミングします

于 2020-01-07T00:03:38.657 に答える
1

.ToString()どのキーが押されたかを調べるために関数を使用する必要はありません。

KeyboardStateどのキーが押されたかを調べるために追跡する必要があります。例えば

KeyboardState ks = Keyboard.GetState()
if (ks.IsKeyDown(Keys.W)) {
   // Move forward
}
if (ks.IsKeyDown(Keys.S)) {
   // Move backward
}
if (ks.IsKeyDown(Keys.A)) {
   // Move left
}
if (ks.IsKeyDown(Keys.D)) {
   // Move right
}
于 2014-03-21T16:49:07.093 に答える
1

C# 7 がこのようなパターン マッチングを許可するかどうかはわかりませんが、他の F# ユーザーも私と同じようなものを探すかもし​​れません。

override this.Update(gameTime) =
  let HandleKeys K =
         match K with
         | Keys.Down -> DoSomething
         | Keys.Up -> DoSomethingElse
         | Keys.Left -> DoYetSomethingElse
         | Keys.Right->  DoAnythingOtherThanWhatWeDidAlready

  if Keyboard.GetState().GetPressedKeys().Length > 0 then HandleKeys (Keyboard.GetState().GetPressedKeys().[0]) |> ignore
于 2015-12-20T11:57:02.050 に答える
1

これはすでに回答されていることは知っていますが、ここでこのトピックを見つけ、そこでいくつかのコードを少しリファクタリングしました:

public class KeyboardStringReader
    {
        private KeyboardState currentKeyboardState;
        private KeyboardState oldKeyboardState;

        public string TextString { get; set; }
        public bool IsFinished { get; set; }
        public KeyboardStringReader()
        {
            TextString = string.Empty;
            IsFinished = false;
        }

        public void UpdateInput()
        {
            if (!this.IsFinished)
            {
                oldKeyboardState = currentKeyboardState;
                currentKeyboardState = Keyboard.GetState();

                Keys[] pressedKeys;
                pressedKeys = currentKeyboardState.GetPressedKeys();

                foreach (Keys key in pressedKeys)
                {
                    if (oldKeyboardState.IsKeyUp(key))
                    {
                        if (key == Keys.Back && TextString.Length > 0)
                        {
                            TextString = TextString.Remove(TextString.Length - 1, 1);
                        }
                        else if (key == Keys.Space)
                        {
                            TextString = TextString.Insert(TextString.Length, " ");
                        }
                        else if (key == Keys.Enter)
                        {
                            this.IsFinished = true;
                        } 
                        else
                        {
                            string keyString = key.ToString();
                            bool isUpperCase = ((Control.IsKeyLocked(System.Windows.Forms.Keys.CapsLock) &&
                                                 (!currentKeyboardState.IsKeyDown(Keys.RightShift) &&
                                                  !currentKeyboardState.IsKeyDown(Keys.LeftShift))) ||
                                                (!Control.IsKeyLocked(System.Windows.Forms.Keys.CapsLock) &&
                                                 (currentKeyboardState.IsKeyDown(Keys.RightShift) ||
                                                  currentKeyboardState.IsKeyDown(Keys.LeftShift))));

                            if (keyString.Length == 1)
                            {
                                TextString += isUpperCase ? keyString.ToUpper() : keyString.ToLower();
                            }
                        }
                    }
                }
            }
        } 
    }

大文字のものについてはwindows.formsへの参照が必要だったことに注意することが重要です(もっと良い方法があると確信していますが、ここで急いでいるので:P)

于 2014-06-08T16:15:29.693 に答える