56 lines
2.0 KiB
C++
56 lines
2.0 KiB
C++
#pragma once
|
|
|
|
#include <SDL3/SDL.h>
|
|
|
|
#include <atomic>
|
|
#include <cstdint>
|
|
|
|
// El Director és el thread principal que controla la presentació i els inputs.
|
|
// El codi del joc s'executa dins d'un *fiber* cooperatiu (veure fiber.hpp):
|
|
// el joc produeix un frame, crida JD8_Flip() que internament fa yield al
|
|
// Director, i el Director el presenta abans de tornar-lo a reprendre amb
|
|
// GameFiber::resume(). Tot ocorre en un únic thread — sense mutex, sense
|
|
// condition_variable, compatible amb el futur port a SDL_AppIterate.
|
|
class Director {
|
|
public:
|
|
static void init();
|
|
static void destroy();
|
|
static auto get() -> Director*;
|
|
|
|
// Bucle principal del director. Crida des de main().
|
|
void run();
|
|
|
|
// Demana l'eixida (ex: segona pulsació d'ESC o SDL_QUIT)
|
|
void requestQuit();
|
|
|
|
// Consumeix el flag de "tecla polsada" (com l'antic JI_AnyKey)
|
|
auto consumeKeyPressed() -> bool;
|
|
|
|
// Indica si ESC està bloquejada (el joc no l'ha de veure)
|
|
auto isEscBlocked() const -> bool { return esc_blocked_ || esc_swallow_until_release_; }
|
|
|
|
// Pausa: mentre està activa, Director no fa resume() del fiber del joc,
|
|
// així que el joc queda congelat al seu últim JD8_Flip.
|
|
void togglePause();
|
|
auto isPaused() const -> bool { return paused_; }
|
|
|
|
private:
|
|
Director() = default;
|
|
~Director() = default;
|
|
|
|
static Director* instance_;
|
|
|
|
void handleEvents();
|
|
|
|
std::atomic<bool> quit_requested_{false};
|
|
std::atomic<bool> key_pressed_{false};
|
|
std::atomic<bool> esc_blocked_{false};
|
|
std::atomic<bool> paused_{false};
|
|
// Quan el menú tanca amb ESC, empassem-nos l'ESC fins que l'usuari la deixe anar,
|
|
// per no fer eixir el joc al proper poll de JI_KeyPressed.
|
|
std::atomic<bool> esc_swallow_until_release_{false};
|
|
// Tecles consumides pel menú (KEY_DOWN): el KEY_UP associat cal empassar-lo
|
|
// per evitar que el joc (JI_AnyKey / JI_moveCheats) les veja quan el menú tanca.
|
|
bool menu_keys_held_[SDL_SCANCODE_COUNT]{};
|
|
};
|