refactor(em): un sol vector entities_ — polimorfisme per la
discriminació
Reverteix la separació en sacs introduïda al commit 62f4b85 (rama
anterior). Amb els virtuals afegits al commit precedent
(`onWhipHit`, `onJustSpawned`, `shouldReceiveContact`, `onRemoved`),
ja no cal separar `map_entities_` i `actors_`: cada entitat decideix
internament què fa, el manager itera un sol vector i confia en el
dispatch virtual.
Canvis:
- `entities_` torna a ser el contenidor únic. Es desfà el dispatch
`dynamic_cast<DynamicHazard*>` que `add()` feia per enrutar.
- `addSarcophagus`, `removeEntity`, `update`, `notifyPlayerTilePainted`,
`findFloorTriggerAt`, `renderAll`, `reload` simplificats: un sol
bucle, sense distingir categories.
- `checkPlayerCollisions` només recorre `entities_` cridant
`shouldReceiveContact` polimòrfic — la lògica de "saltar SPAWN"
viu a `DynamicHazard::shouldReceiveContact`.
- `getMapEntities()` i `getActors()` desapareixen. Es manté
`getEntities()` com a accessor únic.
- `WhipAttack::applyDamage` itera `getEntities()` cridant `onWhipHit`
polimòrfic. Les entitats no-whippables retornen false (cost: una
crida virtual buida) i el callsite no discrimina tipus.
- `GameScene::render` mergeja entities + players (dos transforms en
comptes de tres) per al z-order.
`pending_actors_` es manté: és un concepte ortogonal — entitats que
encara no s'han instanciat al món fins que GameScene les "spawneja"
al text-exit de ROOM_INTRO.
Beneficis del nou disseny:
- Cap dynamic_cast dispers per a la lògica de joc (només queden els
inevitables: validació de factory i ruteig de la Door).
- Afegir un nou enemic implica `class X : public DynamicHazard` i
override dels virtuals rellevants — res al manager.
- Si un sarc, antorxa, o decoració futura volgués reaccionar al
fueteig (trencar-se, encendre's), basta amb un `onWhipHit` override
i no cal tocar `WhipAttack::applyDamage`.
This commit is contained in:
1 parent
28ff425c89
commit
a29ea641ab
5 files changed
+61
-118
No files matched your search
@@ -329,14 +329,14 @@ namespace {
|
||||
|
||||
void WhipAttack::applyDamage() {
|
||||
if (entity_manager_ != nullptr) {
|
||||
// Iterem el sac d'actors (DynamicHazards). Les entitats
|
||||
// estàtiques (sarc, antorxa, forat, traps) no reben fueteig per
|
||||
// disseny — la decisió viu en el flag de saco, no en filtres
|
||||
// dispersos. Si en el futur cal que un sarc reaccioni al fueteig
|
||||
// (p.ex. trencar-se), basta amb afegir un override de
|
||||
// `onWhipHit` allà i iterar també getMapEntities().
|
||||
for (auto* actor : entity_manager_->getActors()) {
|
||||
hitEntityIfApplicable(actor, damage_rect_, this, already_hit_);
|
||||
// Iterem totes les entitats. La discriminació la fa cada una via
|
||||
// `onWhipHit`: Mummy entra HURT si és whippable, la resta retorna
|
||||
// false (no-op). El cost d'iterar antorxes/sarcs/forats és una
|
||||
// crida virtual buida cada una — menyspreable comparat amb la
|
||||
// claredat del callsite. Si demà un sarc vol trencar-se al
|
||||
// fueteig, només cal override de `onWhipHit` allà.
|
||||
for (auto* entity : entity_manager_->getEntities()) {
|
||||
hitEntityIfApplicable(entity, damage_rect_, this, already_hit_);
|
||||
}
|
||||
}
|
||||
if (players_ != nullptr) {
|
||||
|
||||
Reference in new issue
Block a user