正确地在XNA中按键进行聊天

时间:2012-03-04 20:51:08

标签: xna keyboard-events

所以,我要直截了当地说,我正在尝试在我正在制作的XNA游戏中制作聊天系统。我可以很容易地弄清楚按下了哪些键但是我无法知道实际键入的是什么。对我来说,看起来他们说的是OemShifthello billOemPeriod OemShifthow are youOemQuestion,它应该看起来像Hello bill. How are you?(或者沿着这些界限)。

处理所有这些问题的最佳方式是什么?

3 个答案:

答案 0 :(得分:4)

对于PC而言,XNA框架内置的内容并不容易(对于WP7和Xbox来说,这是一个不同的故事)。

这篇文章很好地总结了你所有的选择。

http://dream-forever.net/Blog/2011/08/29/getting-true-keyboard-input-into-your-xna-games/

基本上

  1. 使用KeyPress映射的字符构建一个大字典
  2. 进入XNA Game Forms KeyDown,KeyUp,KeyPress活动
  3. 使用IMessageFilter界面
  4. 使用SetWindowsHookEx获取关键事件
  5. 这些方法各有利弊,帖子的作者提供了一个可以下载的样本。

    在进行一些研究时,我还遇到了来自Nuclex家伙的图书馆。它们通常会创建相当强大的解决方案,因此绝对值得检查。

    http://www.nuclex.org/blog/announcements/105-new-component-nuclex-input

    要记住的重要一点是,你在PC上,而且任何库都可以在那里工作(有一些修改/调整)。因此,不要仅限于查看XNA相关样本。 DirectInput,SlimDX,SharpDX等样品也可以作为选项,他们可能需要额外的工作才能进入你的项目。

答案 1 :(得分:2)

所以我使用的简单解决方案是获取Win32键盘的钩子,并让windows翻译正在输入的内容。它在我的另一台计算机上,但它基本上在Gamedev.net上使用此解决方案。 (编号#10)

很棒的是,如果您使用[DllImport("user32.dll", CharSet=CharSet.Unicode)](所有.dll导入中的CharSet部分),您可以从键盘获得本地化输入!

所以把它放在某个地方,在Initialize中注册事件,就是这样!希望它适合你。

修改

整个Win32业务可能看起来令人生畏,但是不要让它阻止你使用它 - 这只是复制粘贴的问题,你可以在2分钟内完美运行。

答案 2 :(得分:1)

我猜你是通过keyState.GetPressedKeys()查询键盘输入的?

您必须在代码中的某处使用switch语句将Keys枚举的成员映射到实际字符。 ToString()方法适用于字母,但不适用于符号,因为它们是由名称指定的。

switch (keyPressed)
{
    case Keys.OemPeriod :
        character = '.';
        break;
    case Keys.OemQuestion :
        character = '?';
        break;

    // More cases
}

但请注意,因为键盘不同。正如你所说:Key!= Symbol。其他硬件上的某些键可能与完全不同的符号相关联。