From d21a4747549e42a830ae63b1bf9e58267b3a14bc Mon Sep 17 00:00:00 2001 From: Sergio Valor Date: Sun, 10 Aug 2025 14:42:22 +0200 Subject: [PATCH] afegida Player::computeAnimation() i soluciona algunes animacions incorrectes que havia --- source/player.cpp | 111 +++++++++++++++++++++++++++++----------------- source/player.h | 75 +++++++++++++++---------------- 2 files changed, 108 insertions(+), 78 deletions(-) diff --git a/source/player.cpp b/source/player.cpp index bd7333d..79925f6 100644 --- a/source/player.cpp +++ b/source/player.cpp @@ -15,6 +15,9 @@ #include "scoreboard.h" // Para Scoreboard #include "stage.h" // Para power_can_be_added #include "texture.h" // Para Texture +#ifdef _DEBUG +#include +#endif // Constructor Player::Player(const Config &config) @@ -389,6 +392,60 @@ void Player::render() { } } +// Calcula la animacion de moverse y disparar del jugador +auto Player::computeAnimation() const -> std::pair { + const std::string baseAnim = (walking_state_ == State::WALKING_STOP) ? "stand" : "walk"; + std::string animName; + SDL_FlipMode flipMode = SDL_FLIP_NONE; + + switch (firing_state_) { + case State::FIRING_NONE: + animName = baseAnim; + flipMode = (walking_state_ == State::WALKING_RIGHT) ? SDL_FLIP_HORIZONTAL : SDL_FLIP_NONE; + break; + + case State::FIRING_UP: + animName = baseAnim + "-fire-center"; + flipMode = (walking_state_ == State::WALKING_RIGHT) ? SDL_FLIP_HORIZONTAL : SDL_FLIP_NONE; + break; + + case State::FIRING_LEFT: + case State::FIRING_RIGHT: + animName = baseAnim + "-fire-side"; + flipMode = (firing_state_ == State::FIRING_RIGHT) ? SDL_FLIP_HORIZONTAL : SDL_FLIP_NONE; + break; + + case State::RECOILING_UP: + animName = baseAnim + "-recoil-center"; + flipMode = (walking_state_ == State::WALKING_RIGHT) ? SDL_FLIP_HORIZONTAL : SDL_FLIP_NONE; + break; + + case State::RECOILING_LEFT: + case State::RECOILING_RIGHT: + animName = baseAnim + "-recoil-side"; + flipMode = (firing_state_ == State::RECOILING_RIGHT) ? SDL_FLIP_HORIZONTAL : SDL_FLIP_NONE; + break; + + case State::COOLING_UP: + animName = baseAnim + "-cool-center"; + flipMode = (walking_state_ == State::WALKING_RIGHT) ? SDL_FLIP_HORIZONTAL : SDL_FLIP_NONE; + break; + + case State::COOLING_LEFT: + case State::COOLING_RIGHT: + animName = baseAnim + "-cool-side"; + flipMode = (firing_state_ == State::COOLING_RIGHT) ? SDL_FLIP_HORIZONTAL : SDL_FLIP_NONE; + break; + + default: + animName = baseAnim; + flipMode = (walking_state_ == State::WALKING_RIGHT) ? SDL_FLIP_HORIZONTAL : SDL_FLIP_NONE; + break; + } + + return {animName, flipMode}; +} + // Establece la animación correspondiente al estado void Player::setAnimation() { switch (playing_state_) { @@ -398,64 +455,36 @@ void Player::setAnimation() { case State::LEAVING_SCREEN: case State::TITLE_ANIMATION: case State::CREDITS: { - // Crea cadenas de texto para componer el nombre de la animación - const std::string WALK_ANIMATION = walking_state_ == State::WALKING_STOP ? "stand" : "walk"; - const std::string FIRE_ANIMATION = firing_state_ == State::FIRING_UP ? "-fire-center" : "-fire-side"; - const std::string RECOIL_ANIMATION = firing_state_ == State::RECOILING_UP ? "-recoil-center" : "-recoil-side"; - const std::string COOL_ANIMATION = firing_state_ == State::COOLING_UP ? "-cool-center" : "-cool-side"; - - const SDL_FlipMode FLIP_WALK = walking_state_ == State::WALKING_RIGHT ? SDL_FLIP_HORIZONTAL : SDL_FLIP_NONE; - const SDL_FlipMode FLIP_FIRE = firing_state_ == State::FIRING_RIGHT ? SDL_FLIP_HORIZONTAL : SDL_FLIP_NONE; - const SDL_FlipMode FLIP_RECOIL = firing_state_ == State::RECOILING_RIGHT ? SDL_FLIP_HORIZONTAL : SDL_FLIP_NONE; - const SDL_FlipMode FLIP_COOL = firing_state_ == State::COOLING_RIGHT ? SDL_FLIP_HORIZONTAL : SDL_FLIP_NONE; - - // Establece la animación a partir de las cadenas - if (firing_state_ == State::FIRING_NONE) { - // No esta disparando - player_sprite_->setCurrentAnimation(WALK_ANIMATION, false); - player_sprite_->setFlip(FLIP_WALK); - } else if (isRecoiling()) { - // Retroceso - player_sprite_->setCurrentAnimation(WALK_ANIMATION + RECOIL_ANIMATION, false); - player_sprite_->setFlip(FLIP_RECOIL); - } else if (isCooling()) { - // Acaba de disparar - player_sprite_->setCurrentAnimation(WALK_ANIMATION + COOL_ANIMATION, false); - player_sprite_->setFlip(FLIP_COOL); - } else { - // Está disparando - player_sprite_->setCurrentAnimation(WALK_ANIMATION + FIRE_ANIMATION, false); - // Si dispara de lado, invierte el sprite segun hacia donde dispara - // Si dispara recto, invierte el sprite segun hacia donde camina - player_sprite_->setFlip(FIRE_ANIMATION == "-fire-center" ? FLIP_WALK : FLIP_FIRE); - } + auto [animName, flipMode] = computeAnimation(); + player_sprite_->setCurrentAnimation(animName, false); + player_sprite_->setFlip(flipMode); break; } - case State::WAITING: { + + case State::WAITING: player_sprite_->setCurrentAnimation("hello"); break; - } + case State::ROLLING: - case State::CONTINUE_TIME_OUT: { + case State::CONTINUE_TIME_OUT: player_sprite_->setCurrentAnimation("rolling"); break; - } + case State::LYING_ON_THE_FLOOR_FOREVER: case State::ENTERING_NAME: - case State::CONTINUE: { + case State::CONTINUE: player_sprite_->setCurrentAnimation("dead"); break; - } - case State::CELEBRATING: { + + case State::CELEBRATING: player_sprite_->setCurrentAnimation("celebration"); break; - } + default: break; } - // Actualiza las animaciones de los sprites - player_sprite_->update(); // Hace avanzar las animaciones y mueve el cadaver del jugador + player_sprite_->update(); power_sprite_->update(); } diff --git a/source/player.h b/source/player.h index e575112..958de9a 100644 --- a/source/player.h +++ b/source/player.h @@ -260,41 +260,42 @@ class Player { bool uses_keyboard_ = false; // Indica si usa el teclado como dispositivo de control // --- Métodos internos --- - void shiftColliders(); // Actualiza el círculo de colisión a la posición del jugador - void shiftSprite(); // Recoloca el sprite - void updateInvulnerable(); // Monitoriza el estado de invulnerabilidad - void updateContinueCounter(); // Actualiza el contador de continue - void updateEnterNameCounter(); // Actualiza el contador de entrar nombre - void updateShowingName(); // Actualiza el estado SHOWING_NAME - void decNameEntryCounter(); // Decrementa el contador de entrar nombre - void updateScoreboard(); // Actualiza el panel del marcador - void setScoreboardMode(Scoreboard::Mode mode) const; // Cambia el modo del marcador - void playSound(const std::string &name) const; // Hace sonar un sonido - [[nodiscard]] auto isRenderable() const -> bool; // Indica si se puede dibujar el objeto - void addScoreToScoreBoard() const; // Añade una puntuación a la tabla de records - void handleFiringCooldown(); // Gestiona el tiempo de espera después de disparar antes de permitir otro disparo - void handleRecoilAndCooling(); // Procesa simultáneamente el retroceso del arma y la transición al estado de enfriamiento si aplica - void handleCoolingState(); // Actualiza la lógica interna mientras el sistema está en estado de enfriamiento - void transitionToRecoiling(); // Cambia el estado actual al de retroceso después de disparar - void transitionToCooling(); // Cambia el estado actual al de enfriamiento (por ejemplo, tras una ráfaga o sobrecalentamiento) - void completeCooling(); // Finaliza el proceso de enfriamiento y restablece el estado listo para disparar - void handlePlayingMovement(); // Gestiona el movimiento del personaje u objeto durante el estado de juego activo - void handleRollingMovement(); // Actualiza la lógica de movimiento de "rodar" (posiblemente tras impacto o acción especial) - void handleRollingBoundaryCollision(); // Detecta y maneja colisiones del objeto rodante con los límites de la pantalla - void handleRollingGroundCollision(); // Gestiona la interacción del objeto rodante con el suelo (rebotes, frenado, etc.) - void handleRollingStop(); // Detiene el movimiento del objeto rodante cuando se cumplen las condiciones necesarias - void handleRollingBounce(); // Aplica una lógica de rebote al colisionar con superficies durante el rodamiento - void handleTitleAnimation(); // Ejecuta la animación del título en pantalla (ej. entrada, parpadeo o desplazamiento) - void handleContinueTimeOut(); // Gestiona el tiempo de espera en la pantalla de "Continuar" y decide si pasar a otro estado - void handleLeavingScreen(); // Lógica para salir de la pantalla actual (transición visual o cambio de escena) - void handleEnteringScreen(); // Lógica para entrar en una nueva pantalla, posiblemente con animación o retraso - void handlePlayer1Entering(); // Controla la animación o posición de entrada del Jugador 1 en pantalla - void handlePlayer2Entering(); // Controla la animación o posición de entrada del Jugador 2 en pantalla - void handleCreditsMovement(); // Movimiento general en la pantalla de créditos (desplazamiento vertical u horizontal) - void handleCreditsRightMovement(); // Lógica específica para mover los créditos hacia la derecha - void handleCreditsLeftMovement(); // Lógica específica para mover los créditos hacia la izquierda - void handleWaitingMovement(); // Controla la animación del jugador saludando - void updateWalkingStateForCredits(); // Actualiza el estado de caminata de algún personaje u elemento animado en los créditos - void setInputBasedOnPlayerId(); // Asocia las entradas de control en función del identificador del jugador (teclas, mando, etc.) - void updateStepCounter(); // Incrementa o ajusta el contador de pasos para animaciones o mecánicas relacionadas con movimiento + void shiftColliders(); // Actualiza el círculo de colisión a la posición del jugador + void shiftSprite(); // Recoloca el sprite + void updateInvulnerable(); // Monitoriza el estado de invulnerabilidad + void updateContinueCounter(); // Actualiza el contador de continue + void updateEnterNameCounter(); // Actualiza el contador de entrar nombre + void updateShowingName(); // Actualiza el estado SHOWING_NAME + void decNameEntryCounter(); // Decrementa el contador de entrar nombre + void updateScoreboard(); // Actualiza el panel del marcador + void setScoreboardMode(Scoreboard::Mode mode) const; // Cambia el modo del marcador + void playSound(const std::string &name) const; // Hace sonar un sonido + [[nodiscard]] auto isRenderable() const -> bool; // Indica si se puede dibujar el objeto + void addScoreToScoreBoard() const; // Añade una puntuación a la tabla de records + void handleFiringCooldown(); // Gestiona el tiempo de espera después de disparar antes de permitir otro disparo + void handleRecoilAndCooling(); // Procesa simultáneamente el retroceso del arma y la transición al estado de enfriamiento si aplica + void handleCoolingState(); // Actualiza la lógica interna mientras el sistema está en estado de enfriamiento + void transitionToRecoiling(); // Cambia el estado actual al de retroceso después de disparar + void transitionToCooling(); // Cambia el estado actual al de enfriamiento (por ejemplo, tras una ráfaga o sobrecalentamiento) + void completeCooling(); // Finaliza el proceso de enfriamiento y restablece el estado listo para disparar + void handlePlayingMovement(); // Gestiona el movimiento del personaje u objeto durante el estado de juego activo + void handleRollingMovement(); // Actualiza la lógica de movimiento de "rodar" (posiblemente tras impacto o acción especial) + void handleRollingBoundaryCollision(); // Detecta y maneja colisiones del objeto rodante con los límites de la pantalla + void handleRollingGroundCollision(); // Gestiona la interacción del objeto rodante con el suelo (rebotes, frenado, etc.) + void handleRollingStop(); // Detiene el movimiento del objeto rodante cuando se cumplen las condiciones necesarias + void handleRollingBounce(); // Aplica una lógica de rebote al colisionar con superficies durante el rodamiento + void handleTitleAnimation(); // Ejecuta la animación del título en pantalla (ej. entrada, parpadeo o desplazamiento) + void handleContinueTimeOut(); // Gestiona el tiempo de espera en la pantalla de "Continuar" y decide si pasar a otro estado + void handleLeavingScreen(); // Lógica para salir de la pantalla actual (transición visual o cambio de escena) + void handleEnteringScreen(); // Lógica para entrar en una nueva pantalla, posiblemente con animación o retraso + void handlePlayer1Entering(); // Controla la animación o posición de entrada del Jugador 1 en pantalla + void handlePlayer2Entering(); // Controla la animación o posición de entrada del Jugador 2 en pantalla + void handleCreditsMovement(); // Movimiento general en la pantalla de créditos (desplazamiento vertical u horizontal) + void handleCreditsRightMovement(); // Lógica específica para mover los créditos hacia la derecha + void handleCreditsLeftMovement(); // Lógica específica para mover los créditos hacia la izquierda + void handleWaitingMovement(); // Controla la animación del jugador saludando + void updateWalkingStateForCredits(); // Actualiza el estado de caminata de algún personaje u elemento animado en los créditos + void setInputBasedOnPlayerId(); // Asocia las entradas de control en función del identificador del jugador (teclas, mando, etc.) + void updateStepCounter(); // Incrementa o ajusta el contador de pasos para animaciones o mecánicas relacionadas con movimiento + auto computeAnimation() const -> std::pair; // Calcula la animacion de moverse y disparar del jugador }; \ No newline at end of file