0

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

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

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

4

1 回答 1

0

通常您将输入的状态存储在前一帧上,然后测试输入是否在帧之间发生了变化。例如,您的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,F10Pause


最后,快速阅读Nuclex.Input表明它至少应该提供您想要的键 - 特别是IKeyboard.KeyPress.KeyRelease. 如果它不起作用,则可能是Nuclex. 或者您系统上的某些东西正在干扰窗口消息。

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

于 2013-02-24T06:52:05.543 回答