实际上,我在Xbox Controller Input上遇到了这个难题。尽管不完全相同,但非常相似。您可以在我的示例中更改代码以适合您的需求。
编辑:您的情况将使用此->
https://docs.microsoft.com/zh-CN/windows/desktop/api/winuser/ns-winuser-tagrawmouse
您可以通过->了解如何创建原始输入类
https://docs.microsoft.com/zh-CN/windows/desktop/inputdev/raw-input
但是..现在使用超级棒的算法...不是真的,但是嘿..这很酷:)
*因此...我们可以存储每个按钮的状态,以及按下,释放和按下的状态!!!我们还可以检查保持时间,但这确实需要一个if语句,并且可以检查任意数量的按钮,但是有关此信息,请参见下面的一些规则。
显然,如果我们要检查是否有按下,释放等操作,则可以执行“ If(This){}”,但这显示了如何获取按下状态,然后将其关闭下一帧,因此您的“ ismousepressed”在您下次检查时实际上为假。
完整代码在这里:https :
//github.com/JeremyDX/DX_B/blob/master/DX_B/XGameInput.cpp
怎么运行的..
因此,我不确定在描述按钮是否按下时收到的值,但是基本上,当我在XInput中加载时,我会得到一个介于0到65535之间的16bit值,该值具有“ Pressed”的15位可能状态。
问题是我每次检查时都会得到信息的当前状态。我需要一种将当前状态转换为“已按下”,“已释放”和“保持值”的方法。
所以我要做的是以下几点。
首先,我们创建一个“ CURRENT”变量。每次检查此数据时,我们都会将“ CURRENT”设置为“ PREVIOUS”变量,然后将新数据存储为“ Current”,如下所示->
uint64_t LAST = CURRENT;
CURRENT = gamepad.wButtons;
有了这些信息,这就是令人兴奋的地方!!
现在,我们可以确定按钮是否处于按下状态!
BUTTONS_HOLD = LAST & CURRENT;
这基本上是将两个值进行比较,两者中显示的任何按钮按下都将保持为1,其他所有设置为0。
即(1 | 2 | 4)&(2 | 4 | 8)将产生(2 | 4)。
现在,我们已经“按下”了哪些按钮。我们可以得到其余的。
按下很简单..我们进入“当前”状态并删除所有按住的按钮。
BUTTONS_PRESSED = CURRENT ^ BUTTONS_HOLD;
释放是相同的,只是我们将其与LAST状态进行了比较。
BUTTONS_RELEASED = LAST ^ BUTTONS_HOLD;
因此,请看紧迫情况。如果说当前我们有2 | 4 | 8按下。我们发现2 | 4在哪里举行。当我们删除保留位时,我们只剩下8位。这是此周期中新按下的位。
相同的也可以应用于发布。在这种情况下,“ LAST”设置为1 |。2 | 4.因此,当我们删除2 | 4位。我们剩下1。因此自上一帧以来释放了按钮1。
上面的情况可能是您可以进行位比较的最理想的情况,它提供了3个级别的数据,没有if语句,也没有为循环提供3个快速位计算。
我还想记录保持数据,因此尽管我的情况并不完美……它的作用是基本上设置了我们要检查的保持位。
因此,每次设置压榨/释放/保持数据时,我们都会检查保持数据是否仍等于当前的保持位检查。如果没有,我们将时间重置为当前时间。在我的情况下,我将其设置为帧索引,因此我知道将其保留多少帧。
这种方法的缺点是我无法获得单独的保持时间,但是可以一次检查多个位。即,如果将保持位设置为1 | 16如果不保留1或16,则将失败。因此,需要按住所有这些按钮才能继续滴答。
然后,如果您查看代码,将看到所有简洁的函数调用。
因此,您的示例将简化为仅检查是否发生了按下按钮的情况,并且使用此算法一次只能按下一次按钮。在下一个要按下的支票上,该按钮将不存在,因为您不能再按一次,则必须先松开,然后才能再次按下。