更好的XNA游戏键盘输入

时间:2013-02-23 20:21:37

标签: input xna

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

我尝试使用Nuclex.Input,但它有一些缺陷 - 像F10,Alt和Pause这样的键不会激活分配的事件。其中一些键出现在GetKeyboard().GetState().GetPressedKeys()列表中,但其中一些没有,这对于制作快捷键是不可接受的。

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

或许有一些方法可以避免使用第三方库,例如为任何按键/释放启动处理程序事件等Windows挂钩?

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


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

2 个答案:

答案 0 :(得分: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

firstCurrentStateI & ~secondCurrentStateI

答案 1 :(得分:0)

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

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