#pragma once #include "Config.h" #include #include // Forward declarations class RenderManager; class InputManager; class StateManager; class AssetManager; class Game; class ScoreManager; class Starfield; class Starfield3D; class FontAtlas; class LineEffect; /** * ApplicationManager - Central coordinator for the entire application lifecycle * * Responsibilities: * - Initialize and shutdown all subsystems * - Coordinate the main application loop * - Manage high-level application state * - Provide clean separation between main() and application logic */ class ApplicationManager { public: ApplicationManager(); ~ApplicationManager(); // Core lifecycle methods bool initialize(int argc, char* argv[]); void run(); void shutdown(); // Application state bool isRunning() const { return m_running; } void requestShutdown() { m_running = false; } // Access to managers (for now, will be replaced with dependency injection later) RenderManager* getRenderManager() const { return m_renderManager.get(); } InputManager* getInputManager() const { return m_inputManager.get(); } AssetManager* getAssetManager() const { return m_assetManager.get(); } StateManager* getStateManager() const { return m_stateManager.get(); } private: // Initialization methods bool initializeSDL(); bool initializeManagers(); bool initializeGame(); // Main loop methods void processEvents(); void update(float deltaTime); void render(); // Cleanup methods void cleanupManagers(); void cleanupSDL(); // Core managers std::unique_ptr m_renderManager; std::unique_ptr m_inputManager; std::unique_ptr m_assetManager; std::unique_ptr m_stateManager; // Application state bool m_running = false; bool m_initialized = false; // Timing uint64_t m_lastFrameTime = 0; // Configuration int m_windowWidth = Config::Window::DEFAULT_WIDTH; int m_windowHeight = Config::Window::DEFAULT_HEIGHT; std::string m_windowTitle = Config::Window::DEFAULT_TITLE; };