Files
basic1/emulator/game_launcher.cpp
T
Adolfo Reyna 47fc02f05c Fix frame update logic and emulator support
- Fix basic1.cpp loop to handle set_frame_updates(true) correctly with sleep
- Update emulator loop for concurrent input and frame updates
- Update emulator for SFML 3.0 compatibility
- Add INPUT.FRAME_TICK constant to Lua bindings
- Enable frame updates in snake.lua example
2026-02-10 23:27:31 -05:00

88 lines
3.3 KiB
C++

// Copy of game_launcher.cpp for emulator build
#include "game_launcher.h"
#include "input_manager.h"
#include "../display/low_level_render.h"
#include "../display/low_level_gui.h"
#include <stdio.h>
extern Font font_5x5_obj;
GameLauncher::GameLauncher(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),
selected_index(0), selected_game(nullptr) {}
void GameLauncher::register_game(const char* name, const char* description,
std::function<Game*(uint16_t, uint16_t, LowLevelRenderer*, LowLevelGUI*, InputManager*)> factory) {
GameEntry entry;
entry.name = name;
entry.description = description;
entry.factory = factory;
games.push_back(entry);
printf("Registered game: %s - %s\n", name, description);
}
void GameLauncher::draw() {
LowLevelWindow* window = gui->draw_new_window(10, 10, width - 20, height - 20, "Game Launcher");
renderer->set_font(&font_5x5_obj);
renderer->draw_string_scaled(30, 40, "Select a Game:", 2);
for (size_t i = 0; i < games.size(); i++) {
int y = MENU_Y_START + (i * MENU_ITEM_HEIGHT);
bool is_selected = ((int)i == selected_index);
gui->draw_button(window, 20, y, games[i].name, is_selected, true);
renderer->set_font(&font_5x5_obj);
renderer->set_text_color(true);
renderer->draw_string_scaled(50, y + 36, games[i].description, 1);
}
const char* instructions;
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);
}
bool GameLauncher::update(const InputEvent& event) {
bool needs_refresh = false;
switch (event.type) {
case INPUT_TOUCH_DOWN: {
for (size_t i = 0; i < games.size(); i++) {
int y = MENU_Y_START + (i * MENU_ITEM_HEIGHT);
if (event.y >= y - 5 && event.y < y + MENU_ITEM_HEIGHT - 5) {
selected_game = games[i].factory(width, height, renderer, gui, input_manager);
if (selected_game) {
selected_game->init();
return true;
}
break;
}
}
break;
}
case INPUT_BUTTON_0: {
if (games.size() > 0) {
selected_index = (selected_index + 1) % games.size();
needs_refresh = true;
}
break;
}
case INPUT_BUTTON_1: {
if (selected_index >= 0 && selected_index < (int)games.size()) {
selected_game = games[selected_index].factory(width, height, renderer, gui, input_manager);
if (selected_game) {
selected_game->init();
return true;
}
}
break;
}
default:
break;
}
return needs_refresh;
}
Game* GameLauncher::get_selected_game() { return selected_game; }
void GameLauncher::reset() {
if (selected_game) {
delete selected_game;
selected_game = nullptr;
}
selected_index = 0;
}