我正在爲遊戲製作一個gui API,並且一個請求的功能是一個搖動事件。基本上是一個非常類似於Windows 7的Aero Shake的事件。當鼠標停下時,如果它快速地單向來回移動,事件就會被觸發。我只是不確定什麼類型的psedocode會進入這個?實施搖動事件?
實施搖動事件?
回答
我可能會考慮這樣的事情:
- 總是創建鼠標在其最後一次搬家行進的方向的矢量
- 始終保持直接前載體的記錄,爲你收集的未來矢量(這意味着你總是有兩個向量來評估)。
- 做兩個向量的點積,當每個鼠標輸入到達。如果點積是正數,則忽略它。如果它是負數,那麼用它設置一個時間值並存儲在一個數組中,以存儲可能多達五個這些時間戳。
- 重複上述順序。如果時間戳數組有一組連續的時間戳,每個時間戳相差一定的ε,那麼你可以假設有人在抖動某物。 :)
我可能是錯的,但在(4)你不是指delta而是epsilon? – ocodo 2010-11-10 23:29:49
@slomojo:'epsilon'我的意思是一個非常小的三角洲。鑑於其在演算中的使用,也許epsilon是一個超過陳述。 :) – 2010-11-11 00:17:42
您需要計算鼠標移動的變化。如果鼠標在小於0.7秒的時間內改變方向3次以上,那麼這是一次搖動。永遠檢測最後5個鼠標座標的方向軌跡變化。如果點P0爲最後,並且P5倒數第五,則計算在P0-P3和P3-P5之間形成的角度。如果角度小於5度,則鼠標改變方向。
一般的想法是這樣的:
在按下鼠標:
- 商店當前位置爲
(x0, y0)
。 - Set
slope = 0
。 - Set
start time = current time
。
在鼠標移動:
- 商店當前位置
(x, y)
。 - Set
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
。
儘管如此,請注意有人將鼠標正好垂直移動的可能性 - 在我看來,這很容易導致「除零」異常/錯誤。 – cHao 2013-02-14 16:37:06
我發現更多的優雅和更多的點答案。跟蹤最後N個(比如20個)鼠標位置。這些位置由頂部最小的矩形(P(N).top),底部=最大(P(N)。底部)等限定。計算鼠標在最後N次移動的總距離。如果總行程距離比矩形的周長大K倍,那麼這是一個動搖。
- 1. 實施搖動事件
- 2. Android搖動事件
- 3. UITextField停止搖動事件?
- 4. 如何實施事件
- 5. 搖擺/「選擇列表」的實施AWT
- 6. 搖動事件在各種設備上的工作方式不同搖動事件自定義實現
- 7. UIImageView在UIPinchGestureRecognizer事件中動搖
- 8. CoreMotion的startAccelerometerUpdates ::不提供搖動事件
- 9. UISlider滑停在實施UITouch事件滑動
- 10. 實施Laravel雄辯模型事件 - 檢查引發的事件
- 11. iPhone:實現搖動手勢
- 12. 手動實施UpdatePanel
- 13. CakePHP 3 - 已實現的事件() - 未觸發已實施的事件
- 14. 爲什麼在owin實施之後,招搖即止?
- 15. 移動網絡應用程序中的搖動事件
- 16. 如何實施acra活動?
- 17. 實施自動註銷
- 18. 實施活動指標
- 19. 動態WebService的實施
- 20. Laravel雄辯活動實施
- 21. 實施域驅動設計
- 22. Android活動組實施
- 23. 自動完成實施
- 24. 如何對Prolog事實施加約束?
- 25. 使用搖動API檢測搖動
- 26. iPhone搖事件不能正常工作
- 27. Javascript。聆聽iPhone搖擺事件?
- 28. iPhone搖事件不起作用
- 29. 使用滾動事件正確實施GA增強型電子商務addImpression
- 30. 如果設備檢測到搖動事件,則喚醒屏幕
你的目標是哪個操作系統?你使用哪種遊戲框架? – 2010-11-10 23:17:45
它不應該是特定平臺,我可以創建定時事件,獲取鼠標位置等, – jmasterx 2010-11-10 23:19:59