migrat a SDL3 Callback API (SDL_AppInit/Iterate/Event/Quit) (milestone 3)
- main.cpp reescrit amb SDL_MAIN_USE_CALLBACKS - Director convertit a màquina d'estats amb iterate() i handleEvent() - Seccions (Logo, Intro, Title, Game) amb iterate() i handleEvent() - Events SDL enrutats via SDL_AppEvent → Director → secció activa - Eliminat SDL_PollEvent de iterate(), events via handleEvent() - Transicions entre seccions gestionades per handleSectionTransition() - Instructions i Game (demo) delegats frame a frame des de Title Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -81,6 +81,8 @@ Director::Director(int argc, const char *argv[]) {
|
||||
initInput();
|
||||
|
||||
screen = new Screen(window, renderer, asset, options);
|
||||
|
||||
activeSection = ActiveSection::None;
|
||||
}
|
||||
|
||||
Director::~Director() {
|
||||
@@ -568,50 +570,113 @@ bool Director::saveConfigFile() {
|
||||
return success;
|
||||
}
|
||||
|
||||
void Director::runLogo() {
|
||||
auto logo = std::make_unique<Logo>(renderer, screen, asset, input, section);
|
||||
logo->run();
|
||||
}
|
||||
|
||||
void Director::runIntro() {
|
||||
auto intro = std::make_unique<Intro>(renderer, screen, asset, input, lang, section);
|
||||
intro->run();
|
||||
}
|
||||
|
||||
void Director::runTitle() {
|
||||
auto title = std::make_unique<Title>(renderer, screen, input, asset, options, lang, section);
|
||||
title->run();
|
||||
}
|
||||
|
||||
void Director::runGame() {
|
||||
const int numPlayers = section->subsection == SUBSECTION_GAME_PLAY_1P ? 1 : 2;
|
||||
auto game = std::make_unique<Game>(numPlayers, 0, renderer, screen, asset, lang, input, false, options, section);
|
||||
game->run();
|
||||
}
|
||||
|
||||
int Director::run() {
|
||||
// Bucle principal
|
||||
while (section->name != SECTION_PROG_QUIT) {
|
||||
switch (section->name) {
|
||||
case SECTION_PROG_LOGO:
|
||||
runLogo();
|
||||
break;
|
||||
|
||||
case SECTION_PROG_INTRO:
|
||||
runIntro();
|
||||
break;
|
||||
|
||||
case SECTION_PROG_TITLE:
|
||||
runTitle();
|
||||
break;
|
||||
|
||||
case SECTION_PROG_GAME:
|
||||
runGame();
|
||||
break;
|
||||
}
|
||||
// Gestiona las transiciones entre secciones
|
||||
void Director::handleSectionTransition() {
|
||||
// Determina qué sección debería estar activa
|
||||
ActiveSection targetSection = ActiveSection::None;
|
||||
switch (section->name) {
|
||||
case SECTION_PROG_LOGO:
|
||||
targetSection = ActiveSection::Logo;
|
||||
break;
|
||||
case SECTION_PROG_INTRO:
|
||||
targetSection = ActiveSection::Intro;
|
||||
break;
|
||||
case SECTION_PROG_TITLE:
|
||||
targetSection = ActiveSection::Title;
|
||||
break;
|
||||
case SECTION_PROG_GAME:
|
||||
targetSection = ActiveSection::Game;
|
||||
break;
|
||||
}
|
||||
|
||||
return 0;
|
||||
// Si no ha cambiado, no hay nada que hacer
|
||||
if (targetSection == activeSection) return;
|
||||
|
||||
// Destruye la sección anterior
|
||||
logo.reset();
|
||||
intro.reset();
|
||||
title.reset();
|
||||
game.reset();
|
||||
|
||||
// Crea la nueva sección
|
||||
activeSection = targetSection;
|
||||
switch (activeSection) {
|
||||
case ActiveSection::Logo:
|
||||
logo = std::make_unique<Logo>(renderer, screen, asset, input, section);
|
||||
break;
|
||||
case ActiveSection::Intro:
|
||||
intro = std::make_unique<Intro>(renderer, screen, asset, input, lang, section);
|
||||
break;
|
||||
case ActiveSection::Title:
|
||||
title = std::make_unique<Title>(renderer, screen, input, asset, options, lang, section);
|
||||
break;
|
||||
case ActiveSection::Game: {
|
||||
const int numPlayers = section->subsection == SUBSECTION_GAME_PLAY_1P ? 1 : 2;
|
||||
game = std::make_unique<Game>(numPlayers, 0, renderer, screen, asset, lang, input, false, options, section);
|
||||
break;
|
||||
}
|
||||
case ActiveSection::None:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// Ejecuta un frame del juego
|
||||
SDL_AppResult Director::iterate() {
|
||||
if (section->name == SECTION_PROG_QUIT) {
|
||||
return SDL_APP_SUCCESS;
|
||||
}
|
||||
|
||||
// Gestiona las transiciones entre secciones
|
||||
handleSectionTransition();
|
||||
|
||||
// Ejecuta un frame de la sección activa
|
||||
switch (activeSection) {
|
||||
case ActiveSection::Logo:
|
||||
logo->iterate();
|
||||
break;
|
||||
case ActiveSection::Intro:
|
||||
intro->iterate();
|
||||
break;
|
||||
case ActiveSection::Title:
|
||||
title->iterate();
|
||||
break;
|
||||
case ActiveSection::Game:
|
||||
game->iterate();
|
||||
break;
|
||||
case ActiveSection::None:
|
||||
break;
|
||||
}
|
||||
|
||||
return SDL_APP_CONTINUE;
|
||||
}
|
||||
|
||||
// Procesa un evento
|
||||
SDL_AppResult Director::handleEvent(SDL_Event *event) {
|
||||
// Evento de salida de la aplicación
|
||||
if (event->type == SDL_EVENT_QUIT) {
|
||||
section->name = SECTION_PROG_QUIT;
|
||||
return SDL_APP_SUCCESS;
|
||||
}
|
||||
|
||||
// Reenvía el evento a la sección activa
|
||||
switch (activeSection) {
|
||||
case ActiveSection::Logo:
|
||||
logo->handleEvent(event);
|
||||
break;
|
||||
case ActiveSection::Intro:
|
||||
intro->handleEvent(event);
|
||||
break;
|
||||
case ActiveSection::Title:
|
||||
title->handleEvent(event);
|
||||
break;
|
||||
case ActiveSection::Game:
|
||||
game->handleEvent(event);
|
||||
break;
|
||||
case ActiveSection::None:
|
||||
break;
|
||||
}
|
||||
|
||||
return SDL_APP_CONTINUE;
|
||||
}
|
||||
|
||||
// Asigna variables a partir de dos cadenas
|
||||
|
||||
Reference in New Issue
Block a user