我正和几个朋友一起玩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
}
答案 0 :(得分:2)
答案 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());