默认XNA输入不提供可在帧处理期间调用某些方法的事件处理程序(在更新调用之间,在按下某个键时立即调用)。
我尝试使用Nuclex.Input,但它有一些缺陷 - 像F10,Alt和Pause这样的键不会激活分配的事件。其中一些键出现在GetKeyboard().GetState().GetPressedKeys()
列表中,但其中一些没有,这对于制作快捷键是不可接受的。
如果有办法让XNA的默认输入管理器处理事件,我会很高兴,但我没有看到有人说这是可能的。所以我可能正在寻找其他一些输入管理器,可以通过按下/释放事件处理程序为我提供任何按键操作。
或许有一些方法可以避免使用第三方库,例如为任何按键/释放启动处理程序事件等Windows挂钩?
或者整个XNA输入方式被打破,更高级别的游戏引擎使用完全不同的方法?
我看到everybody过去几年一直在使用XInput。
答案 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)。