// ============================================================================ // GAME LAUNCHER HEADER // ============================================================================ // Menu system for selecting and launching games #ifndef GAME_LAUNCHER_H #define GAME_LAUNCHER_H #include #include #include #include "input_event.h" #include "game.h" // Forward declarations class LowLevelRenderer; class LowLevelGUI; class InputManager; /** * @brief Game entry in launcher menu */ struct GameEntry { const char* name; // Display name const char* description; // Short description std::function factory; // Factory function }; /** * @brief Game Launcher - Menu system for game selection * * Displays a list of available games and allows selection via: * - Touch: Tap on game name * - Buttons: KEY0 to navigate, KEY1 to select * * Returns the selected game instance for the main loop to run. */ class GameLauncher { public: /** * @brief Construct GameLauncher * @param width Display width in pixels * @param height Display height in pixels * @param renderer Pointer to low-level rendering interface * @param gui Pointer to GUI drawing primitives * @param input_manager Pointer to input manager for capability queries */ GameLauncher(uint16_t width, uint16_t height, LowLevelRenderer* renderer, LowLevelGUI* gui, InputManager* input_manager); /** * @brief Register a game in the launcher * @param name Game display name * @param description Short description * @param factory Function or lambda to create game instance */ void register_game(const char* name, const char* description, std::function factory); /** * @brief Draw the launcher menu */ void draw(); /** * @brief Process input event in launcher * @param event Input event from InputManager * @return true if a game was selected (check get_selected_game()) */ bool update(const InputEvent& event); /** * @brief Get the currently selected game instance * @return Pointer to selected game, or nullptr if none selected */ Game* get_selected_game(); /** * @brief Reset launcher to show menu again */ void reset(); /** * @brief Check if a game is currently selected * @return true if game selected, false if in menu */ bool is_game_selected() const { return selected_game != nullptr; } private: uint16_t width; uint16_t height; LowLevelRenderer* renderer; LowLevelGUI* gui; InputManager* input_manager; std::vector games; int selected_index; // Currently highlighted game Game* selected_game; // Currently running game (nullptr = in menu) // Menu layout constants static const int MENU_Y_START = 60; static const int MENU_ITEM_HEIGHT = 40; static const int MENU_PADDING = 10; }; #endif // GAME_LAUNCHER_H