static void checkCollisions(GameEntityList& listA, GameEntityList& listB) { assert(&listA != &listB); for(GameEntityList::iterator i = listA.begin(); i != listA.end(); ++i) { NEXT_I: for(GameEntityList::iterator j = listB.begin(); j != listB.end(); ++j) { NEXT_J: //if one occurs then complete the action for both if((*i)->didCollide(**j)){ (*i)->onCollide(**j); (*j)->onCollide(**i); const bool deleteI = (*i)->toDelete(), deleteJ = (*j)->toDelete(); if(deleteJ) { delete *j; j = listB.erase(j); } if(deleteI) { delete *i; i = listA.erase(i); if(i == listA.end()) return; goto NEXT_I; } else if(deleteJ) { if(j == listB.end()) break; goto NEXT_J; } } } } }
static void updateEntities(GameEntityList& list) { GameEntityList::iterator i = list.begin(); while(i != list.end()) { (*i)->update(); if((*i)->toDelete()) { delete *i; i = list.erase(i); continue; } ++i; } }