Input 更好的XNA游戏键盘输入

Input 更好的XNA游戏键盘输入,input,xna,Input,Xna,默认XNA输入不提供事件处理程序,该事件处理程序可能在帧处理期间调用某些方法(在更新调用之间,当按下键时立即调用) 我试着使用Nuclex.Input,但它有一些缺陷——像F10、Alt和Pause这样的键不能触发指定的事件。其中一些键出现在GetKeyboard().GetState().GetPressedKeys()列表中,但其中一些键没有,这对于创建快捷键是不可接受的 如果有办法使XNA的默认输入管理器能够处理事件,我会很高兴,但我还没有看到有人说这是可能的。因此,我可能正在寻找一些其他

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

我试着使用Nuclex.Input,但它有一些缺陷——像F10、Alt和Pause这样的键不能触发指定的事件。其中一些键出现在
GetKeyboard().GetState().GetPressedKeys()
列表中,但其中一些键没有,这对于创建快捷键是不可接受的

如果有办法使XNA的默认输入管理器能够处理事件,我会很高兴,但我还没有看到有人说这是可能的。因此,我可能正在寻找一些其他的输入管理器,它可以为我提供任何按键,可以使用press/release事件处理程序

或者,也许有某种方法可以避免使用第三方库,方法是使用windows挂钩,比如为任何按键/释放启动处理程序事件

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



我知道在过去的几年里,他一直在使用XInput。

这里是我的一个老项目中的一些代码。它查找两个
键盘状态
对象之间的差异。具体来说,它返回一个
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;
}


目前,我已经在XNA游戏中使用Nuclex.Input,但我仍在寻找更好的替代方案


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

如果我的问题误导您认为我需要一种方法来找出当前和以前键盘状态之间的差异,我很抱歉。我所寻找的是一种在每次按键/释放时立即做出反应的方法,即使是在画面之间。做什么?我需要一个事件处理程序。为什么?在下一次更新时处理按键有什么问题?当然,你一定注意到有时候在两次更新调用之间按键或鼠标按钮被按下或释放得太快,游戏无法检测到。它会导致错误的文本输入和错过的点击。这不是我所说的一个令人满意的游戏输入管理。你确认这是一个问题吗?我认为在1/60秒内按下并释放一个键是相当困难的。
~firstCurrentStateI & secondCurrentStateI
firstCurrentStateI & ~secondCurrentStateI