2013-09-23 74 views
0

我很困惑應用程序如何使用Direct2D處理鼠標輸入。Direct2D C++用戶輸入

考慮這樣的情況:

  1. 說我畫了一個球的窗口。如果我將光標移到球上,它會改變顏色。
  2. 這是否意味着應用程序必須輪詢鼠標,並檢查遊標是否在應用程序運行時間的每一秒都在球上。
  3. 當你有更多的項目時,這不會降低性能嗎?有沒有另一種方式比輪詢,換句話說,是一堆if語句。

回答

1
  1. 您需要在鼠標移動或球移動時執行命中測試。
  2. 高效命中測試/碰撞檢測是遊戲開發中的一個主要關注點。如果性能成爲問題,碰撞檢測通常分兩個階段進行:「寬階段」和「窄階段」。廣義階段的一種方法是quad trees(對於二維):空間(窗口)被分成「部分」;每個球和鼠標根據其位置被分配到一個部分。只有在與鼠標相同的部分中的球纔是窄階段的候選者。在狹窄階段,您只需測試在廣泛階段中倖存的候選人。
0

通常,應用程序將偵聽WM_MOUSEMOVE事件並更新事件處理程序中的任何受影響的對象(或者在發生昂貴的操作時發出更改事件的對象信號)。渲染代碼不需要輪詢鼠標光標的位置。

+0

還有對WM_MOUSEMOVE事件進行測試,它基本上輪詢每一幀。 – bluejamesbond

+0

你能說清楚你的意思嗎?如果代碼正在更新WM_MOUSEMOVE事件上的模型,那麼它不會輪詢每一幀,因爲WM_MOUSEMOVE不是輪詢機制。當鼠標移動時,Windows將發送事件。 – gigaplex

+0

@ gigaplex.So我的意思是說...雖然WM_MOUSEMOVE不是一個輪詢方法,但確定您的光標在窗口的某個區域中的邏輯非常類似於輪詢。鼠標每移動一個像素點,你都必須瀏覽你繪製的所有項目列表,以查看在鼠標移動時這些項目是否具有行爲的情況下,鼠標是否在該項目上。這不是很慢嗎? – bluejamesbond