2012-06-12 27 views
0

我有一個像寵物小精靈或塞爾達一樣的2D自頂向下的45度遊戲。由於對象的y值決定了它的深度,因此需要按照y值的順序繪製對象。所以,當你站在一棵樹後面時,樹就會畫在你的播放器的頂部,看起來就像站在樹後面一樣。在呈現之前按y值排序對象?

我目前的設計是繪製一排瓷磚,然後畫出所有站在那一排上的玩家,然後畫下一行,然後畫出所有站在其上的玩家。這樣,任何具有比玩家更高的y值的圖塊都將被繪製在它們的前方以模擬深度。

但是,我的玩家目前是一個std::vector的對象,只需在繪製完所有貼圖後進行迭代和繪製即可。對於我的方法來說,我必須迭代瓦片的每一行的向量,並且只在它們位於當前行上時呈現,或者按照每個幀的y值對每個玩家進行排序。這兩種方法似乎都是CPU密集型的,也許我過度思考它,並且在這種類型的遊戲中有一種更簡單的模擬深度的方法。

編輯: 這個遊戲是一個MMORPG類型的遊戲,所以有可能是許多玩家/ NPC的走動這就是爲什麼我需要一個非常有效的方法。

想法或意見將不勝感激!

感謝

回答

0

(Disgregard我原來的建議,如果你讀它。這是愚蠢的)

據我所知,你基本上每次迭代排序容器您呈現幀;會有一個計算懲罰,並且不得不每次都進行一次複製和排序不會那麼糟糕(O(N log N)排序時間,我猜測)。

一個聰明的數據結構可能會幫助你;例如,一個包含遊戲對象向量作爲每個元素的數組。數組中的每個元素表示一行平鋪網格,並且您遍歷對象矢量並將它們放入深度緩衝區數組(這將花費大約O(N)時間)。然後,只需遍歷表示每一行的向量並依次繪製每個對象,再次O(N)。

有可能更聰明的z緩衝技術,但我會留給讀者一個練習。

1

您可以使用std::setstd::map而不是vector來保持對象的排序順序。不幸的是,您無法簡單地修改自己的位置,每次需要更改座標時都必須移除/插入。

0

只要你不是試圖根據其他標準對玩家進行排序,那麼每次你想通過它們迭代你的玩家時,你都可以通過y座標排序玩家。只要你使用一種按線性時間運行的排序,當輸入大部分排序時,你甚至可能不會爲此步驟產生O(n log n)時間。我在這裏假設你的隊員變化緩慢,他們的Y座標也會慢慢變化。如果是這種情況,那麼每當你需要對向量進行排序時,它就已經被大多數排序了,而像Smooth sort或Tim sort這樣的東西將會以線性時間運行。

對於C++,看起來您可以找到Tim排序的實現here

0

如果您有空間,另一個選擇是創建一個玩家列表數組,其索引是行號,數組包含該行玩家的集合。

正如我所提到的,這將需要一點額外的內存,並且每次玩家移動到不同的行時都會有一些令人興奮的事情發生,但是繪圖僅僅是遍歷行的問題,並繪製了存在的玩家在那一行。