问题描述
我正在使用 QT c ++ 创建一个简单的游戏,我有一个小行星类和一个该类的 Qvector。每 15 秒创建一个小行星并将其添加到 Qvector。
void MainWindow::generarasteroides(){
srand(time(NULL));
int aleatorio=1+rand()%1000;
int a_w = 30+rand()%200;
v_asteroides.push_back(new asteroides(aleatorio,-1000,a_w,500));
mundo->addItem(v_asteroides.last());
std::cout << "Asteroide generado en X : "<< aleatorio << std::endl;
sonido->stop();
sonido->setMedia(QUrl("qrc:/multimedia/suspenso1.mp3"));
sonido->play();
}
当它超过某个 Y 坐标时,我通过 Timer 调用一个函数来遍历向量并从场景中消除
void MainWindow::actualizar(){
for(auto &ast : v_asteroides){
if(ast->destruir()){
mundo->removeItem(ast);
v_asteroides.erase(std::remove(v_asteroides.begin(),v_asteroides.end(),ast),v_asteroides.end());
sonido->stop();
sonido->setMedia(QUrl("qrc:/multimedia/explosion1.mp3"));
sonido->play();
//std::cout << "eliminado" <<std::endl;
}
}
//std::cout << "tamaño : " <<v_asteroides.size() << std::endl;
mundo->advance();
mundo->update();}
然而,应该从屏幕上移除的对象仍然存在(静止)而不会消失。
解决方法
错误在于:for (xx : vs_) 和 vs_.erase 不能一起使用。 您应该在下一个循环中使用 v_asteroides.erase(xxx) 返回的迭代器。
按照建议使用下一个代码:
auto iter = vs_.begin();
for (; iter != vs_.end(); )
{
//if need erase
{
//other logic code
// mundo->removeItem(*iter);
iter = vs_.erase(iter); // at last row
}
// else
{
//++iter;
}
}