我有一个游戏,在这个游戏中,我可以向物体发射子弹,当子弹击中物体或离开屏幕时,这个物体和这颗子弹都将被删除。
例如:
std::vector<object> object_list;
for(size_t i = 0; i < object_list.size(); i++)
{
if(object_list[i].hit())
{
object_list.erase(object_list.begin() + i);
}
else
object_list[i].draw();
}
这样做的问题在于,当我移除一个对象时,向量的大小会减小,因此当检查条件时,它会失败并出现错误,如“vector subscript out of range”。我可以选择不渲染被击中的陨石,而是渲染那些未被击中的,但这样做的问题在于被击中的物体数量会增加(分裂),所以最终程序会变慢。我已经在屏幕外的子弹使用了类似的概念,但我找不到解决方法或更好的删除元素的方法。
对象和子弹都是类。
v = {1,2,3,4, ...}
并想要删除所有内容。你删除v[0]
并得到v = {2,3,4, ...}
。然后你删除v[1]
并得到{2,4, ...}
。以此类推。) - molbdnilostd::remove_if(object_list.begin(), object_list.end(), [](const object &o) {return o.hit();})
就能解决问题(假设使用 C++11 或更高版本)。它还可以避免您的循环存在的问题,包括不检查/删除紧随已删除元素之后的元素。 - Peter