2010-11-10 86 views
5

我正在爲遊戲製作一個gui API,並且一個請求的功能是一個搖動事件。基本上是一個非常類似於Windows 7的Aero Shake的事件。當鼠標停下時,如果它快速地單向來回移動,事件就會被觸發。我只是不確定什麼類型的psedocode會進入這個?實施搖動事件?

+1

你的目標是哪個操作系統?你使用哪種遊戲框架? – 2010-11-10 23:17:45

+0

它不應該是特定平臺,我可以創建定時事件,獲取鼠標位置等, – jmasterx 2010-11-10 23:19:59

回答

9

我可能會考慮這樣的事情:

  1. 總是創建鼠標在其最後一次搬家行進的方向的矢量
  2. 始終保持直接前載體的記錄,爲你收集的未來矢量(這意味着你總是有兩個向量來評估)。
  3. 做兩個向量的點積,當每個鼠標輸入到達。如果點積是正數,則忽略它。如果它是負數,那麼用它設置一個時間值並存儲在一個數組中,以存儲可能多達五個這些時間戳。
  4. 重複上述順序。如果時間戳數組有一組連續的時間戳,每個時間戳相差一定的ε,那麼你可以假設有人在抖動某物。 :)
+0

我可能是錯的,但在(4)你不是指delta而是epsilon? – ocodo 2010-11-10 23:29:49

+0

@slomojo:'epsilon'我的意思是一個非常小的三角洲。鑑於其在演算中的使用,也許epsilon是一個超過陳述。 :) – 2010-11-11 00:17:42

6

您需要計算鼠標移動的變化。如果鼠標在小於0.7秒的時間內改變方向3次以上,那麼這是一次搖動。永遠檢測最後5個鼠標座標的方向軌跡變化。如果點P0爲最後,並且P5倒數第五,則計算在P0-P3和P3-P5之間形成的角度。如果角度小於5度,則鼠標改變方向。

+0

這樣的事情可能是最好的解決方案。畢竟,這不是一門精確的科學。 – rtpg 2010-11-10 23:26:37

+0

取決於樣本大小和頻率。鼠標的每一次移動都可能產生事件。如果樣本過於靠近,最終會出現更像是曲線而非銳角的曲線。特別是因爲很少有人擅長將光標正好朝相反的方向移動 - 運動常常會變圓。 – cHao 2013-02-14 16:45:05

3

一般的想法是這樣的:

在按下鼠標:

  1. 商店當前位置爲(x0, y0)
  2. Set slope = 0
  3. Set start time = current time

在鼠標移動:

  1. 商店當前位置(x, y)
  2. Set 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
+0

儘管如此,請注意有人將鼠標正好垂直移動的可能性 - 在我看來,這很容易導致「除零」異常/錯誤。 – cHao 2013-02-14 16:37:06

0

我發現更多的優雅和更多的點答案。跟蹤最後N個(比如20個)鼠標位置。這些位置由頂部最小的矩形(P(N).top),底部=最大(P(N)。底部)等限定。計算鼠標在最後N次移動的總距離。如果總行程距離比矩形的周長大K倍,那麼這是一個動搖。