C# 在XNA中进行文本输入(用于输入姓名、聊天)

C# 在XNA中进行文本输入(用于输入姓名、聊天),c#,text,input,xna,keyboard,C#,Text,Input,Xna,Keyboard,我正在尝试实现键盘文本输入,用于在游戏中聊天、键入字符名、保存文件名等 我一直在摆弄KeyboardState,试图将最新添加的符号转换成可以添加到输入字符串中的字符,但它似乎按照某种顺序对当前按下的键数组进行排序(我打赌它是按键码排序的),因此我无法轻松找到最后按下哪个键将其添加到输入字符串中 是否有一种简单的方法来检测上次按下的文本键(包括按下多个键的情况,因为人们有时会这样做),或者更容易使用一些现有的解决方案 我正在学习C#和XNA,所以我希望自己能够做到,但最终我希望我的游戏能够正常运

我正在尝试实现键盘文本输入,用于在游戏中聊天、键入字符名、保存文件名等

我一直在摆弄KeyboardState,试图将最新添加的符号转换成可以添加到输入字符串中的字符,但它似乎按照某种顺序对当前按下的键数组进行排序(我打赌它是按键码排序的),因此我无法轻松找到最后按下哪个键将其添加到输入字符串中

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


我正在学习C#和XNA,所以我希望自己能够做到,但最终我希望我的游戏能够正常运行。

您可以尝试下面列出的示例

这将处理同时按下的多个键。如果要避免这种情况,请在第二个
If
之前添加一个
else
(以及后面的那些)


此外,按下一个键将触发多个按键事件——如果不需要,则需要引入一个状态变量,在按键按下和不按下时翻转该变量,并根据按键按下时的状态继续操作。为了处理文本输入,您需要知道按键按下或松开的时间。不幸的是,XNA的键盘状态在这方面没有真正的帮助,所以你必须自己做。基本上,您只需将当前更新的按键与上一次更新的按键进行比较

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,并从游戏的Update方法调用它的Update方法


(顺便说一句,比较两个数组可能比比较foreach和Contains更有效,但要比较的项目太少,我怀疑这有什么关系。)

显然,你也可以阅读其他的:,例如
Keys.a
而不是
Keys.Left
我怀疑你的意思是,为每一种可能的情况都键入一个显式场景不是很酷,而且ascii中有很多情况,更不用说unicode了。您知道其他方法吗?您可以使用中概述的方法。基本上,您可以使用
toString()
方法转换按下的键以获取值(而不是单个
if
s)。您必须处理(包括丢弃)从打字角度看有特殊意义或没有意义的特殊键(例如backspace或ESC),但如何一次只获取一个新键?我的意思是,当我尝试当前按下所有键时,它们不是按照按下的顺序排序的,因此我不能只获取该数组的最后一个索引。我不确定我是否理解:当用户键入时,它们不太可能同时按下两个键(除非是Shift+A之类的,顺序并不重要)。在极少数情况下,当他们一次按多个(字母)键时,你可以选择任何命令(或不按任何命令),你的决定。谢谢,这就是我一直在寻找的算法。
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
    }
}