void MapEntities::remove_tagged_entities() { std::list<MapEntity*>::iterator it; for(it = remove_entities.begin(); it != remove_entities.end(); it++) { MapEntity* entity = *it; if(entity->is_obstacle()) { obstacle_entities.remove(entity); } if(entity->is_detector()) { detector_entities.remove(static_cast<Detector*>(entity)); } all_entities.remove(entity); destroy_entity(entity); } remove_entities.clear(); }
/** * \brief Removes and destroys the entities placed in the entities_to_remove list. */ void MapEntities::remove_marked_entities() { list<MapEntity*>::iterator it; // remove the marked entities for (it = entities_to_remove.begin(); it != entities_to_remove.end(); it++) { MapEntity* entity = *it; Layer layer = entity->get_layer(); // remove it from the obstacle entities list if present if (entity->can_be_obstacle()) { if (entity->has_layer_independent_collisions()) { for (int i = 0; i < LAYER_NB; i++) { obstacle_entities[i].remove(entity); } } else { obstacle_entities[layer].remove(entity); } } // remove it from the detectors list if present if (entity->is_detector()) { detectors.remove(static_cast<Detector*>(entity)); } // remove it from the ground obsevers list if present if (entity->is_ground_observer()) { ground_observers[layer].remove(entity); } // remove it from the ground modifiers list if present if (entity->is_ground_modifier()) { ground_modifiers[layer].remove(entity); } // remove it from the sprite entities list if present if (entity->is_drawn_in_y_order()) { entities_drawn_y_order[layer].remove(entity); } else if (entity->can_be_drawn()) { entities_drawn_first[layer].remove(entity); } // remove it from the whole list all_entities.remove(entity); const std::string& name = entity->get_name(); if (!name.empty()) { named_entities.erase(name); } // update the specific entities lists switch (entity->get_type()) { case STAIRS: stairs[layer].remove(static_cast<Stairs*>(entity)); break; case CRYSTAL_BLOCK: crystal_blocks[layer].remove(static_cast<CrystalBlock*>(entity)); break; case SEPARATOR: separators.remove(static_cast<Separator*>(entity)); break; case BOOMERANG: this->boomerang = NULL; break; default: break; } // destroy it destroy_entity(entity); } entities_to_remove.clear(); }