[英]What type of Container should I use to hold a 2D Tile Based World's Tile Objects?
我有一個基於2D瓷磚的世界,它是使用一個簡單的數組創建的:World [100] [100]。
我打算使游戲成為多人游戲,所以我認為讓SERVER向CLIENT發送玩家周圍的所有圖塊以及僅CLIENT所需的信息會是一件好事:渲染什么紋理/精靈,以及渲染什么位置它。
為此,我認為最好創建自己的TILE類,該類具有tileType(草,沙,水等)並保存10個TileObjects的數組。 TileObject是一個包含三個變量的類:objectType(它是一個Character?一個Item?一棵樹?一個Rock?),一個int objectID(它鏈接到對象的實際位置,因此它知道Character是“ Leeroy Jenkins”)。 ”,然后可以將Leeroy的動畫和方向發送到CLIENT進行渲染。)和objectPosition(來自Tile的X&Y。如果需要,可以擴展到Tile之外。)
盡管使用此方法我不確定如何處理比單個圖塊大的對象或字符(例如,碰撞消耗許多圖塊的Dragon),但這聽起來是最好的設計。
我應該使用哪種類型的容器在TILE類中存儲TileObjects? 現在我有一個數組,但是我懷疑這樣做對性能好嗎? 一些圖塊可能具有0個TileObject,而另一些圖塊可能具有5+。 我使用10,是因為我嚴重懷疑是否會超過10。
class Tile
{
private:
TileObject TileObjects[10]; //up to 10 objects on a single tile
TileTerrainType tileTerrainType; //GFX to display Grass, Sand, Water, Swamp, etc.
}
我讀過許多不同的教程和書籍,他們爭論完全不同的容器類型:向量,映射,鏈接列表,數組。 我只是不知道什么是最好的存儲TileObjects(其中一些對象可能會不斷移動,可以被破壞或添加,例如放下/撿起物品,而另一些則可以保持靜止如樹或岩石)。
我認為您應該從世界上的坐標到世界上這些坐標中包含的事物的vector
的map
。
例如,如果我有一個Thing
類來表示游戲空間中可以存在的任何事物,並且有一個帶有x
和y
參數的Position
類,那么我將得到:
map<Position, vector<Thing>>
用一個vector<Thing>
初始化,最初是空的,用於游戲中的每個位置(全部10000個)。
這為您提供了有用的屬性:
空間分區。 如果我想弄清楚周圍的事物,我只需要在9個不同的位置查看地圖即可。 如果我走另一條路,並有一個大list
的Thing
小號未分區由他們在哪里,我要看看每一個Thing
在游戲中,以確保我會看到每一個Thing
,可能是靠近我。
這提供了巨大的加速比:1)地圖越大,2) Things
存在的越多3)您需要的本地交互的種類越復雜。
如果您有ThingID
並且需要與Thing
關聯而不知道它在哪里怎么辦? 為了解決這個問題,您可以將ThingID
的大map<int, Thing>
ThingID
到Thing
然后在其中查找。 當然,我們在這里看到了一些冗余-我們既可以將Thing
存儲在平面地圖中,也可以存儲在按位置地圖中,並且讓另一個僅作為另一個的引用(在前一種情況下,僅包含當前位置) -在后一種情況下,僅包含ThingID),並且必須保持同步。
這甚至可能導致解決“龍”問題-如果Things
在平面圖中,而僅參考存儲在按位置映射中,則您的Dragon可能在平面圖中只有一個條目和四個參考(每個參考一個位置地圖中的所有位置都指向同一事物。 然后,您只需要編寫謹慎的代碼即可避免與對象發生兩次交互,只是因為它恰巧在它考慮的兩個位置找到了它!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.