C#XNA游戏中的文本框

C#XNA游戏中的文本框,c#,textbox,xna,C#,Textbox,Xna,我是XNA的新手。我正在制作一个需要关卡编辑器的游戏。我需要一个文本框来获取级别名称及其描述。所以我写了这样的代码: if (isSaveBox) { KeyboardState ks = Keyboard.GetState(); Keys[] keys = ks.GetPressedKeys(); Keys tempKey = Keys.None; foreach (Keys ke

我是XNA的新手。我正在制作一个需要关卡编辑器的游戏。我需要一个文本框来获取级别名称及其描述。所以我写了这样的代码:

if (isSaveBox)
        {
            KeyboardState ks = Keyboard.GetState();
            Keys[] keys = ks.GetPressedKeys();
            Keys tempKey = Keys.None;

            foreach (Keys key in keys)
            {
                Keys currentKey = key;
                if (ks.IsKeyUp(lastKey))
                {
                    string toadd = key.ToString();
                    if (!(key == Keys.None) && key != Keys.Space && key != Keys.Back && key != Keys.Enter)
                    {
                        levelName += toadd;
                    }
                    else if (key == Keys.Space)
                    {
                        levelName += " ";
                    }
                    else if (key == Keys.Back)
                    {
                        levelName.Remove(levelName.Length - 1);
                        lastKey = currentKey;
                    }
                }
                if (currentKey != Keys.None && ks.IsKeyDown(currentKey))
                {
                    tempKey = currentKey;
                }
            }

            lastKey = tempKey;
            message = "Save level" + "\n" + "Enter - yes / Esc - no" + "\n" + levelName;

但是当我尝试键入一些字母时,它们不会添加到
levelName
字符串中。有人能帮我吗?

我建议您使用一种XNA GUI框架,它包含表单元素、场景管理器和其他有用的东西


我建议您使用一个XNA GUI框架,它包含表单元素、场景管理器和其他有用的东西


看一看,就我所知,您的代码运行良好。我对它进行了修改,并添加了一些改进。你不需要一些东西,我做的,所以当你拿着钥匙的时候,它不会那么快发出垃圾邮件。我本来会添加对其他键(如符号和大写)的支持,但对于所有这些,这是一个相当长的switch语句,所以您可以查看本文并轻松实现它

我又添加了一些变量,所有与文本框相关的内容现在都应该读为

    Keys[] lastKeys;
    KeyboardState lastKeyboardState;

    public double timer;

    public string levelName;
如果需要,还可以将
currentKeyboardState
变量添加为全局变量

现在,对于代码,我将其分为两个方法,以避免复制代码两次

if (isSaveBox)
{
    //Get the current keyboard state and keys that are pressed
    KeyboardState keyboardState = Keyboard.GetState();
    Keys[] keys = keyboardState.GetPressedKeys();

    foreach (Keys currentKey in keys)
    {
        if (currentKey != Keys.None)
        {
            //If we have pressed the same key twice, wait atleast 125ms before adding it again
            if (lastKeys.Contains(currentKey))
            {
                if ((gameTime.TotalGameTime.TotalMilliseconds - timer > 125))
                    HandleKey(gameTime, currentKey);
            }
            //If we press a new key, add it
            else if (!lastKeys.Contains(currentKey))
                HandleKey(gameTime, currentKey);
        }
    }

    //Save the last keys and pressed keys array
    lastKeyboardState = keyboardState;
    lastKeys = keys;
}
以及重置计时器并实际计算字符串的方法(这是为移位和符号等添加代码的地方)

您还可以使用
StringBuilder
进行进一步优化


如果您想继续编写自己的UI,请继续。我仍然建议使用UI库(我使用的是新恢复的UI库),但关于这一点还有更大的讨论。

据我所知,您的代码运行良好。我对它进行了修改,并添加了一些改进。你不需要一些东西,我做的,所以当你拿着钥匙的时候,它不会那么快发出垃圾邮件。我本来会添加对其他键(如符号和大写)的支持,但对于所有这些,这是一个相当长的switch语句,所以您可以查看本文并轻松实现它

我又添加了一些变量,所有与文本框相关的内容现在都应该读为

    Keys[] lastKeys;
    KeyboardState lastKeyboardState;

    public double timer;

    public string levelName;
如果需要,还可以将
currentKeyboardState
变量添加为全局变量

现在,对于代码,我将其分为两个方法,以避免复制代码两次

if (isSaveBox)
{
    //Get the current keyboard state and keys that are pressed
    KeyboardState keyboardState = Keyboard.GetState();
    Keys[] keys = keyboardState.GetPressedKeys();

    foreach (Keys currentKey in keys)
    {
        if (currentKey != Keys.None)
        {
            //If we have pressed the same key twice, wait atleast 125ms before adding it again
            if (lastKeys.Contains(currentKey))
            {
                if ((gameTime.TotalGameTime.TotalMilliseconds - timer > 125))
                    HandleKey(gameTime, currentKey);
            }
            //If we press a new key, add it
            else if (!lastKeys.Contains(currentKey))
                HandleKey(gameTime, currentKey);
        }
    }

    //Save the last keys and pressed keys array
    lastKeyboardState = keyboardState;
    lastKeys = keys;
}
以及重置计时器并实际计算字符串的方法(这是为移位和符号等添加代码的地方)

您还可以使用
StringBuilder
进行进一步优化


如果您想继续编写自己的UI,请继续。我仍然建议使用UI库(我使用的是新恢复的UI库),但关于这一点还有更大的讨论。

测试了代码,对我来说效果很好。此外,我会使用经过的时间,并说,每200毫秒添加一个字母,如果相同的关键是正在举行,因为键入“lol”使它看起来像“lllloooooollllllllllllllllll”测试代码,对我来说很好。另外,我会用经过的时间说,如果拿着同一把钥匙,每隔200毫秒再加一个字母,因为键入“lol”会使它看起来像“llllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllll”我在这段代码中遇到了两个相同的错误:System.Array不包含Contains的定义,并且没有接受System类型的第一个参数的扩展方法“Contains”。可以找到Array(是否缺少using指令或程序集引用?)(在lastKeys.Contains)您需要引用System.Linq,抱歉,我忘记了<代码>使用System.Linq哦,哈哈,我忘了linq(我添加了每个系统。集合):P谢谢,它现在可以工作了。好的,很好,没问题!我想知道真正的根本问题是什么。。。我的车从一开始就很好用。另外,我记得您在EE:)我在这段代码中有两个相同的错误:System.Array不包含包含的定义,并且没有扩展方法“Contains”接受System.Array类型的第一个参数(您是否缺少using指令或程序集引用?)(在lastKeys.Contains)您需要引用System.Linq,对不起,我忘了<代码>使用System.Linq哦,哈哈,我忘了linq(我添加了每个系统。集合):P谢谢,它现在可以工作了。好的,很好,没问题!我想知道真正的根本问题是什么。。。我的车从一开始就很好用。还有,我记得你从EE:)