在XNA中输入文本(用于输入名称,聊天)

时间:2012-04-14 13:35:07

标签: c# text input xna keyboard

我正在尝试在游戏中实现键盘文本输入,输入字符名称,保存文件名等。

我正在搞乱使用KeyboardState试图将最新添加的符号转换为我可以添加到输入字符串中的字符,但它似乎按某种顺序对当前按下的键的数组进行排序(我打赌它是按照排序的keycode),所以我不能轻易找到最后按下哪个键将它添加到输入字符串。

是否有一种简单的方法可以检测最后按下的文本键(包括按下多个键的情况,因为人们有时会这样做),或者是否更容易使用某些现有的解决方案?

我正在学习C#和XNA,所以我希望能够自己做,但最后我想让我的游戏发挥作用。

2 个答案:

答案 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(及以下内容)

此外,按下的按键将触发多个按键事件 - 如果不需要,您将需要引入一个状态变量,当按键关闭时以及不按键时它会翻转并根据其进行操作

键时的状态