テキスト入力を処理するには、キーが押されたときと離されたときを知る必要があります。残念ながら、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 つの配列を比較するより効率的な方法があるかもしれませんが、比較する項目が非常に少ないため、それが問題になるとは思えません。)