文本框在C#中的XNA Game(Textbox in a C# XNA Game)

2019-10-18 07:52发布

我是新来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字符串。 有人可以帮我吗?

Answer 1:

至于我可以告诉你的代码工作正常。 我打了与它周围添加了一些改进。 你并不需要一些东西,我说得那么当你持有它不是垃圾邮件这么快的关键。 我会对其他键相同的符号,并添加帽子的支持,但它很好地满足所有,长期以来switch语句,所以你可以看看这个文章,很容易地实现它。

我增加了一些变数,所有的文本相关的东西,现在应该读作

    Keys[] lastKeys;
    KeyboardState lastKeyboardState;

    public double timer;

    public string levelName;

您还可以添加您的currentKeyboardState如果你想变量作为全局变量。

现在的代码,我把它分成2种方法防止不得不两次复制代码

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;
}

和方法来重置计时器居然找出字符串(这是你会为移动和符号等添加代码)

private void HandleKey(GameTime gameTime, Keys currentKey)
{
    string keyString = currentKey.ToString();
    if (currentKey == Keys.Space)
        levelName += " ";
    else if ((currentKey == Keys.Back || currentKey == Keys.Delete) && levelName.Length > 0)
        levelName = levelName.Remove(levelName.Length - 1);
    else if (currentKey == Keys.Enter)
        return;
    else
        levelName += keyString;
    //Set the timer to the current time
    timer = gameTime.TotalGameTime.TotalMilliseconds;
}

你也可以使用StringBuilder进一步优化。

如果你想继续写自己的UI,勇往直前。 我还是会建议使用一个UI库(我用的是新复兴Neoforce控制 ),但对于那些在更大的讨论在这里 。



Answer 2:

我建议你使用XNA GUI框架,包含表单元素,现场管理人员的其他有用的东西之一。

看看这里或那里



文章来源: Textbox in a C# XNA Game
标签: c# textbox xna