正在执行震动事件?

问题描述 投票:5回答:4

我正在制作游戏的gui API,其中一项要求提供的功能是震动事件。本质上是与Windows 7的Aero Shake非常相似的事件。当鼠标按下时,如果将鼠标单向快速移动,将触发该事件。我只是不确定哪种类型的psedocode会进入此代码?

c++ algorithm pseudocode
4个回答
9
投票

我可能会考虑这样的事情:

  1. 总是为鼠标最后移动的方向创建一个矢量
  2. [在收集下一个向量时,请始终保留前一个向量的记录(这意味着您始终有两个要评估的向量)。
  3. 在每个鼠标输入到达时,对两个向量进行点积运算。如果点积为正,则忽略它。如果它是负数,则设置一个时间值并将其存储在一个数组中,最多可以存储其中五个时间戳。
  4. 重复上述顺序。如果时间戳数组具有一组连续的时间戳,每个时间戳之间存在一些差异,那么您可以假定某人在摇晃某物。 :)

6
投票

您需要计算鼠标移动的变化。如果鼠标在不到0.7秒的时间内改变方向3次以上,则表示摇晃。要永久检测方向跟踪的变化,请最后5个鼠标坐标。如果点P0在最后,而点P5在倒数第五,则计算点P0-P3与点P3-P5之间的夹角。如果角度小于5度,则鼠标更改了方向。


3
投票

一般的想法是这样的:

在鼠标按下时:

  1. 将当前位置存储为(x0, y0)
  2. 设置slope = 0
  3. 设置start time = current time

在鼠标移动时:

  1. 将当前位置存储为(x, y)
  2. 设置newSlope = abs((y - y0) / (x - x0))。 (这表示鼠标相对于起始位置的移动方向)
  3. 如果是abs(newSlope - slope) < some threshold,则用户仍沿相同方向移动:然后检查current time - start time > shake time,如果是,则触发震动事件并重置start time
  4. 否则,用户已改变方向。设置slope = newSlope并重置start time = current time

1
投票

我发现更优雅,更切合实际。跟踪最后N个(例如20个)鼠标位置。这些位置由顶部为最小值(P(N).top),底部=最大值(P(N).bottom)等的矩形为边界。计算这最后N次鼠标移动的总距离。如果行进的总距离比该矩形的周长大K倍以上,那就太可笑了。

您可能希望根据时间确定N。仅取用最长不超过1.5秒左右的旧鼠标位置。

© www.soinside.com 2019 - 2024. All rights reserved.