簡體   English   中英

我應該使用哪種類型的容器來容納基於2D Tile的世界的Tile對象?

[英]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(其中一些對象可能會不斷移動,可以被破壞或添加,例如放下/撿起物品,而另一些則可以保持靜止如樹或岩石)。

我認為您應該從世界上的坐標到世界上這些坐標中包含的事物的vectormap

例如,如果我有一個Thing類來表示游戲空間中可以存在的任何事物,並且有一個帶有xy參數的Position類,那么我將得到:

map<Position, vector<Thing>>

用一個vector<Thing>初始化,最初是空的,用於游戲中的每個位置(全部10000個)。

這為您提供了有用的屬性:

空間分區。 如果我想弄清楚周圍的事物,我只需要在9個不同的位置查看地圖即可。 如果我走另一條路,並有一個大listThing小號未分區由他們在哪里,我要看看每一個Thing在游戲中,以確保我會看到每一個Thing ,可能是靠近我。

這提供了巨大的加速比:1)地圖越大,2) Things存在的越多3)您需要的本地交互的種類越復雜。


如果您有ThingID並且需要與Thing關聯而不知道它在哪里怎么辦? 為了解決這個問題,您可以將ThingID的大map<int, Thing> ThingIDThing然后在其中查找。 當然,我們在這里看到了一些冗余-我們既可以將Thing存儲在平面地圖中,也可以存儲在按位置地圖中,並且讓另一個僅作為另一個的引用(在前一種情況下,僅包含當前位置) -在后一種情況下,僅包含ThingID),並且必須保持同步。

這甚至可能導致解決“龍”問題-如果Things在平面圖中,而僅參考存儲在按位置映射中,則您的Dragon可能在平面圖中只有一個條目和四個參考(每個參考一個位置地圖中的所有位置都指向同一事物。 然后,您只需要編寫謹慎的代碼即可避免與對象發生兩次交互,只是因為它恰巧在它考慮的兩個位置找到了它!

暫無
暫無

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

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