我正在尝试在游戏中实现键盘文本输入,输入字符名称,保存文件名等。
我正在搞乱使用KeyboardState试图将最新添加的符号转换为我可以添加到输入字符串中的字符,但它似乎按某种顺序对当前按下的键的数组进行排序(我打赌它是按照排序的keycode),所以我不能轻易找到最后按下哪个键将它添加到输入字符串。
是否有一种简单的方法可以检测最后按下的文本键(包括按下多个键的情况,因为人们有时会这样做),或者是否更容易使用某些现有的解决方案?
我正在学习C#和XNA,所以我希望能够自己做,但最后我想让我的游戏发挥作用。
答案 0 :(得分: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
}
}
为您的游戏课程提供一个KbHandler,并从您的游戏更新方法中调用它的更新方法。
(BTW可能有一种更有效的方法来比较两个数组而不是foreach和Contains,但是只有很少的项目可以比较我怀疑它是否重要。)
答案 1 :(得分:0)
您可以尝试列出的here
示例KeyboardState keybState = Keyboard.GetState();
if (keybState.IsKeyDown(Keys.Left)) {
// process left key
}
if (keybState.IsKeyDown(Keys.Right)) {
// process right key
}
这将处理同时按下的多个键。如果您想避免这种情况,请在第二个else
之前添加if
(及以下内容)
此外,按下的按键将触发多个按键事件 - 如果不需要,您将需要引入一个状态变量,当按键关闭时以及不按键时它会翻转并根据其进行操作 按
键时的状态