如何在任何键盘,鼠标或游戏手柄状态更改时启动事件?

时间:2013-02-23 21:38:50

标签: c# events input xna

有没有办法立即对C#应用程序中鼠标,键盘和游戏手柄状态的任何变化作出反应?

我相信XNA就像任何其他C#应用程序一样,所以它可能没有任何不同,但为了以防万一,我想通过立即启动相应的事件来改进我的XNA游戏输入。

默认XNA没有事件处理程序(至少我从未见过它被提及)。 Nuclex.Input没有检测到某些键(如Alt,F10或Pause,这是不可接受的)。

1 个答案:

答案 0 :(得分:0)

通常,您将输入的状态存储在前一帧中,然后测试输入是否在帧之间发生了变化。例如,您的Update方法可能如下所示:

KeyboardState ks = Keyboard.GetState();

if(ks.IsKeyDown(Keys.Space) && lastKeyboardState.IsKeyUp(Keys.Space))
{
    DoAThing();
}

lastKeyboardState = ks;

(完全从内存中编写代码,所以它可能不太正确。但它应该说明这个概念。)

这将为您提供不超过1 / yourFPS延迟的关键事件。在60FPS,这大约是16ms。这通常可以用于游戏目的。如果您特别想要一个event - 您只需点击我放置DoAThing之上的地方。


要输入文字,您通常需要来自Windows的角色事件(像Nuclex.Input这样的库可以为您提供)。这并非如此,因此您可以获得更好的延迟,但您可以通过有序可靠方式获取键盘事件(例如:这样您就永远无法获得两个键落在一个单一的框架上导致一个模糊的秩序。)

更重要的是,您可以在Windows有机会应用输入处理后获取事件。例如,这使您在键入aA之间有所不同。或者有人用alt + numpad输入一个角色,或者使用变音符号。缺点是您错过了各种非文本键,如您所提及的AltF10Pause等。


最后,快速阅读Nuclex.Input表明,至少 应提供您想要的密钥 - 具体为IKeyboard.KeyPress.KeyRelease。如果它不起作用,它可能是Nuclex中的错误。或者系统上的某些内容干扰了窗口消息。

一种可能的解决方法可能是通过轮询来接受这些丢失密钥的延迟。使用轮询作为无缝回退的代码可能相当简单。