遊戲中物件選取的方法

2021-03-31 16:33:29 字數 1311 閱讀 9347

對於pc遊戲,在滑鼠大行其道的今天,如何由滑鼠的位置判定其下的物件是什麼,是幾乎所有遊戲都必須面對的問題。

以下提供幾種方法,僅供參考。

1、包圍框法:

一般的,對遊戲中的每個物件建立乙個伴隨的包圍框,通過遍歷所有可見物件,判定滑鼠座標點是否落在某個包圍框的內部來獲取其選取的物件。這種方法的優點是簡單,演算法容易理解,當使用矩形包圍框,而物件數量又比較有限的時候,效率也是很好的。缺點是選取不夠精確,無法對物件的細節做選取。在2d遊戲中,包圍框一般是矩形,或者是若干個矩形的組合,而3d遊戲使用包圍盒,或者包圍球或其組合等方式。無論具體方式如何,其演算法實質都是一樣的。

2、列舉法:

效率最低的方法之一。和1,包圍框法類似,它也需要遍歷所有可見物件,但是由於缺少包圍盒機制,只能檢測物件位於滑鼠下的那個位置是否有有效象素,或者有效的alpha值,對3d物件而言,就是檢查滑鼠點形成的選取射線是否穿越物件的某個麵片。這種方法可以實現很精確的選取,但是由於效率太低,所以很少直接使用,一般先使用方法1減少遍歷物件的數量之後,再使用這個方法達到精確的選取。

3、反饋法:

這是乙個很有效,也很快捷的方法,尤其在3d遊戲中,有無可比擬的優越性。反饋法的實現很簡單,首先要維護乙個後台緩衝區,當繪製目標物件的時候,同時將物件的可見資訊(一般是物件的alpha值,或者z值) 寫入後台緩衝,然後檢測滑鼠對應的緩衝區的位置的值是否有變化,如果變化了,表明剛才繪製的物件可以被滑鼠選中。當緩衝使用了複雜一些的z運算的時候,我們在繪製完成之後,就可以得到乙個滑鼠可以選取的物件列表,然後只要簡單的根據一定的原則從這個列表中提取需要的物件就可以了。這個機制在2d下,一般不維護額外的緩衝區而直接使用繪圖緩衝區。3d下,像opengl提供了內建的反饋方法,更方便了使用者的使用。實際也可以利用z buffer,模板緩衝等實現類似的機制。這種方法可以實現精確到象素級的選取,而幾乎不影響執行效率。缺點是需要對繪製部分的**有很高的控制許可權。

4、直接對映法:

這也是乙個高效演算法,可以達到o(1)的時間複雜度。常見於2d戰棋類遊戲中。在這類遊戲中,場景是用乙個二維表儲存的,表的每個項,儲存著它上面的物件資訊,我們可以通過乙個簡單的演算法,由當前的滑鼠位置得到表的索引,然後直接讀取索引對應的項就完成了選取。在固定視角的3d遊戲甚至非固定視角的3d遊戲中,也可以使用這種方法。這種方法的缺點是物件在場景中,只能是按二維表,或者多層二維表排布的。這種方法對記憶體空間的需求也比較大。棋牌類遊戲比較適合使用這種方法。

由於每種方法都有其固有的優缺點,而對遊戲而言,場景又千變萬化,複雜紛繁。為了能適應實際的需求,上面的方法可以組合使用,從而揚長避短,更好的達成需求。其他一些複雜的選取,比如範圍選取(框選)等,也可以由以上幾種基本的方法演化而來。

遊戲中的物件資源資訊管理

首先要說明的是資源格式。資源格式一般存放如下格式資源 part0 part1 part2 乙個很好的例子就是模型資訊檔案,在乙個模型資訊檔案中,存放了整個物體的所有部分,每乙個部分又是單獨的資訊。這樣做的目的在於遊戲中的換裝。還有乙個例子就是特效檔案,比如將乙個門派的技能做為乙個特效檔案,而這個特效...

遊戲中的指令碼

現在遊戲裡流行的指令碼有python 和lua 例如魔獸世界就是用lua指令碼來驅動邏輯的。我們為什麼用指令碼,而不是純用c 呢?當然,這與團隊協作以及工作效率有關。c 編譯速度不佳,當乙個專案達到比較龐大的乙個規模時,編譯的時間往往會讓人憤怒了。於是,python出現了。一些重要的演算法實現,圖形...

遊戲中的音效

1.遊戲中的即時音效 soundpool類 public int load context context,int resid,int priority 架子啊音訊檔案 context 該引數為應用程式的上下文 resid 該引數為要載入的音效資源的id priority 優先順序 例項 初始化聲音...