在XNA中进行文本输入(用于输入姓名,聊天)
本文关键字:输入 聊天 用于 文本 XNA | 更新日期: 2023-09-27 18:31:02
我正在尝试实现键盘文本输入,用于在游戏中聊天,键入角色名称,保存文件名等。
我弄乱了 KeyboardState,试图将最新添加的符号转换为我可以添加到输入字符串中的字符,但它似乎按某种顺序对当前按下的键数组进行排序(我敢打赌它是按键码排序的),所以我不容易找到最后按下的键将其添加到输入字符串中。
有没有一种简单的方法来检测上次按下的文本键(包括按下多个键的情况,因为人们有时会这样做),还是更容易使用一些现有的解决方案?
我正在学习 C# 和 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
此外,按住键将触发多个键下事件 - 如果不需要这样做,则需要引入一个状态变量,当键按下时翻转,