是否不希望将指针存储在具有不同访问方法的多个容器中?

时间:2014-08-20 20:29:13

标签: c++ data-structures

我目前正在制作一个节点图来存储我正在处理的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;
};

目前有三种方法可以访问HexCells:

  1. 通过cells[]进行随机访问(对迭代整个列表很有用)
  2. 使用grid[x][y]查找单元格的子集(对渲染很有用)
  3. 图形节点的单元级遍历(对游戏逻辑有用)
  4. 我的问题是:为每个对象存储8个指针是一种可怕的内存浪费(一个cells一个存储在grid中,最多六个指针作为其他单元格的邻居吗

    是否有更好/更常见的方法来实现这一目标,或者它是否是一个可接受的系统,以便为不同的用途提供不同的访问方法?

1 个答案:

答案 0 :(得分:1)

鉴于十六进制地图只是一个带有直列和波浪行的2D网格,我建议将地图数据存储为HexCell的二维数组。您将能够根据X索引确定十六进制单元格的列是偶数还是奇数,以确定它是否是向下移动的六角形切片之一

以下是十六进制单元及其相应的x,y索引在10x4数组中的粗略表示,其中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个邻居,而不是在每个十六进制单元格中存储额外信息