实施震动事件?

时间:2010-11-10 23:12:28

标签: c++ algorithm pseudocode

我正在为游戏制作一个gui API,一个请求的功能是震动事件。基本上是一个非常类似于Windows 7的Aero Shake的事件。当鼠标按下时,如果它快速地单向来回移动,则会触发该事件。我只是不确定什么类型的psedocode会进入这个?

4 个答案:

答案 0 :(得分:9)

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

  1. 始终为鼠标最后一次移动的方向创建一个向量
  2. 总是记录前一个向量,当你收集下一个向量时(这意味着你总是要评估两个向量)。
  3. 当每个鼠标输入到达时,做两个向量的点积。如果点积为正,则忽略它。如果它是负数,那么用它设置一个时间值并存储在一个数组中,最多可存储五个时间戳。
  4. 重复上述顺序。如果时间戳数组有一组连续的时间戳,每个时间戳都有一些不同的epsilon,那么你可以假设某人正在发抖。 :)

答案 1 :(得分:6)

您需要计算鼠标移动的变化。如果鼠标在小于0.7秒的时间内改变方向超过3次,那么它就是震动。要始终检测方向轨迹的变化,最后5个鼠标坐标。如果P0点是最后一个,P5是倒数第五个,则计算P0-P3和P3-P5之间的角度。如果角度为5度,则鼠标改变方向。

答案 2 :(得分:3)

一般的想法是这样的:

关闭鼠标:

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

    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

答案 3 :(得分:0)

我发现更优雅,更重要的是答案。跟踪最后N个(比如20个)鼠标位置。这些位置由矩形界定,其顶部最小(P(N).top),底部=最大(P(N).bottom)等。计算鼠标在最后N次移动的总距离。如果行进的总距离比那个矩形的周长大K倍,那么它就是震动。