Diciamo che il mio gioco ha un mostro che può esplodere kamikaze sul giocatore. Scegliamo un nome per questo mostro a caso: un Creeper. Quindi, la Creeper
classe ha un metodo che assomiglia a questo:
void Creeper::kamikaze() {
EventSystem::postEvent(ENTITY_DEATH, this);
Explosion* e = new Explosion;
e->setLocation(this->location());
this->world->addEntity(e);
}
Gli eventi non sono in coda, vengono spediti immediatamente. Questo fa sì che l' Creeper
oggetto venga eliminato da qualche parte all'interno della chiamata postEvent
. Qualcosa come questo:
void World::handleEvent(int type, void* context) {
if(type == ENTITY_DEATH){
Entity* ent = dynamic_cast<Entity*>(context);
removeEntity(ent);
delete ent;
}
}
Poiché l' Creeper
oggetto viene eliminato mentre il kamikaze
metodo è ancora in esecuzione, si arresta in modo anomalo quando tenta di accedere this->location()
.
Una soluzione è accodare gli eventi in un buffer e inviarli in un secondo momento. È quella la soluzione comune nei giochi C ++? Sembra un po 'un trucco, ma potrebbe essere solo a causa della mia esperienza con altre lingue con diverse pratiche di gestione della memoria.
In C ++, esiste una soluzione generale migliore a questo problema in cui un oggetto si elimina accidentalmente dall'interno di uno dei suoi metodi?
autorelease
in Objective-C, dove le eliminazioni vengono trattenute fino a "solo un po '".