After thinking I was beginning to get the hang of everything, I have come up stuck again. I have hit this problem before where I iterate around a vector and after some collision detection decide whether to delete it or not.
When one of the bullets hit the boss, the game crashes and exits with a code 3.
What confuses me is that this method works well for other places in the game where I need to delete the bullets so where am I going wrong? I know that I am dereferencing incorrectly but just cannot see why here.
for (std::vector<boss>::iterator bossIT = boss1.begin(); bossIT != boss1.end(); bossIT++)
{
(*bossIT).move(spaceShip1.xPosition(), spaceShip1.yPosition()); // Moves the boss
for (std::vector<bullet>::iterator bulletIT = aBullet.begin(); bulletIT != aBullet.end(); bulletIT++) // Loops around each bullet
{
if((*bossIT).xPosition() + 32 >= (*bulletIT).xPosition() && (*bossIT).xPosition() <= (*bulletIT).xPosition() + 10 && // Detects Collision
(*bossIT).yPosition() + 32 >= (*bulletIT).yPosition() && (*bossIT).yPosition() <= (*bulletIT).yPosition() + 10)
{
aBullet.erase(aBullet.begin()+bulletIterator); // Crashes here with code 3
(*bossIT).hit();
}
}
}
Where is "bulletIterator" defined? I dont see it, I see "bulletIT", is bulletIterator a typo? or another variable that shouldnt be there?
I would call the line "(*bossIT).hit();" before doing any list clean up just so that the logic of your if statement collision check is done before things start getting deleted and moved around. erase removes the current element and returns an iterator to the next, which is end() if you erase the last element.
for (std::vector<bullet>::iterator bulletIT = aBullet.begin(); bulletIT != aBullet.end(); ) // Loops around each bullet
{
if((*bossIT).xPosition() + 32 >= (*bulletIT).xPosition() && (*bossIT).xPosition() <= (*bulletIT).xPosition() + 10 && // Detects Collision
(*bossIT).yPosition() + 32 >= (*bulletIT).yPosition() && (*bossIT).yPosition() <= (*bulletIT).yPosition() + 10)
{
(*bossIT).hit();
bulletIT = aBullet.erase(bulletIT); // update iterator with next if collision
}
else
++ bulletIT; // no collision go to next bullet
}