antred
Lt. Commander
- Registriert
- Juni 2010
- Beiträge
- 1.288
Dieser Teil hier:
ist problematisch. Der Iterator, den du in der Schleife inkrementierst (übrigens, aus Effizienz-Gründen lieber Präinkrement nutzen ... also das ++ vor den Iterator setzen), machst du mit dem erase() eventuell ungültig. Wenn du unbedingt in einer Schleife erase() aufrufen möchtest, mußt du entweder sofort nach dem erase()-Aufruf die Schleife verlassen, oder den Rückgabewert von erase() nutzen. erase() gibt dir nämlich die Position des ersten Elements hinter dem eben gelöschten Bereich. Ich ändere den Code von oben mal entsprechend ab:
Und NATÜRLICH entfernt dein Code nix aus dem vector! Dein IsEnemyDead-Funktor gibt ja auch einfach immer pauschal für jedes Element 0 (also false) zurück. Der Funktor muß für jedes Element, das entfernt werden soll, true liefern.
Code:
for(SpriteIt = SpriteVector.begin();SpriteIt != SpriteVector.end();SpriteIt++)
{
sf::Vector2f mousecoords(mMainWindow.mapPixelToCoords(sf::Vector2i(event.mouseButton.x, event.mouseButton.y)));
if(SpriteIt->getGlobalBounds().contains(mousecoords))
{
SpriteVector.erase(std::remove_if(SpriteVector.begin(), SpriteVector.end(), IsEnemyDead()),SpriteVector.end());
}
}
ist problematisch. Der Iterator, den du in der Schleife inkrementierst (übrigens, aus Effizienz-Gründen lieber Präinkrement nutzen ... also das ++ vor den Iterator setzen), machst du mit dem erase() eventuell ungültig. Wenn du unbedingt in einer Schleife erase() aufrufen möchtest, mußt du entweder sofort nach dem erase()-Aufruf die Schleife verlassen, oder den Rückgabewert von erase() nutzen. erase() gibt dir nämlich die Position des ersten Elements hinter dem eben gelöschten Bereich. Ich ändere den Code von oben mal entsprechend ab:
Code:
for(SpriteIt = SpriteVector.begin();SpriteIt != SpriteVector.end(); /* iterator incremented in loop body */ )
{
sf::Vector2f mousecoords(mMainWindow.mapPixelToCoords(sf::Vector2i(event.mouseButton.x, event.mouseButton.y)));
if(SpriteIt->getGlobalBounds().contains(mousecoords))
{
SpriteIt = SpriteVector.erase(std::remove_if(SpriteVector.begin(), SpriteVector.end(), IsEnemyDead()),SpriteVector.end());
}
else
{
++SpriteIt;
}
}
Und NATÜRLICH entfernt dein Code nix aus dem vector! Dein IsEnemyDead-Funktor gibt ja auch einfach immer pauschal für jedes Element 0 (also false) zurück. Der Funktor muß für jedes Element, das entfernt werden soll, true liefern.