有没有办法立即对 C# 应用程序中鼠标、键盘和游戏手柄状态的任何变化做出反应?
我相信 XNA 就像任何其他 C# 应用程序一样,所以它可能没有什么不同,但以防万一,我想通过立即触发相应的事件来改进我的 XNA 游戏输入。
默认 XNA 没有事件处理程序(至少我从未见过它被提及)。Nuclex.Input 没有检测到某些键(如 Alt、F10 或 Pause,这是不可接受的)。
通常您将输入的状态存储在前一帧上,然后测试输入是否在帧之间发生了变化。例如,您的Update
方法可能如下所示:
KeyboardState ks = Keyboard.GetState();
if(ks.IsKeyDown(Keys.Space) && lastKeyboardState.IsKeyUp(Keys.Space))
{
DoAThing();
}
lastKeyboardState = ks;
(这段代码完全是凭记忆写的,所以可能不太正确。但它应该说明这个概念。)
这将为您提供不超过1 / yourFPS
延迟的关键事件。在 60FPS 时,这大约是 16 毫秒。出于游戏目的,这通常是可以接受的。如果你特别想要一个event
- 你可以简单地在我DoAThing
上面放的地方开火。
对于键入文本,您通常需要来自 Windows 的字符事件(类似的库Nuclex.Input
可以为您提供)。这并不是说您可以获得更好的延迟,而是您可以以有序且可靠的方式获取键盘事件(例如:这种方式您永远不会在单个帧上获得两个键,从而导致不明确的顺序)。
更重要的是,这样您就可以在 Windows 有机会应用输入处理之后获取事件。例如,这使您在键入 ana
和 an之间有所不同A
。或者有人使用 alt+numpad 输入字符,或应用变音符号。缺点是您错过了各种非文本键,如您提到的 , Alt
,F10
等Pause
。
最后,快速阅读Nuclex.Input
表明它至少应该提供您想要的键 - 特别是IKeyboard.KeyPress
和.KeyRelease
. 如果它不起作用,则可能是Nuclex
. 或者您系统上的某些东西正在干扰窗口消息。
一种可能的解决方法可能是通过轮询它们来接受这些缺失键的延迟。使用轮询作为无缝回退的代码可能相当简单。