afegides tecles d'START. ja comença el joc amb el numero correcte de jugadors

This commit is contained in:
2025-12-12 16:40:46 +01:00
parent 0c75f56cb5
commit 3d0057220d
5 changed files with 77 additions and 68 deletions

View File

@@ -490,6 +490,7 @@ void Input::applyPlayer1BindingsFromOptions() {
player1_keyboard_bindings_[Action::RIGHT].scancode = Options::player1.keyboard.key_right; player1_keyboard_bindings_[Action::RIGHT].scancode = Options::player1.keyboard.key_right;
player1_keyboard_bindings_[Action::THRUST].scancode = Options::player1.keyboard.key_thrust; player1_keyboard_bindings_[Action::THRUST].scancode = Options::player1.keyboard.key_thrust;
player1_keyboard_bindings_[Action::SHOOT].scancode = Options::player1.keyboard.key_shoot; player1_keyboard_bindings_[Action::SHOOT].scancode = Options::player1.keyboard.key_shoot;
player1_keyboard_bindings_[Action::START].scancode = Options::player1.keyboard.key_start;
// 2. Encontrar gamepad por nombre (o usar primer gamepad como fallback) // 2. Encontrar gamepad por nombre (o usar primer gamepad como fallback)
std::shared_ptr<Gamepad> gamepad = nullptr; std::shared_ptr<Gamepad> gamepad = nullptr;
@@ -523,6 +524,7 @@ void Input::applyPlayer2BindingsFromOptions() {
player2_keyboard_bindings_[Action::RIGHT].scancode = Options::player2.keyboard.key_right; player2_keyboard_bindings_[Action::RIGHT].scancode = Options::player2.keyboard.key_right;
player2_keyboard_bindings_[Action::THRUST].scancode = Options::player2.keyboard.key_thrust; player2_keyboard_bindings_[Action::THRUST].scancode = Options::player2.keyboard.key_thrust;
player2_keyboard_bindings_[Action::SHOOT].scancode = Options::player2.keyboard.key_shoot; player2_keyboard_bindings_[Action::SHOOT].scancode = Options::player2.keyboard.key_shoot;
player2_keyboard_bindings_[Action::START].scancode = Options::player2.keyboard.key_start;
// 2. Encontrar gamepad por nombre (o usar segundo gamepad como fallback) // 2. Encontrar gamepad por nombre (o usar segundo gamepad como fallback)
std::shared_ptr<Gamepad> gamepad = nullptr; std::shared_ptr<Gamepad> gamepad = nullptr;

View File

@@ -12,6 +12,7 @@ enum class InputAction : int { // Acciones de entrada posibles en el juego
RIGHT, // Rotar derecha RIGHT, // Rotar derecha
THRUST, // Acelerar THRUST, // Acelerar
SHOOT, // Disparar SHOOT, // Disparar
START, // Empezar partida
// Inputs de sistema (globales) // Inputs de sistema (globales)
WINDOW_INC_ZOOM, // F2 WINDOW_INC_ZOOM, // F2

View File

@@ -371,23 +371,10 @@ void EscenaTitol::actualitzar(float delta_time) {
// Continuar animació orbital durant la transició // Continuar animació orbital durant la transició
actualitzar_animacio_logo(delta_time); actualitzar_animacio_logo(delta_time);
// [NOU] Continuar comprovant si l'altre jugador vol unir-se durant la transició // [NOU] Continuar comprovant si l'altre jugador vol unir-se durant la transició ("late join")
auto* input = Input::get(); if (checkStartGameButtonPressed()) {
for (auto action : SKIP_BUTTONS_TITOL) { // Updates config_partida_ if pressed, logs are in the method
if (input->checkActionPlayer1(action, Input::DO_NOT_ALLOW_REPEAT)) { context_.set_config_partida(config_partida_);
if (!config_partida_.jugador1_actiu) {
config_partida_.jugador1_actiu = true;
context_.set_config_partida(config_partida_);
std::cout << "[EscenaTitol] P1 s'ha unit durant la transició!\n";
}
}
if (input->checkActionPlayer2(action, Input::DO_NOT_ALLOW_REPEAT)) {
if (!config_partida_.jugador2_actiu) {
config_partida_.jugador2_actiu = true;
context_.set_config_partida(config_partida_);
std::cout << "[EscenaTitol] P2 s'ha unit durant la transició!\n";
}
}
} }
if (temps_acumulat_ >= DURACIO_TRANSITION) { if (temps_acumulat_ >= DURACIO_TRANSITION) {
@@ -397,42 +384,32 @@ void EscenaTitol::actualitzar(float delta_time) {
break; break;
} }
// Verificar botones de skip (SHOOT P1/P2) // Verificar botones de skip (FIRE/THRUST/START) para saltar escenas ANTES de MAIN
if (checkSkipButtonPressed()) { if (estat_actual_ == EstatTitol::STARFIELD_FADE_IN || estat_actual_ == EstatTitol::STARFIELD) {
switch (estat_actual_) { if (checkSkipButtonPressed()) {
case EstatTitol::STARFIELD_FADE_IN: // Saltar a MAIN
// Saltar fade-in, ir a MAIN estat_actual_ = EstatTitol::MAIN;
estat_actual_ = EstatTitol::MAIN; starfield_->set_brightness(BRIGHTNESS_STARFIELD);
starfield_->set_brightness(BRIGHTNESS_STARFIELD); temps_estat_main_ = 0.0f;
temps_estat_main_ = 0.0f; }
break; }
case EstatTitol::STARFIELD: // Verificar boton START para iniciar partida desde MAIN
// Saltar starfield, ir a MAIN if (estat_actual_ == EstatTitol::MAIN) {
estat_actual_ = EstatTitol::MAIN; if (checkStartGameButtonPressed()) {
temps_estat_main_ = 0.0f; // Configurar partida abans de canviar d'escena
break; context_.set_config_partida(config_partida_);
std::cout << "[EscenaTitol] Configuració de partida - P1: "
<< (config_partida_.jugador1_actiu ? "ACTIU" : "INACTIU")
<< ", P2: "
<< (config_partida_.jugador2_actiu ? "ACTIU" : "INACTIU")
<< std::endl;
case EstatTitol::MAIN: context_.canviar_escena(Escena::JOC);
// Iniciar partida (transición a JOC) estat_actual_ = EstatTitol::TRANSITION_TO_GAME;
// Configurar partida abans de canviar d'escena temps_acumulat_ = 0.0f;
context_.set_config_partida(config_partida_); Audio::get()->fadeOutMusic(MUSIC_FADE);
std::cout << "[EscenaTitol] Configuració de partida - P1: " Audio::get()->playSound(Defaults::Sound::LASER, Audio::Group::GAME);
<< (config_partida_.jugador1_actiu ? "ACTIU" : "INACTIU")
<< ", P2: "
<< (config_partida_.jugador2_actiu ? "ACTIU" : "INACTIU")
<< std::endl;
context_.canviar_escena(Escena::JOC);
estat_actual_ = EstatTitol::TRANSITION_TO_GAME;
temps_acumulat_ = 0.0f;
Audio::get()->fadeOutMusic(MUSIC_FADE);
Audio::get()->playSound(Defaults::Sound::LASER, Audio::Group::GAME);
break;
case EstatTitol::TRANSITION_TO_GAME:
// Ignorar inputs durante transición
break;
} }
} }
} }
@@ -561,7 +538,7 @@ void EscenaTitol::dibuixar() {
); );
} }
// === Text "PRESS BUTTON TO PLAY" === // === Text "PRESS START TO PLAY" ===
// En estat MAIN: sempre visible // En estat MAIN: sempre visible
// En estat TRANSITION: parpellejant (blink amb sinusoide) // En estat TRANSITION: parpellejant (blink amb sinusoide)
@@ -575,7 +552,7 @@ void EscenaTitol::dibuixar() {
} }
if (mostrar_text) { if (mostrar_text) {
const std::string main_text = "PRESS BUTTON TO PLAY"; const std::string main_text = "PRESS START TO PLAY";
const float escala_main = 1.0f; const float escala_main = 1.0f;
float text_width = text_.get_text_width(main_text, escala_main, spacing); float text_width = text_.get_text_width(main_text, escala_main, spacing);
@@ -609,21 +586,39 @@ void EscenaTitol::dibuixar() {
auto EscenaTitol::checkSkipButtonPressed() -> bool { auto EscenaTitol::checkSkipButtonPressed() -> bool {
auto* input = Input::get(); auto* input = Input::get();
bool p1_pressed = false;
bool p2_pressed = false;
for (auto action : SKIP_BUTTONS_TITOL) { for (auto action : SKIP_BUTTONS_TITOL) {
if (input->checkActionPlayer1(action, Input::DO_NOT_ALLOW_REPEAT)) { if (input->checkActionPlayer1(action, Input::DO_NOT_ALLOW_REPEAT) ||
p1_pressed = true; input->checkActionPlayer2(action, Input::DO_NOT_ALLOW_REPEAT)) {
config_partida_.jugador1_actiu = true; // Marcar P1 com a actiu return true; // Don't track players here, just skip
}
if (input->checkActionPlayer2(action, Input::DO_NOT_ALLOW_REPEAT)) {
p2_pressed = true;
config_partida_.jugador2_actiu = true; // Marcar P2 com a actiu
} }
} }
return p1_pressed || p2_pressed; return false;
}
auto EscenaTitol::checkStartGameButtonPressed() -> bool {
auto* input = Input::get();
bool any_pressed = false;
for (auto action : START_GAME_BUTTONS) {
if (input->checkActionPlayer1(action, Input::DO_NOT_ALLOW_REPEAT)) {
if (!config_partida_.jugador1_actiu) {
config_partida_.jugador1_actiu = true;
any_pressed = true;
std::cout << "[EscenaTitol] P1 pressed START\n";
}
}
if (input->checkActionPlayer2(action, Input::DO_NOT_ALLOW_REPEAT)) {
if (!config_partida_.jugador2_actiu) {
config_partida_.jugador2_actiu = true;
any_pressed = true;
std::cout << "[EscenaTitol] P2 pressed START\n";
}
}
}
return any_pressed;
} }
void EscenaTitol::processar_events(const SDL_Event& event) { void EscenaTitol::processar_events(const SDL_Event& event) {

View File

@@ -20,9 +20,16 @@
#include "core/system/game_config.hpp" #include "core/system/game_config.hpp"
#include "core/types.hpp" #include "core/types.hpp"
// Botones que permiten saltar/avanzar la escena (extensible) // Botones que permiten saltar/avanzar escenas ANTES de MAIN (extensible)
static constexpr std::array<InputAction, 1> SKIP_BUTTONS_TITOL = { static constexpr std::array<InputAction, 3> SKIP_BUTTONS_TITOL = {
InputAction::SHOOT InputAction::SHOOT, // FIRE
InputAction::THRUST, // THRUST
InputAction::START // START
};
// Botones para INICIAR PARTIDA desde MAIN (solo START)
static constexpr std::array<InputAction, 1> START_GAME_BUTTONS = {
InputAction::START
}; };
class EscenaTitol { class EscenaTitol {
@@ -107,5 +114,6 @@ class EscenaTitol {
void dibuixar(); void dibuixar();
void processar_events(const SDL_Event& event); void processar_events(const SDL_Event& event);
auto checkSkipButtonPressed() -> bool; auto checkSkipButtonPressed() -> bool;
auto checkStartGameButtonPressed() -> bool;
void inicialitzar_titol(); // Carrega i posiciona les lletres del títol void inicialitzar_titol(); // Carrega i posiciona les lletres del títol
}; };

View File

@@ -57,6 +57,7 @@ struct KeyboardControls {
SDL_Scancode key_right{SDL_SCANCODE_RIGHT}; SDL_Scancode key_right{SDL_SCANCODE_RIGHT};
SDL_Scancode key_thrust{SDL_SCANCODE_UP}; SDL_Scancode key_thrust{SDL_SCANCODE_UP};
SDL_Scancode key_shoot{SDL_SCANCODE_SPACE}; SDL_Scancode key_shoot{SDL_SCANCODE_SPACE};
SDL_Scancode key_start{SDL_SCANCODE_1};
}; };
struct GamepadControls { struct GamepadControls {
@@ -88,7 +89,8 @@ inline PlayerControls player1{
{.key_left = SDL_SCANCODE_LEFT, {.key_left = SDL_SCANCODE_LEFT,
.key_right = SDL_SCANCODE_RIGHT, .key_right = SDL_SCANCODE_RIGHT,
.key_thrust = SDL_SCANCODE_UP, .key_thrust = SDL_SCANCODE_UP,
.key_shoot = SDL_SCANCODE_SPACE}, .key_shoot = SDL_SCANCODE_SPACE,
.key_start = SDL_SCANCODE_1},
.gamepad_name = "" // Primer gamepad disponible .gamepad_name = "" // Primer gamepad disponible
}; };
@@ -97,7 +99,8 @@ inline PlayerControls player2{
{.key_left = SDL_SCANCODE_A, {.key_left = SDL_SCANCODE_A,
.key_right = SDL_SCANCODE_D, .key_right = SDL_SCANCODE_D,
.key_thrust = SDL_SCANCODE_W, .key_thrust = SDL_SCANCODE_W,
.key_shoot = SDL_SCANCODE_LSHIFT}, .key_shoot = SDL_SCANCODE_LSHIFT,
.key_start = SDL_SCANCODE_2},
.gamepad_name = "" // Segon gamepad disponible .gamepad_name = "" // Segon gamepad disponible
}; };