【发布时间】:2016-11-12 18:13:46
【问题描述】:
我正在尝试遍历存储的std::unique_ptr<Enemy> 的向量,以检查它们是否与player 的攻击发生冲突。如果是,我想从向量中删除Enemy。
但是,当我这样做时,我得到了错误:
文件:c:\program files (x86)\microsoft visual studio 14.0\vc\include\vector 线路:102 表达式:向量迭代器不可递增
代码如下:
if(actionCnt > 0)
{
sf::FloatRect* playerAction = player->action(actionCnt);
if (!enemies.empty()) {
for (auto&i : enemies) {
if (playerAction->intersects(i->getBox())) {
i->kill();
enemies.erase(std::remove(enemies.begin(), enemies.end(), i));
}
}
}
delete playerAction;
playerAction = NULL;
}
所以本质上,如果玩家触发了攻击,actionCnt 会变为 1 并且该段被执行。
playerAction 是一个被移动以模拟挥杆动作的矩形,所以我在这里检查矩形是否与敌人发生碰撞,如果是的话会杀死它。
我正在使用 SFML 库,但这些类的作用应该很明显。
目前我场上只有 1 个敌人来测试这些东西。所以当我点击它时,enemies 向量应该是空的。
【问题讨论】:
-
无论这是否是问题所在,相信我,您不想在使用范围
for进行迭代时使用erase。 -
所以我查看了@LogicStuff 发布的线程并尝试将其放入while 循环中,但是我无法使用迭代器引用
enemies向量中的元素例如:playerAction->intersects(*iter->getBox())给我一个错误说"std::unique_ptr<Enemy, std::default_delete<Enemy>>" has no member "getBox" -
你需要
(*iter)->getBox()