矢量地图,坏访问者

时间:2014-04-07 23:57:16

标签: c++ vector map exc-bad-access tiling

我正和几个朋友一起玩Dungeon游戏,正在寻找路径。游戏是基于图块的,我们计划实现的寻路是:

类PathMapper生成每个图块来自给定图块

的距离网格

类怪物使用这个网格前往一个给定的图块(现在,总是一个玩家)

我们计划有4名玩家,但我们/我希望脚本支持动态数字。每个玩家都有一个整数形式的ID。

每个玩家都需要一个由PathMapper生成的网格,并且所有怪物都可以共享它们(生成网格的速度很慢,对于所有怪物,每个玩家只执行一次,对于寻路来说似乎是一个不错的解决方案)。 / p>

我有一个名为" PathMapper"生成距离瓦片的网格来自起始瓦片。理论上,其中4个将被创建 - 每个玩家一个。对于寻找玩家的路径的敌人,它会询问玩家的ID,然后询问相应的磁贴网格,它将用于寻路。服务器用" createMap(playerID,playerXPosition,playerYPosition)"更新这些网格。

因此每个网格都是一个矢量矢量,它映射到私人地图中的玩家ID,并且#34; pathMap",怪物将使用" getLocalPath访问的值()"

问题是,虽然" createMap"一旦尝试复制第一个墙,就编译好(" pathMap [ID] [x] .push_back(9000);")我得到" EXE_BAD_ACCESS"。我应该注意到它在尝试(并且失败)插入" 9000"之前经历了大约十二次迭代。我相信地牢 - >宽度和地牢 - >高度是正确的(现在都是20;对于真实游戏可能是~100),以及正确性' ID不应该影响代码的访问者,对吧?

我有点困惑,b / c我认为我正在做的是保留空间,循环通过它,并尝试访问我只是保留的内存:

reserve(20)
for(i=0; i<20; i++)
    reserve(20)
    for(j=0; j<20; j++)
        access(i,j) // error!?

以下是代码:

class PathMapper{
public:
    PathMapper(Dungeon* d);
    void createMap(int ID, int x, int y);

    // returns values of the surrounding tiles (up, right, down, left)
    std::vector<int> getLocalPath(int ID, int x, int y);
private:
    Dungeon* dungeon;
    std::vector< std::vector<bool> > wallBitmap;
    std::map<int, std::vector< std::vector<int> > > pathMap;
}

PathMapper::PathMapper(Dungeon* d) {
    dungeon = d;
    wallBitmap = dungeon->getWalls(); // bools tell if there is a wall on a tile
}

void PathMapper::createMap(int ID, int x, int y) {
    pathMap[ID].reserve(dungeon->width());
    for(int x=0; x<dungeon->width(); x++) {
        pathMap[ID][x] = std::vector<int>();
        pathMap[ID][x].reserve(dungeon->height());
        for(int y=0; y<dungeon->height(); y++) {
            if(wallBitmap[x][y]) {
                pathMap[ID][x].push_back(9000); // error is here
            }
            else {
                pathMap[ID][x][y] = -1;
            }
        }
    }

    // code to calculate values here; shouldn't affect the code above

}

2 个答案:

答案 0 :(得分:2)

reserve不会更改矢量的大小(仅限容量),您需要resize

答案 1 :(得分:1)

要么

使用resize

pathMap[ID].resize(dungeon->width());
...
pathMap[ID][x] = std::vector<int>();
pathMap[ID][x].resize(dungeon->height());

或直接在构造函数中传递大小:

pathMap[ID].resize(dungeon->width());
...
pathMap[ID][x] = std::vector<int>(dungeon->height());