MonoGame では、文字列の形式でどのキーボード キーが押されたかを読み取るにはどうすればよいですか?
試してみString pressedKey = Keyboard.GetState().ToString();
ましたが、「Microsoft.Xna.Framework.Input.KeyboardState」が表示されます。
ゲームでは、キーは文字列ではなく状態を持つボタンと考えるのが一般的です。これは、通常、キャラクターを動かしたり、撃ったり、ジャンプしたりするためにボタンが上か下かを確認するためです。
他の人が言ったように、テストしたいキーがすでにわかっている場合は、 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 などの他のキーを除外する必要があります。おそらく、入力を英数字のみに制限するなど..
幸運を。
コメントするには担当者が少なすぎますが、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」文字をトリミングします
.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
}
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
これはすでに回答されていることは知っていますが、ここでこのトピックを見つけ、そこでいくつかのコードを少しリファクタリングしました:
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)