我正在制作游戏的gui API,其中一项要求提供的功能是震动事件。本质上是与Windows 7的Aero Shake非常相似的事件。当鼠标按下时,如果将鼠标单向快速移动,将触发该事件。我只是不确定哪种类型的psedocode会进入此代码?
我可能会考虑这样的事情:
您需要计算鼠标移动的变化。如果鼠标在不到0.7秒的时间内改变方向3次以上,则表示摇晃。要永久检测方向跟踪的变化,请最后5个鼠标坐标。如果点P0在最后,而点P5在倒数第五,则计算点P0-P3与点P3-P5之间的夹角。如果角度小于5度,则鼠标更改了方向。
一般的想法是这样的:
在鼠标按下时:
(x0, y0)
。slope = 0
。start time = current time
。在鼠标移动时:
(x, y)
。newSlope = abs((y - y0) / (x - x0))
。 (这表示鼠标相对于起始位置的移动方向)abs(newSlope - slope) < some threshold
,则用户仍沿相同方向移动:然后检查current time - start time > shake time
,如果是,则触发震动事件并重置start time
。slope = newSlope
并重置start time = current time
。我发现更优雅,更切合实际。跟踪最后N个(例如20个)鼠标位置。这些位置由顶部为最小值(P(N).top),底部=最大值(P(N).bottom)等的矩形为边界。计算这最后N次鼠标移动的总距离。如果行进的总距离比该矩形的周长大K倍以上,那就太可笑了。
您可能希望根据时间确定N。仅取用最长不超过1.5秒左右的旧鼠标位置。