- Mapa té un JD8_Surface fondo propi que s'allibera al destructor: una còpia accidental provocaria double-free. Ara els 4 copy/move ops estan = delete. - ModuleGame ja era no-copiable implícitament per tindre unique_ptr members, però els = delete expliciten la intenció i protegeixen davant refactors futurs que afegeixquen tipus copiables. Fi de la modernització RAII per fases (1–6). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
69 lines
2.1 KiB
C++
69 lines
2.1 KiB
C++
#pragma once
|
|
|
|
#include <memory>
|
|
#include <vector>
|
|
|
|
#include "game/bola.hpp"
|
|
#include "game/info.hpp"
|
|
#include "game/mapa.hpp"
|
|
#include "game/marcador.hpp"
|
|
#include "game/momia.hpp"
|
|
#include "game/prota.hpp"
|
|
#include "scenes/palette_fade.hpp"
|
|
#include "scenes/scene.hpp"
|
|
|
|
// Escena de gameplay pur. Reemplaça el vell `Go()` bloquejant amb
|
|
// l'interfície `scenes::Scene` tick-based: `onEnter()` arranca la
|
|
// música i un fade-in, el `tick()` avança un frame (Draw + Update
|
|
// gated per JG_ShouldUpdate), i quan la partida acaba fa un fade-out
|
|
// abans de retornar el next state.
|
|
//
|
|
// Tres fases internes:
|
|
// 1. FadingIn — fade-in 32 passos mentre el render segueix viu.
|
|
// 2. Playing — gameplay normal; `final_` es setja quan el prota mor
|
|
// o canvia de sala. `Update()` només avança cada 10 ms
|
|
// via `JG_ShouldUpdate` (ticker fix del jail).
|
|
// 3. FadingOut — fade-out 32 passos mantenint l'últim frame visible
|
|
// (substituïx el `JD8_FadeOut` bloquejant que feia el
|
|
// destructor legacy).
|
|
class ModuleGame : public scenes::Scene {
|
|
public:
|
|
ModuleGame();
|
|
~ModuleGame() override;
|
|
|
|
ModuleGame(const ModuleGame&) = delete;
|
|
ModuleGame& operator=(const ModuleGame&) = delete;
|
|
ModuleGame(ModuleGame&&) = delete;
|
|
ModuleGame& operator=(ModuleGame&&) = delete;
|
|
|
|
void onEnter() override;
|
|
void tick(int delta_ms) override;
|
|
bool done() const override { return phase_ == Phase::Done; }
|
|
int nextState() const override;
|
|
|
|
private:
|
|
enum class Phase {
|
|
FadingIn,
|
|
Playing,
|
|
FadingOut,
|
|
Done,
|
|
};
|
|
|
|
void Draw(); // render a `screen`; no crida JD8_Flip (ho fa el caller)
|
|
void Update(); // gated per JG_ShouldUpdate
|
|
|
|
void iniciarMomies();
|
|
void applyFinalTransitions(); // muta info::ctx quan final_ passa a !=0
|
|
|
|
Phase phase_{Phase::FadingIn};
|
|
scenes::PaletteFade fade_;
|
|
Uint8 final_{0};
|
|
JD8_Surface gfx{nullptr};
|
|
|
|
std::unique_ptr<Mapa> mapa;
|
|
std::unique_ptr<Prota> sam;
|
|
std::unique_ptr<Marcador> marcador;
|
|
std::vector<std::unique_ptr<Momia>> momies;
|
|
std::unique_ptr<Bola> bola;
|
|
};
|