簡體   English   中英

將指針存儲在具有不同訪問方法的多個容器中是否不受歡迎?

[英]Is it undesirable to store pointers in multiple containers with different access methods?

我目前正在制作節點圖,以存儲我正在開發的2D游戲的圖塊/對象數據。 本質上,它是一個六邊形瓷磚的地圖,每個瓷磚上都有對象。

我當前的設置基本上是這樣的:

class HexCell {
public:
    HexCell* GetNeighbor(int dir) { return neighbors[dir]; };
private:
    HexCell* neighbors[6];
    // (x, y) position
    // Contents of cell
};

class HexGraph {
public:
    HexCell* GetCellByIndex(int index) { return cells[index]; };
    vector<HexCell*> GetCellsByGridIndex(int x, int y) { return grid[x][y]; };
private:
    vector<HexCell*> cells;
    vector< vector< vector <HexCell*> > > grid;
};

因此,目前有3種方式訪問​​HexCell:

  1. 通過cells[]隨機訪問(用於迭代整個列表)
  2. 使用grid[x][y]查找單元的子集(用於渲染)
  3. 圖節點的像元級遍歷(對游戲邏輯有用)

那么我的問題是: 為每個對象存儲8個指針(在一個cells一個存儲在grid而在其他單元grid最多存儲6個)是否浪費了內存?

是否有更好/更通用的方法來執行此操作,還是為了針對不同的用途使用不同的訪問方法而被接受的系統?

鑒於十六進制地圖只是具有直列和波浪行的2D網格,我建議將地圖數據存儲為HexCells的2D數組。 您將能夠基於X索引確定十六進制單元格的列是偶數還是奇數,以確定它是否是向下移動的十六進制圖塊之一

這是10x4數組中十六進制單元格及其對應的x,y索引的粗略表示,其中X%2 == 1是向下移十六進制單元格高度的1/2的列

0,0     2,0     4,0     6,0     8,0
    1,0     3,0     5,0     7,0     9,0
0,1     2,1     4,1     6,1     8,1
    1,1     3,1     5,1     7,1     9,1
0,2     2,2     4,2     6,2     8,2
    1,2     3,2     5,2     7,2     9,2
0,3     2,3     4,3     6,3     8,3
    1,3     3,3     5,3     7,3     9,3

使用此方法,您可以編寫邏輯來輕松確定X,Y的6個鄰居,而無需在每個十六進制單元格中存儲額外信息

暫無
暫無

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

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