- // CO_BULLET & CO_BADGUY check
- for(unsigned int i = 0; i < bullets.size(); ++i)
- {
- for (BadGuys::iterator j = badguys.begin(); j != badguys.end(); ++j)
- {
- if((*j)->dying != DYING_NOT)
- continue;
-
- if(rectcollision(bullets[i]->base, (*j)->base))
- {
- // We have detected a collision and now call the
- // collision functions of the collided objects.
- (*j)->collision(bullets[i], CO_BULLET, COLLISION_NORMAL);
- bullets[i]->collision(CO_BADGUY);
- break; // bullet is invalid now, so break
- }
- }
- }
-
- /* CO_BADGUY & CO_BADGUY check */
- for (BadGuys::iterator i = badguys.begin(); i != badguys.end(); ++i)
- {
- if((*i)->dying != DYING_NOT)
- continue;
-
- BadGuys::iterator j = i;
- ++j;
- for (; j != badguys.end(); ++j)
- {
- if(j == i || (*j)->dying != DYING_NOT)
- continue;
-
- if(rectcollision((*i)->base, (*j)->base))
- {
- // We have detected a collision and now call the
- // collision functions of the collided objects.
- (*j)->collision(*i, CO_BADGUY);
- (*i)->collision(*j, CO_BADGUY);
- }
- }
- }
- if(player->dying != DYING_NOT) return;
-
- // CO_BADGUY & CO_PLAYER check
- for (BadGuys::iterator i = badguys.begin(); i != badguys.end(); ++i)
- {
- if((*i)->dying != DYING_NOT)
- continue;
-
- if(rectcollision_offset((*i)->base, player->base, 0, 0))
- {
- // We have detected a collision and now call the collision
- // functions of the collided objects.
- if (player->previous_base.y < player->base.y &&
- player->previous_base.y + player->previous_base.height
- < (*i)->base.y + (*i)->base.height/2
- && !player->invincible_timer.started())
- {
- (*i)->collision(player, CO_PLAYER, COLLISION_SQUISH);
- }
- else
- {
- player->collision(*i, CO_BADGUY);
- (*i)->collision(player, CO_PLAYER, COLLISION_NORMAL);
- }
- }
+ player->check_bounds(camera);
+
+ /* update objects */
+ for(GameObjects::iterator i = gameobjects.begin();
+ i != gameobjects.end(); ++i) {
+ GameObject* object = *i;
+ if(!object->is_valid())
+ continue;
+
+ object->update(elapsed_time);
+ }
+
+ /* Handle all possible collisions. */
+ handle_collisions();
+ update_game_objects();
+}
+
+void
+Sector::update_game_objects()
+{
+ /** cleanup marked objects */
+ for(std::vector<Bullet*>::iterator i = bullets.begin();
+ i != bullets.end(); /* nothing */) {
+ Bullet* bullet = *i;
+ if(bullet->is_valid()) {
+ ++i;
+ continue;