feat(mummy): decisió a creuaments de corredor
La mòmia ara decideix direcció a cada creuament de corredor (edge-detect de travessar la línia central d'un corredor perpendicular) i no només quan topa amb un mur o sarc. A la detecció, amarra la caixa al centre exacte del creuament per evitar drift sub-píxel i tria entre continuar recta o girar a una perpendicular lliure. Mai mitja volta a un creuament — la mitja volta queda reservada al cas de bloqueig sense alternatives.
This commit is contained in:
1 parent
5312abc761
commit
9d256b7f2d
2 files changed
+108
-12
No files matched your search
@@ -1,6 +1,7 @@
|
||||
#pragma once
|
||||
|
||||
#include <cstdint>
|
||||
#include <optional>
|
||||
#include <vector>
|
||||
|
||||
#include "external/fkyaml_node.hpp"
|
||||
@@ -12,11 +13,6 @@
|
||||
// (`chooseDirection`) que la base implementa com a aleatori uniforme
|
||||
// sobre les direccions admissibles. Futurs derivats poden sesgar cap al
|
||||
// jugador sense tocar la lògica de moviment.
|
||||
//
|
||||
// Andamiatge: el concepte d'"intersecció" i la validació de direcció
|
||||
// requereixen conèixer el mapa. De moment l'exposem com un conjunt de
|
||||
// direccions admissibles que l'EntityManager injecta; la implementació
|
||||
// real arribarà quan cablegem l'entitat al game loop.
|
||||
class Mummy : public DynamicHazard {
|
||||
public:
|
||||
enum class Direction : std::uint8_t { NONE,
|
||||
@@ -32,11 +28,15 @@ class Mummy : public DynamicHazard {
|
||||
// aleatoria; si `allowed` està buit, retorna `NONE`.
|
||||
virtual auto chooseDirection(const std::vector<Direction>& allowed) -> Direction;
|
||||
|
||||
// Política de moviment "corridor_wanderer": camina recte fins que el
|
||||
// pròxim tram la bloquejaria (mur del playfield o sarc). Quan troba un
|
||||
// obstacle, recull les direccions perpendiculars vàlides (evitant
|
||||
// U-turn llevat que no hi hagi alternativa) i crida `chooseDirection`
|
||||
// per decidir-ne una. No consumeix moviment el frame de gir.
|
||||
// Política "corridor_wanderer":
|
||||
// (a) A cada creuament de corredor (edge-detect de travessar la línia
|
||||
// central d'un corredor perpendicular) amarra la caixa al centre
|
||||
// exacte del creuament i decideix: seguir recta o girar a una
|
||||
// perpendicular lliure. Mai mitja volta.
|
||||
// (b) Si el pròxim tram la bloqueja (mur del playfield o sarc), gira
|
||||
// cap a una perpendicular vàlida i, només si no en queda cap, fa
|
||||
// mitja volta.
|
||||
// En ambdós casos el frame de gir no consumeix avenç extra.
|
||||
void step(float delta_time) override;
|
||||
|
||||
// Contacte amb el jugador: publica `player_hit` amb el dany.
|
||||
@@ -72,6 +72,24 @@ class Mummy : public DynamicHazard {
|
||||
// Aplica la direcció triada (wrapper del switch en una sola crida).
|
||||
void applyChoice(Direction dir);
|
||||
|
||||
// Si aquest frame travessa la línia central d'un corredor perpendicular,
|
||||
// retorna el delta (sobre l'eix actiu) per amarrar la caixa a aquesta
|
||||
// línia. `nullopt` si no en creua cap. Els corredors perpendiculars
|
||||
// estan a `base + k·pitch` (k ∈ [0..max_idx]); la comparació és
|
||||
// estricta a un costat per no re-disparar quan la caixa ja hi està.
|
||||
[[nodiscard]] auto detectLaneCrossing(float dx, float dy) const -> std::optional<float>;
|
||||
|
||||
// Decisió a un creuament: pool = perpendiculars lliures + direcció
|
||||
// actual si continua essent lliure. Mai mitja volta. Si el pool sortís
|
||||
// buit (cas degenerat, a la pràctica no s'hi arriba), manté la
|
||||
// direcció actual; el frame següent, si està bloquejada, la branca de
|
||||
// bloqueig ja la reorientarà.
|
||||
void decideAtIntersection(float step_px);
|
||||
|
||||
// Direcció actual com a enum, reconstruïda a partir de `dir_x_/dir_y_`.
|
||||
// S'usa al pool de creuament per afegir la recta com a candidata.
|
||||
[[nodiscard]] auto currentDirection() const -> Direction;
|
||||
|
||||
// Animacions carregades del YAML, una per cada facing. Per a horitzontal
|
||||
// només en cal una (`walk`) i el flip ja diferencia esquerra/dreta.
|
||||
AnimationComponent anim_walk_down_;
|
||||
|
||||
Reference in new issue
Block a user