c++ - QT scene->removeItem (* QgraphicsItem) 将物体从场景中移除但仍被观察到
问题描述
我正在使用 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,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;
}
}
推荐阅读
- ansible - 分配 ssh 用户取决于 Ansible 中主机文件中提到的主机名
- c++ - 为什么包含“boost/multiprecision/cpp_int.hpp”会破坏套接字?
- kubernetes - 如何使用 443/80 在 prem 上公开 kubernetes 服务
- android - 从 com.android.tools.build:gradle:3.0.1 升级到 com.android.tools.build:gradle:3.2.0
- elasticsearch - Kibana 中的字段存在 (_exists_) 查询不返回任何结果
- c# - 将表与桥表连接并从主表中获取数据,如果数据存在于桥表中,则也获取它
- xslt - 将 XML 中的单个值复制到其他 XML 中的两个不同位置
- python - 从 python 发送原始电子邮件并检索 sendmail queueid
- git - 让 git rebase 打印提交 ID
- google-apps-script - Apps 脚本在不是文件所有者时发布 Web 应用程序