2013-02-23 79 views
0

默认XNA输入不提供可能在帧处理期间(在更新调用之间,当按下按键时立即调用某种方法)的事件处理程序。XNA游戏更好的键盘输入

我试过使用Nuclex.Input,但它有一些缺陷 - 像F10,Alt和Pause这样的键不会触发指定的事件。其中一些键出现在GetKeyboard().GetState().GetPressedKeys()列表中,但其中一些键不存在,这对于制作快捷键而言是不可接受的。

如果有办法让XNA的默认输入管理器能够处理事件,我会很高兴,但我还没有看到有人说这是可能的。所以我可能正在寻找一些其他的输入管理器,可以给我任何按键,可以按压/释放事件处理程序。

或者,也许有一些方法可以避免使用第三方库通过使用Windows的钩子,如任何按键/释放发射处理程序事件?

或者这个整个XNA输入方式被破坏了,而更高等级的游戏引擎使用了完全不同的方法?


我看到everybody在过去的几年里一直在使用XInput。

回答

0

更换

~firstCurrentStateI & secondCurrentStateI 

现在我已转向使用Nuclex.Input我的XNA游戏,但我仍然在寻找更好的选择。

Nuclex.Input的一些问题是它没有区分左右Shift或Ctrl按钮,并且没有检测到某些键(包括F10,左Alt,PrintScreen和Pause)。

0

下面是我的一个旧项目的一些代码。它找到两个KeyboardState对象之间的差异。具体而言,它会返回一个KeyboardState,其中包含第二个关键字但不是第一个关键字。

KeyboardState GetKeysPressedBetween(KeyboardState first, KeyboardState second) 
{ 
    KeyboardState pressed = new KeyboardState(); 
    for (int i = 0; i < 8; i++) 
    { 
     FieldInfo currentStateI = typeof(KeyboardState).GetField("currentState" + i, BindingFlags.NonPublic | BindingFlags.Instance); 
     uint firstCurrentStateI = (uint)currentStateI.GetValue(first); 
     uint secondCurrentStateI = (uint)currentStateI.GetValue(second); 
     currentStateI.SetValueDirect(__makeref(pressed), ~firstCurrentStateI & secondCurrentStateI); 
    } 
    return pressed; 
} 

这通常每帧调用一次,比较当前状态和前一个状态。

的代码可以修改,以获得发布的钥匙,通过与

firstCurrentStateI & ~secondCurrentStateI 
+0

对不起,如果我的问题误导你认为我需要一种方法来查找当前和以前的键盘状态之间的差异。我正在寻找的是一种即时在各个帧之间即时对每个按键/按键进行反应的方式。 – user1306322 2013-02-23 21:09:40

+0

为什么你不能在更新?这对我来说非常合适。 – 2013-02-23 21:10:41

+0

做什么?我需要一个事件处理程序。 – user1306322 2013-02-23 21:11:29