簡體   English   中英

測試玩家是否單擊了Java游戲中許多對象之一的有效方法是什么?

[英]What's an efficient way to test if a player has clicked on one of many objects in a Java game?

這是一個基本的問題,但是由於我已經很長時間沒有編寫Java編碼了,所以我希望從經驗豐富的人那里獲得意見。 假設我有一個Java游戲,其中屏幕上有許多對象(大約30個對象)。 播放器可以單擊一個對象,並且每個對象以不同的方式處理鼠標單擊。

我的問題是:如果玩家單擊游戲窗口,什么是測試他是否單擊了一個對象的好方法,如果是,則觸發該對象的鼠標單擊事件處理程序?

到目前為止,這是我想出的東西:我的小程序有一個鼠標偵聽器,它還可以列出當前存在的所有游戲對象。 applet的事件處理程序可以遍歷對象列表,並通過gameObject.isInsideBBox(int mouseX, int mouseY)類的東西查看單擊的坐標是否在該對象的邊界框內。

設置起來很簡單,但是我覺得效率很低。 如果對象的數量很大,則每次用戶單擊該程序都必須遍歷該列表。 這不是性能問題嗎?

一種選擇是讓每個對象都有自己的MouseListener並將所有對象添加到某種全局容器中。 就性能而言,此方法是否會比上述方法更有效? 另一個問題是這些Component和Container對象似乎是在Java的Swing庫中定義的,但是我沒有將Swing用於任何其他目的。 我覺得那是對圖書館的濫用。

有任何意見/建議嗎?

(我很想知道這些方法是否可以移植到Android。我意識到這是一個不同的話題,但是如果您對此有任何見解,希望您能告訴我。)

屏幕上的30個對象已經足夠少了,應該沒什么大不了的。 一個簡單的線性搜索應該仍然足夠容易地快速。 唯一的真正原因考慮進行優化,這將是,如果“30”可能是路要走 ,而且你真的處理(說)1000+對象。

在這種情況下,一種簡單的可能性就是按一維對對象進行排序,以便您可以對該維進行二進制搜索。 那應該只剩下幾個對象可以在另一個方向上搜索以找到正確的值。

正如@Jerry Coffin所說的,對於少量對象,線性搜索應該很好。

對於大量對象,線性搜索的比例嚴重降低。

  • 如果對象是固定的,則可以將屏幕划分為區域層次結構。 例如四叉樹 ,然后將每個對象放入葉區域。 這樣可以減少需要檢查的對象數量。

  • 如果對象快速移動,我認為四叉樹不會起作用。 每次移動對象時,都需要重新計算其在四叉樹中的位置,這很昂貴。

  • 對於緩慢移動的對象,只要每個對象都知道其當前位於哪個四叉樹區域中,四叉樹就可以工作。 (檢查對象是否仍在區域中是O(1) 。)

每個對象以不同方式處理鼠標單擊。

每個對象都有自己的MouseListener

給定要求,這聽起來是一個不錯的解決方案。

如果您的游戲對象是從實現Shape接口的類派生的,則conatains()方法之一可能就足夠了。 示例可以使用線性搜索處理數千個對象。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM