feat(player): estat EXITED i porta oberta despawna jugadors via player_exited
This commit is contained in:
1 parent
377e5d0b97
commit
5c5cd1d5da
5 files changed
+93
-22
No files matched your search
@@ -66,15 +66,22 @@ void Door::update(float delta_time) {
|
||||
}
|
||||
|
||||
void Door::onPlayerContact(Player* player) {
|
||||
if (state_ != State::OPEN || level_complete_emitted_) { return; }
|
||||
// Només la porta OPEN despawna jugadors. CLOSED/OPENING ignoren el
|
||||
// contacte (i a més, en CLOSED, el `Map::collides` ja bloqueja el
|
||||
// moviment, així que el contacte no es dóna en condicions normals).
|
||||
if (state_ != State::OPEN || player == nullptr || player->isExited()) { return; }
|
||||
// Marquem el jugador com a EXITED i publiquem l'event d'agregació.
|
||||
// El check `isExited` de la guarda anterior garanteix que només
|
||||
// emetem l'event en la primera transició — `EntityManager` compta
|
||||
// emissions per decidir quan publicar `level_complete`.
|
||||
player->exit();
|
||||
if (bus_ != nullptr) {
|
||||
bus_->publish(Event{
|
||||
.name = "level_complete",
|
||||
.name = "player_exited",
|
||||
.payload = std::monostate{},
|
||||
.player_id = (player != nullptr) ? player->getId() : -1,
|
||||
.player_id = player->getId(),
|
||||
});
|
||||
}
|
||||
level_complete_emitted_ = true;
|
||||
}
|
||||
|
||||
void Door::open() {
|
||||
|
||||
@@ -7,11 +7,14 @@
|
||||
#include "game/entities/interactable.hpp"
|
||||
|
||||
// Porta de sortida del nivell. Tres estats:
|
||||
// CLOSED → inicial; bloqueja el pas.
|
||||
// CLOSED → inicial; el passadís de Map bloqueja el pas via `Map::collides`.
|
||||
// OPENING → animació d'obertura en curs. Quan el component acaba →
|
||||
// transita a OPEN.
|
||||
// OPEN → accessible. Al contacte amb el jugador publica
|
||||
// `level_complete` al bus (si n'hi ha).
|
||||
// transita a OPEN. El passadís ja és transitable (s'allibera
|
||||
// a `open()` amb `Map::door_open = true`).
|
||||
// OPEN → accessible. Al contacte amb un jugador, crida `Player::exit()`
|
||||
// — el jugador queda despawnat i emet `player_exited` al bus.
|
||||
// L'agregació "tots els jugadors han eixit → `level_complete`"
|
||||
// viu a EntityManager.
|
||||
//
|
||||
// El que decideix quan s'obri és extern (`EntityManager` comptant sarcs
|
||||
// oberts) via `open()`. L'animació `opening` es fa servir com a
|
||||
@@ -38,7 +41,6 @@ class Door : public Interactable {
|
||||
void setAnimation(const AnimationComponent& anim);
|
||||
|
||||
State state_{State::CLOSED};
|
||||
bool level_complete_emitted_{false};
|
||||
|
||||
// Les 3 animacions precalculades al ctor des del YAML. L'activa
|
||||
// s'assigna a `anim_` (heretat d'Entity) segons l'estat.
|
||||
|
||||
Reference in new issue
Block a user