el joc es pot controlar amb el primer mando que hi haja conectat

This commit is contained in:
2025-11-02 18:18:12 +01:00
parent ee1dc70bd8
commit 6c766be023
3 changed files with 41 additions and 30 deletions

View File

@@ -70,18 +70,24 @@ auto Input::checkAction(Action action, bool repeat, bool check_keyboard, const s
} }
} }
if (gamepad != nullptr) { // Si gamepad es nullptr pero hay mandos conectados, usar el primero
success_controller = checkAxisInput(action, gamepad, repeat); std::shared_ptr<Gamepad> 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) { if (!success_controller) {
success_controller = checkTriggerInput(action, gamepad, repeat); success_controller = checkTriggerInput(action, active_gamepad, repeat);
} }
if (!success_controller) { if (!success_controller) {
if (repeat) { // El usuario quiere saber si está pulsada (estado mantenido) 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) } 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<Gamepad>& g
} }
} }
// Si gamepad es nullptr pero hay mandos conectados, usar el primero
std::shared_ptr<Gamepad> active_gamepad = gamepad;
if (active_gamepad == nullptr && !gamepads_.empty()) {
active_gamepad = gamepads_[0];
}
// --- Comprobación del Mando --- // --- Comprobación del Mando ---
// Comprobamos si hay mandos y si el índice solicitado es válido. // 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. // 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. // Leemos el estado pre-calculado para el mando y la acción específicos.
if (pair.second.just_pressed) { if (pair.second.just_pressed) {
return true; // Se encontró una acción recién pulsada en el mando. return true; // Se encontró una acción recién pulsada en el mando.

View File

@@ -35,18 +35,18 @@ void Player::render() {
// Actualiza las variables del objeto // Actualiza las variables del objeto
void Player::update(float delta_time) { void Player::update(float delta_time) {
if (!is_paused_) { if (!is_paused_) {
checkInput(delta_time); // Comprueba las entradas y modifica variables handleInput(delta_time); // Comprueba las entradas y modifica variables
move(delta_time); // Recalcula la posición del jugador move(delta_time); // Recalcula la posición del jugador
animate(delta_time); // Establece la animació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 handleBorders(); // 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 handleJumpEnd(); // 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 handleKillingTiles(); // Comprueba que el jugador no toque ningun tile de los que matan
setColor(); // Establece el color del jugador setColor(); // Establece el color del jugador
} }
} }
// Comprueba las entradas y modifica variables // 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 (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 // 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 // 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) { if (x_ < PLAY_AREA_LEFT) {
border_ = Room::Border::LEFT; border_ = Room::Border::LEFT;
is_on_border_ = true; is_on_border_ = true;
@@ -126,7 +126,7 @@ void Player::checkBorders() {
} }
// Comprueba el estado del jugador // Comprueba el estado del jugador
void Player::checkState(float delta_time) { void Player::handleState(float delta_time) {
(void)delta_time; // No usado actualmente (void)delta_time; // No usado actualmente
// Reproduce sonidos según el estado // Reproduce sonidos según el estado
@@ -347,7 +347,7 @@ void Player::moveVerticalDown(float delta_time) {
// Orquesta el movimiento del jugador // Orquesta el movimiento del jugador
void Player::move(float delta_time) { void Player::move(float delta_time) {
applyGravity(delta_time); // Aplica gravedad al jugador 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 // Movimiento horizontal
if (vx_ < 0.0F) { 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 // Comprueba si ha finalizado el salto al alcanzar la altura de inicio
void Player::checkJumpEnd() { void Player::handleJumpEnd() {
// CORRECCIÓN: Usar > (mayor) en lugar de >= (mayor o igual)
// Si el jugador vuelve EXACTAMENTE a la altura inicial, debe CONTINUAR en JUMPING // Si el jugador vuelve EXACTAMENTE a la altura inicial, debe CONTINUAR en JUMPING
// Solo cuando la SUPERA (desciende más allá) cambia a FALLING // Solo cuando la SUPERA (desciende más allá) cambia a FALLING
if (state_ == State::JUMPING && vy_ > 0.0F && static_cast<int>(y_) > last_grounded_position_) { if (state_ == State::JUMPING && vy_ > 0.0F && static_cast<int>(y_) > last_grounded_position_) {
@@ -485,7 +484,7 @@ auto Player::isOnDownSlope() -> bool {
} }
// Comprueba que el jugador no toque ningun tile de los que matan // 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 // Comprueba si hay contacto con algún tile que mata
if (std::ranges::any_of(collider_points_, [this](const auto& c) { if (std::ranges::any_of(collider_points_, [this](const auto& c) {
return room_->getTile(c) == Room::Tile::KILL; return room_->getTile(c) == Room::Tile::KILL;

View File

@@ -134,10 +134,10 @@ class Player {
void applySpawnValues(const SpawnData& spawn); // Aplica los valores de spawn al jugador void applySpawnValues(const SpawnData& spawn); // Aplica los valores de spawn al jugador
// --- Funciones de procesamiento de entrada --- // --- 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 --- // --- Funciones de gestión de estado ---
void checkState(float delta_time); // Comprueba el estado del jugador y actualiza variables void handleState(float delta_time); // Comprueba el estado del jugador y actualiza variables
void setState(State value); // Cambia el estado del jugador void setState(State value); // Cambia el estado del jugador
// --- Funciones de física --- // --- Funciones de física ---
@@ -163,9 +163,9 @@ class Player {
// --- Funciones de finalización --- // --- Funciones de finalización ---
void animate(float delta_time); // Establece la animación del jugador void animate(float delta_time); // Establece la animación del jugador
void checkBorders(); // Comprueba si se halla en alguno de los cuatro bordes void handleBorders(); // Comprueba si se halla en alguno de los cuatro bordes
void checkJumpEnd(); // Comprueba si ha finalizado el salto al alcanzar la altura de inicio void handleJumpEnd(); // 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 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 playJumpSound(); // Calcula y reproduce el sonido de salto
void playFallSound(); // Calcula y reproduce el sonido de caer void playFallSound(); // Calcula y reproduce el sonido de caer
}; };