我开始为我在C ++和sfml中使用的游戏编写自己的粒子效果系统。 在我的更新方法中,我在迭代向量时删除生命周期已过期的粒子。 我认为在删除元素之后我不小心不会使迭代器无效,正如你在方法的底部看到的那样,但是我得到的是exec_bad_access code = 1或code = 2。 异常总是指向擦除(it)行。 任何想法可能出错?
void ParticlesNode::updateCurrent(sf::Time dt)
{
for(particleIterator it = _mParticles.begin(), end = _mParticles.end(); it != end;)
{
// calculate new color RGBA
float nr = it->color.r + it->colorDis.r * dt.asSeconds();
float ng = it->color.g + it->colorDis.g * dt.asSeconds();
float nb = it->color.b + it->colorDis.b * dt.asSeconds();
float na = it->color.a + it->colorDis.a * dt.asSeconds();
it->color = sf::Color{static_cast<Uint8>(nr),static_cast<Uint8>(ng),static_cast<Uint8>(nb),static_cast<Uint8>(na)};
// new position
it->pos = sf::Vector2f(it->pos.x + it->vel.x * dt.asSeconds(), it->pos.y + it->vel.y * dt.asSeconds());
// new velocity by linear accelaration.
float length = getLength(it->vel);
float newLength = length + _mPData.accel * dt.asSeconds();
float radians = cartesianToPolar(it->vel).y;
it->vel = polarToCartesian(newLength, radians);
// new velocity by gravity
// new velocity by radial acceleration.
// new remaining life time
it->lifeSpan -= dt.asSeconds();
if (it->lifeSpan <= 0)
_mParticles.erase( it );
else
++it;
}
}
答案 0 :(得分:4)
在erase之后,迭代器it
变为无效,但它仍然用于下一次迭代。
您应该使用erase
的返回值来指定它,它指的是擦除元素后面的迭代器。
it = _mParticles.erase( it );
请注意,不仅erase
点处的迭代器变为无效,之后的所有迭代器(包括end()
)也将变为无效。因此,您需要为每次迭代评估end()
,即将for
的条件更改为
for(particleIterator it = _mParticles.begin(); it != _mParticles.end();)