From 6c766be023868245bd6dfd48bd1e40dba22538d9 Mon Sep 17 00:00:00 2001 From: Sergio Valor Date: Sun, 2 Nov 2025 18:18:12 +0100 Subject: [PATCH] el joc es pot controlar amb el primer mando que hi haja conectat --- source/core/input/input.cpp | 26 +++++++++++++++++++------- source/game/entities/player.cpp | 27 +++++++++++++-------------- source/game/entities/player.hpp | 18 +++++++++--------- 3 files changed, 41 insertions(+), 30 deletions(-) diff --git a/source/core/input/input.cpp b/source/core/input/input.cpp index ac0c210..69340fc 100644 --- a/source/core/input/input.cpp +++ b/source/core/input/input.cpp @@ -70,18 +70,24 @@ auto Input::checkAction(Action action, bool repeat, bool check_keyboard, const s } } - if (gamepad != nullptr) { - success_controller = checkAxisInput(action, gamepad, repeat); + // Si gamepad es nullptr pero hay mandos conectados, usar el primero + std::shared_ptr active_gamepad = gamepad; + if (active_gamepad == nullptr && !gamepads_.empty()) { + active_gamepad = gamepads_[0]; + } + + if (active_gamepad != nullptr) { + success_controller = checkAxisInput(action, active_gamepad, repeat); if (!success_controller) { - success_controller = checkTriggerInput(action, gamepad, repeat); + success_controller = checkTriggerInput(action, active_gamepad, repeat); } if (!success_controller) { if (repeat) { // El usuario quiere saber si está pulsada (estado mantenido) - success_controller = gamepad->bindings[action].is_held; + success_controller = active_gamepad->bindings[action].is_held; } else { // El usuario quiere saber si ACABA de ser pulsada (evento de un solo fotograma) - success_controller = gamepad->bindings[action].just_pressed; + success_controller = active_gamepad->bindings[action].just_pressed; } } } @@ -104,11 +110,17 @@ auto Input::checkAnyInput(bool check_keyboard, const std::shared_ptr& g } } + // Si gamepad es nullptr pero hay mandos conectados, usar el primero + std::shared_ptr active_gamepad = gamepad; + if (active_gamepad == nullptr && !gamepads_.empty()) { + active_gamepad = gamepads_[0]; + } + // --- Comprobación del Mando --- // Comprobamos si hay mandos y si el índice solicitado es válido. - if (gamepad != nullptr) { + if (active_gamepad != nullptr) { // Iteramos sobre todas las acciones, no sobre el número de mandos. - for (const auto& pair : gamepad->bindings) { + for (const auto& pair : active_gamepad->bindings) { // Leemos el estado pre-calculado para el mando y la acción específicos. if (pair.second.just_pressed) { return true; // Se encontró una acción recién pulsada en el mando. diff --git a/source/game/entities/player.cpp b/source/game/entities/player.cpp index 76b93df..67a10c3 100644 --- a/source/game/entities/player.cpp +++ b/source/game/entities/player.cpp @@ -35,18 +35,18 @@ void Player::render() { // Actualiza las variables del objeto void Player::update(float delta_time) { if (!is_paused_) { - checkInput(delta_time); // Comprueba las entradas y modifica variables - move(delta_time); // Recalcula la posición del jugador - animate(delta_time); // Establece la animación del jugador - checkBorders(); // Comprueba si está situado en alguno de los cuatro bordes de la habitación - checkJumpEnd(); // Comprueba si ha finalizado el salto al alcanzar la altura de inicio - checkKillingTiles(); // Comprueba que el jugador no toque ningun tile de los que matan - setColor(); // Establece el color del jugador + handleInput(delta_time); // Comprueba las entradas y modifica variables + move(delta_time); // Recalcula la posición del jugador + animate(delta_time); // Establece la animación del jugador + handleBorders(); // Comprueba si está situado en alguno de los cuatro bordes de la habitación + handleJumpEnd(); // Comprueba si ha finalizado el salto al alcanzar la altura de inicio + handleKillingTiles(); // Comprueba que el jugador no toque ningun tile de los que matan + setColor(); // Establece el color del jugador } } // Comprueba las entradas y modifica variables -void Player::checkInput(float delta_time) { +void Player::handleInput(float delta_time) { (void)delta_time; // No usado en este método, pero mantenido para consistencia // Solo comprueba las entradas de dirección cuando está sobre una superficie @@ -99,7 +99,7 @@ void Player::checkInput(float delta_time) { } // Comprueba si está situado en alguno de los cuatro bordes de la habitación -void Player::checkBorders() { +void Player::handleBorders() { if (x_ < PLAY_AREA_LEFT) { border_ = Room::Border::LEFT; is_on_border_ = true; @@ -126,7 +126,7 @@ void Player::checkBorders() { } // Comprueba el estado del jugador -void Player::checkState(float delta_time) { +void Player::handleState(float delta_time) { (void)delta_time; // No usado actualmente // Reproduce sonidos según el estado @@ -347,7 +347,7 @@ void Player::moveVerticalDown(float delta_time) { // Orquesta el movimiento del jugador void Player::move(float delta_time) { applyGravity(delta_time); // Aplica gravedad al jugador - checkState(delta_time); // Comprueba el estado del jugador + handleState(delta_time); // Comprueba el estado del jugador // Movimiento horizontal if (vx_ < 0.0F) { @@ -388,8 +388,7 @@ void Player::animate(float delta_time) { } // Comprueba si ha finalizado el salto al alcanzar la altura de inicio -void Player::checkJumpEnd() { - // CORRECCIÓN: Usar > (mayor) en lugar de >= (mayor o igual) +void Player::handleJumpEnd() { // Si el jugador vuelve EXACTAMENTE a la altura inicial, debe CONTINUAR en JUMPING // Solo cuando la SUPERA (desciende más allá) cambia a FALLING if (state_ == State::JUMPING && vy_ > 0.0F && static_cast(y_) > last_grounded_position_) { @@ -485,7 +484,7 @@ auto Player::isOnDownSlope() -> bool { } // Comprueba que el jugador no toque ningun tile de los que matan -auto Player::checkKillingTiles() -> bool { +auto Player::handleKillingTiles() -> bool { // Comprueba si hay contacto con algún tile que mata if (std::ranges::any_of(collider_points_, [this](const auto& c) { return room_->getTile(c) == Room::Tile::KILL; diff --git a/source/game/entities/player.hpp b/source/game/entities/player.hpp index d8728af..4d52952 100644 --- a/source/game/entities/player.hpp +++ b/source/game/entities/player.hpp @@ -134,11 +134,11 @@ class Player { void applySpawnValues(const SpawnData& spawn); // Aplica los valores de spawn al jugador // --- Funciones de procesamiento de entrada --- - void checkInput(float delta_time); // Comprueba las entradas y modifica variables + void handleInput(float delta_time); // Comprueba las entradas y modifica variables // --- Funciones de gestión de estado --- - void checkState(float delta_time); // Comprueba el estado del jugador y actualiza variables - void setState(State value); // Cambia el estado del jugador + void handleState(float delta_time); // Comprueba el estado del jugador y actualiza variables + void setState(State value); // Cambia el estado del jugador // --- Funciones de física --- void applyGravity(float delta_time); // Aplica gravedad al jugador @@ -162,10 +162,10 @@ class Player { void placeSprite(); // Coloca el sprite en la posición del jugador // --- Funciones de finalización --- - void animate(float delta_time); // Establece la animación del jugador - void checkBorders(); // Comprueba si se halla en alguno de los cuatro bordes - void checkJumpEnd(); // Comprueba si ha finalizado el salto al alcanzar la altura de inicio - auto checkKillingTiles() -> bool; // Comprueba que el jugador no toque ningun tile de los que matan - void playJumpSound(); // Calcula y reproduce el sonido de salto - void playFallSound(); // Calcula y reproduce el sonido de caer + void animate(float delta_time); // Establece la animación del jugador + void handleBorders(); // Comprueba si se halla en alguno de los cuatro bordes + void handleJumpEnd(); // Comprueba si ha finalizado el salto al alcanzar la altura de inicio + auto handleKillingTiles() -> bool; // Comprueba que el jugador no toque ningun tile de los que matan + void playJumpSound(); // Calcula y reproduce el sonido de salto + void playFallSound(); // Calcula y reproduce el sonido de caer }; \ No newline at end of file