0

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

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

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

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

还是整个 XNA 输入方式都被破坏了,而更高级别的游戏引擎使用了完全不同的方法?


我看到过去几年每个人都在使用 XInput。

4

2 回答 2

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
于 2013-02-23T21:06:02.773 回答
0

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

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

于 2013-08-13T07:30:34.200 回答