input manager provides ground of truth on device input choise
This commit is contained in:
21
lib/game.h
21
lib/game.h
@@ -12,6 +12,9 @@
|
||||
#include "display/low_level_render.h"
|
||||
#include "display/low_level_gui.h"
|
||||
|
||||
// Forward declaration
|
||||
class InputManager;
|
||||
|
||||
/**
|
||||
* @brief Abstract base class for all games
|
||||
*
|
||||
@@ -31,9 +34,10 @@ public:
|
||||
* @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
|
||||
*/
|
||||
Game(uint16_t width, uint16_t height, LowLevelRenderer* renderer, LowLevelGUI* gui)
|
||||
: width(width), height(height), renderer(renderer), gui(gui) {
|
||||
Game(uint16_t width, uint16_t height, LowLevelRenderer* renderer, LowLevelGUI* gui, InputManager* input_manager)
|
||||
: width(width), height(height), renderer(renderer), gui(gui), input_manager(input_manager) {
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -68,6 +72,16 @@ public:
|
||||
* The actual screen refresh happens in the main loop on Core 1.
|
||||
*/
|
||||
virtual void draw() = 0;
|
||||
|
||||
/**
|
||||
* @brief Check if game wants to exit back to launcher
|
||||
*
|
||||
* Games can override this to signal they want to return to the menu.
|
||||
* Default implementation returns false.
|
||||
*
|
||||
* @return true if game wants to exit, false to continue playing
|
||||
*/
|
||||
virtual bool wants_to_exit() const { return false; }
|
||||
|
||||
protected:
|
||||
// Display dimensions
|
||||
@@ -77,6 +91,9 @@ protected:
|
||||
// Rendering interfaces (provided by basic1.cpp)
|
||||
LowLevelRenderer* renderer;
|
||||
LowLevelGUI* gui;
|
||||
|
||||
// Input manager for capability queries
|
||||
InputManager* input_manager;
|
||||
};
|
||||
|
||||
#endif // GAME_H
|
||||
|
||||
@@ -4,19 +4,19 @@
|
||||
// Menu system for selecting and launching games
|
||||
|
||||
#include "game_launcher.h"
|
||||
#include "board_config.h"
|
||||
#include "input_manager.h"
|
||||
#include "display/low_level_render.h"
|
||||
#include "display/low_level_gui.h"
|
||||
#include <stdio.h>
|
||||
|
||||
GameLauncher::GameLauncher(uint16_t width, uint16_t height,
|
||||
LowLevelRenderer* renderer, LowLevelGUI* gui)
|
||||
: width(width), height(height), renderer(renderer), gui(gui),
|
||||
LowLevelRenderer* renderer, LowLevelGUI* gui, InputManager* input_manager)
|
||||
: width(width), height(height), renderer(renderer), gui(gui), input_manager(input_manager),
|
||||
selected_index(0), selected_game(nullptr) {
|
||||
}
|
||||
|
||||
void GameLauncher::register_game(const char* name, const char* description,
|
||||
Game* (*factory)(uint16_t, uint16_t, LowLevelRenderer*, LowLevelGUI*)) {
|
||||
Game* (*factory)(uint16_t, uint16_t, LowLevelRenderer*, LowLevelGUI*, InputManager*)) {
|
||||
GameEntry entry;
|
||||
entry.name = name;
|
||||
entry.description = description;
|
||||
@@ -51,11 +51,11 @@ void GameLauncher::draw() {
|
||||
|
||||
// Draw instructions at bottom
|
||||
const char* instructions;
|
||||
#ifdef BUTTON_KEY0_PIN
|
||||
instructions = "Touch game or use KEY0/KEY1";
|
||||
#else
|
||||
instructions = "Touch game to play";
|
||||
#endif
|
||||
if (input_manager->has_buttons()) {
|
||||
instructions = "Touch game or use KEY0/KEY1";
|
||||
} else {
|
||||
instructions = "Touch game to play";
|
||||
}
|
||||
renderer->set_font(&font_5x5_obj);
|
||||
renderer->draw_string_scaled(30, height - 35, instructions, 2);
|
||||
}
|
||||
@@ -75,7 +75,7 @@ bool GameLauncher::update(const InputEvent& event) {
|
||||
if (event.y >= y - 5 && event.y < y + MENU_ITEM_HEIGHT - 5) {
|
||||
// Game selected - create instance
|
||||
printf("Selected game: %s\n", games[i].name);
|
||||
selected_game = games[i].factory(width, height, renderer, gui);
|
||||
selected_game = games[i].factory(width, height, renderer, gui, input_manager);
|
||||
if (selected_game) {
|
||||
selected_game->init();
|
||||
return true; // Signal game selected
|
||||
@@ -100,7 +100,7 @@ bool GameLauncher::update(const InputEvent& event) {
|
||||
// Select current game
|
||||
if (selected_index >= 0 && selected_index < (int)games.size()) {
|
||||
printf("Selected game: %s\n", games[selected_index].name);
|
||||
selected_game = games[selected_index].factory(width, height, renderer, gui);
|
||||
selected_game = games[selected_index].factory(width, height, renderer, gui, input_manager);
|
||||
if (selected_game) {
|
||||
selected_game->init();
|
||||
return true; // Signal game selected
|
||||
|
||||
@@ -14,6 +14,7 @@
|
||||
// Forward declarations
|
||||
class LowLevelRenderer;
|
||||
class LowLevelGUI;
|
||||
class InputManager;
|
||||
|
||||
/**
|
||||
* @brief Game entry in launcher menu
|
||||
@@ -22,7 +23,7 @@ struct GameEntry {
|
||||
const char* name; // Display name
|
||||
const char* description; // Short description
|
||||
Game* (*factory)(uint16_t width, uint16_t height,
|
||||
LowLevelRenderer* renderer, LowLevelGUI* gui); // Factory function
|
||||
LowLevelRenderer* renderer, LowLevelGUI* gui, InputManager* input_manager); // Factory function
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -42,8 +43,9 @@ public:
|
||||
* @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);
|
||||
GameLauncher(uint16_t width, uint16_t height, LowLevelRenderer* renderer, LowLevelGUI* gui, InputManager* input_manager);
|
||||
|
||||
/**
|
||||
* @brief Register a game in the launcher
|
||||
@@ -52,7 +54,7 @@ public:
|
||||
* @param factory Function pointer to create game instance
|
||||
*/
|
||||
void register_game(const char* name, const char* description,
|
||||
Game* (*factory)(uint16_t, uint16_t, LowLevelRenderer*, LowLevelGUI*));
|
||||
Game* (*factory)(uint16_t, uint16_t, LowLevelRenderer*, LowLevelGUI*, InputManager*));
|
||||
|
||||
/**
|
||||
* @brief Draw the launcher menu
|
||||
@@ -88,6 +90,7 @@ private:
|
||||
uint16_t height;
|
||||
LowLevelRenderer* renderer;
|
||||
LowLevelGUI* gui;
|
||||
InputManager* input_manager;
|
||||
|
||||
std::vector<GameEntry> games;
|
||||
int selected_index; // Currently highlighted game
|
||||
|
||||
@@ -27,6 +27,18 @@ InputManager::InputManager(LowLevelTouch* touch, const GameConfig* config)
|
||||
: touch(touch), config(config) {
|
||||
}
|
||||
|
||||
bool InputManager::has_touch() const {
|
||||
return touch != nullptr;
|
||||
}
|
||||
|
||||
bool InputManager::has_buttons() const {
|
||||
#ifdef BUTTON_KEY0_PIN
|
||||
return true;
|
||||
#else
|
||||
return false;
|
||||
#endif
|
||||
}
|
||||
|
||||
InputEvent InputManager::process_touch_input(uint32_t* last_time) {
|
||||
InputEvent event = {INPUT_NONE, 0, 0, 0, 0, 0, false};
|
||||
|
||||
|
||||
@@ -55,6 +55,18 @@ public:
|
||||
* @return Constant string with gesture name
|
||||
*/
|
||||
static const char* get_gesture_name(uint8_t gesture_code);
|
||||
|
||||
/**
|
||||
* @brief Check if touch input is available
|
||||
* @return true if touch controller is present, false otherwise
|
||||
*/
|
||||
bool has_touch() const;
|
||||
|
||||
/**
|
||||
* @brief Check if hardware buttons are available
|
||||
* @return true if physical buttons are present, false otherwise
|
||||
*/
|
||||
bool has_buttons() const;
|
||||
|
||||
private:
|
||||
LowLevelTouch* touch;
|
||||
|
||||
Reference in New Issue
Block a user