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

本文关键字:输入 聊天 用于 文本 XNA | 更新日期: 2023-09-27 18:31:02

我正在尝试实现键盘文本输入,用于在游戏中聊天,键入角色名称,保存文件名等。

我弄乱了 KeyboardState,试图将最新添加的符号转换为我可以添加到输入字符串中的字符,但它似乎按某种顺序对当前按下的键数组进行排序(我敢打赌它是按键码排序的),所以我不容易找到最后按下的键将其添加到输入字符串中。

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

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

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

为了处理文本输入,您需要知道何时按下或释放某个键。不幸的是,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 方法。

(顺便说一句,可能有一种比使用 foreach 和 Contains 更有效的方法来比较两个数组,但是要比较的项目太少,我怀疑这是否重要。

您可以尝试此处列出的示例

KeyboardState keybState = Keyboard.GetState();
if (keybState.IsKeyDown(Keys.Left)) {
  // process left key
}
if (keybState.IsKeyDown(Keys.Right)) {
  // process right key
}

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

此外,按住键将触发多个键下事件 - 如果不需要这样做,则需要引入一个状态变量,当键按下时翻转,

当键关闭时,并根据按下键时的状态继续