for (Keys k = Keys.A; k <= Keys.Z; k++)
{
if (KeyPress(k))
Text += k;
}
此代码检测我在键盘上按下的按键,它将打印出在控制台中按下的按键。但是,我在键盘上按了'a',但它出现'A'。我该如何解决这个问题?
答案 0 :(得分:9)
这是一个经常遇到的问题。问题是XNA不适合从键盘获取文本输入。它旨在获得键盘上每个键的当前状态。
虽然您可以编写自定义代码来检查是否按下shift等等,但是键盘不是您正在使用的键盘(例如,不同的语言,不同的布局)。大多数人所做的就是让窗户为你做。
如果您希望文本按预期显示,则需要基本上重新创建一些内容并让窗口为您执行此操作。
在此处查看Promit的帖子:http://www.gamedev.net/topic/457783-xna-getting-text-from-keyboard/
用法:
将他的代码添加到您的解决方案中。调用EventInput.Initialize in your game's
Initialize`方法并订阅他的活动:
EventInput.CharEntered += HandleCharEntered;
public void HandleCharEntered(object sender, CharacterEventArgs e)
{
var charEntered = e.Character;
// Do something with charEntered
}
注意:如果您允许输入任何字符(例如带有变音符号的外国字符等),请确保您的SpriteFont
支持它们! (如果没有,也许只是在将字体添加到文本字符串之前检查字体是否支持它,或者让spritefont使用特殊的“无效”字符)。
答案 1 :(得分:0)
查看提供的代码后,应该进行简单的修改:
[...]
for (Keys k = Keys.A; k <= Keys.Z; k++)
{
if (KeyPress(k))
{
if (keyboardState.IsKeyDown(Keys.LeftShift) || keyboardState.IsKeyDown(Keys.RightShift)) //if shift is held down
Text += k.ToString().ToUpper(); //convert the Key enum member to uppercase string
else
Text += k.ToString().ToLower(); //convert the Key enum member to lowercase string
}
}
[...]