From 25ecc742518beecf3ad82004e260c402969e6c94 Mon Sep 17 00:00:00 2001 From: Sergio Valor Date: Sun, 5 Apr 2026 23:07:03 +0200 Subject: [PATCH] ajustant al jugador --- data/player/player.aseprite | Bin 837 -> 834 bytes data/player/player.gif | Bin 323 -> 324 bytes source/game/entities/player.cpp | 44 ++++++++++++++++---------------- source/game/entities/player.hpp | 5 ++-- 4 files changed, 25 insertions(+), 24 deletions(-) diff --git a/data/player/player.aseprite b/data/player/player.aseprite index c07ec96190f412ff6c03f04202cb19b4e60d0e6b..414ce4f1c64444a4d1deef41417d28fece769060 100644 GIT binary patch delta 429 zcmX@gc8HD9X(D4iqt(R57lDBc3=FIa3=E7w`actp00VXg0fve>x?PT33V<{GuLf>$H6yzb1=HZwWOszR9{#fmv&EJ(Eto?I}Y( z1_ci01G5gOc>n(&sVydb$dTbdn1aWmSlcsv!d({yruD{IPFuA9*P_yT@vmp1Esh^% z`kn~1{MScDh7=$TauB(W)57VxR5TkxCr@CK20GUh=v*Eq2cI{ddVl_J4vOh0Tp@a( zC_zQBZ;JV2qq*MG*Y|wVt@hrQ^2WN|;@Mi6>8p5mNHJZDM>EbJ$j26%{J_w31&1cj zVWk(Dalihbzh!kWKH-x($=)BjyOzJ)HuYO%{08T^_4lK+H|F!r&SlyO0J^=3 A-~a#s delta 364 zcmX@ac9f0Lbs}RuqxHnb7mPuZ`R6u;uJ?^H>tfvx=a5bUuA#g>e(~znAdYN{YzqCVEFZsks$?0GXgQhtk5n)J_ZFI zri)u5TwZK`?EsiZHWBkX&c{J#;oLLT7%Ur zGxFRuc^9LO2T&`}89*;(Ree76|9_6hsTls*5HIa`(+BjDs+-hYpqJhsud{7k|34`3 zWX(DQrccReehQwf$0TiT+T+M|z=4B#x%b}6lmG2^dv0}16B&w diff --git a/data/player/player.gif b/data/player/player.gif index 3462b2d115ce5ca5b612240da67e89d6f0d3f3af..2c6683c6c916aa8bf4fa0a2f28748c201d0e7d58 100644 GIT binary patch delta 153 zcmV;K0A~Ng0>lE4lOe7kATH!0j^zoI=E7|rk;)wFBlw;trH$gdY1`hW|Ov?Fcy z+k0cT>2otSOpDNOetdv`T!92VGlYqUfQF1%fk2B?hLjAKRuPw&nVTvzoB*4lqMjn7 z3@W3lrYEbVub82zsj#J|ueYtFy0V;{1qA@XuC=7Q#;LOm!owoX!^FYD($Le<)7H=` H03iT75Qc83lOe4jAPS@)j^zoI=E7|rk;)wFBlw;trH$gdY1`hWtFv?FYG zT+aU1=WuyMZR5}Udto$zT{eUShJt-wiHtXYg*FV63|0}8l~|XQmY7tVlP8`cp`oIj zr>3Nsm8_YinE$;!(B%goXz(a_P)&eX~P GApkoltWUWB diff --git a/source/game/entities/player.cpp b/source/game/entities/player.cpp index 5350d90..3f4dcc8 100644 --- a/source/game/entities/player.cpp +++ b/source/game/entities/player.cpp @@ -201,7 +201,7 @@ void Player::updateOnAir(float delta_time) { // Movimiento físico del estado ON_GROUND void Player::moveOnGround(float delta_time) { // Determinama cuál debe ser la velocidad a partir de automovement o de wanna_go_ - updateVelocity(); + updateVelocity(delta_time); if (vx_ == 0.0F) { return; } @@ -233,7 +233,7 @@ void Player::moveOnGround(float delta_time) { // Movimiento físico del estado ON_SLOPE void Player::moveOnSlope(float delta_time) { // Determinama cuál debe ser la velocidad a partir de automovement o de wanna_go_ - updateVelocity(); + updateVelocity(delta_time); // Verificar rampa válida antes de comprobar velocidad: si no hay rampa siempre caer, // independientemente de si hay o no input (evita bloqueo con vx_=0 y slope null) @@ -320,7 +320,7 @@ void Player::moveOnSlope(float delta_time) { // El jugador puede moverse horizontalmente en el aire y la gravedad siempre actúa. void Player::moveOnAir(float delta_time) { // Movimiento horizontal libre según wanna_go_ (permite girar en el aire) - updateVelocity(); + updateVelocity(delta_time); applyHorizontalMovement(delta_time); // Gravedad @@ -649,31 +649,31 @@ void Player::placeSprite() { sprite_->setPos(x_, y_); } -// Calcula la velocidad en x -void Player::updateVelocity() { +// Calcula la velocidad en x con inercia ligera (interpolación hacia vel. objetivo) +void Player::updateVelocity(float delta_time) { + float target = 0.0F; if (auto_movement_) { // La cinta transportadora tiene el control - vx_ = HORIZONTAL_VELOCITY * room_->getConveyorBeltDirection(); - sprite_->setFlip(vx_ < 0.0F ? Flip::LEFT : Flip::RIGHT); + target = HORIZONTAL_VELOCITY * room_->getConveyorBeltDirection(); } else { - // El jugador tiene el control switch (wanna_go_) { - case Direction::LEFT: - vx_ = -HORIZONTAL_VELOCITY; - sprite_->setFlip(Flip::LEFT); - break; - case Direction::RIGHT: - vx_ = HORIZONTAL_VELOCITY; - sprite_->setFlip(Flip::RIGHT); - break; - case Direction::NONE: - vx_ = 0.0F; - break; - default: - vx_ = 0.0F; - break; + case Direction::LEFT: target = -HORIZONTAL_VELOCITY; break; + case Direction::RIGHT: target = HORIZONTAL_VELOCITY; break; + default: target = 0.0F; break; } } + + // Orientación del sprite según la dirección deseada (sin cambiar cuando target=0) + if (target > 0.0F) { sprite_->setFlip(Flip::RIGHT); } + else if (target < 0.0F) { sprite_->setFlip(Flip::LEFT); } + + // Aproximar vx_ al objetivo con paso limitado por la aceleración + const float STEP = HORIZONTAL_ACCEL * delta_time; + if (vx_ < target) { + vx_ = std::min(vx_ + STEP, target); + } else if (vx_ > target) { + vx_ = std::max(vx_ - STEP, target); + } } // Aplica movimiento horizontal con colisión de muros diff --git a/source/game/entities/player.hpp b/source/game/entities/player.hpp index 1ad4d6b..e7c62de 100644 --- a/source/game/entities/player.hpp +++ b/source/game/entities/player.hpp @@ -33,7 +33,8 @@ class Player { }; // --- Constantes de física (públicas para permitir cálculos en structs) --- - static constexpr float HORIZONTAL_VELOCITY = 60.0F; // Velocidad horizontal en pixels/segundo + static constexpr float HORIZONTAL_VELOCITY = 60.0F; // Velocidad horizontal objetivo en pixels/segundo + static constexpr float HORIZONTAL_ACCEL = 500.0F; // Aceleración/deceleración horizontal en pixels/segundo² (inercia ligera) static constexpr float MAX_VY = 160.0F; // Velocidad vertical máxima en pixels/segundo static constexpr float JUMP_VELOCITY = -140.0F; // Velocidad inicial del salto en pixels/segundo static constexpr float GRAVITY_FORCE = 360.0F; // Fuerza de gravedad en pixels/segundo² @@ -180,6 +181,6 @@ class Player { void animate(float delta_time); // Establece la animación del jugador auto handleBorders() -> Room::Border; // Comprueba si se halla en alguno de los cuatro bordes auto handleKillingTiles() -> bool; // Comprueba que el jugador no toque ningun tile de los que matan - void updateVelocity(); // Calcula la velocidad en x + void updateVelocity(float delta_time); // Calcula la velocidad en x con inercia ligera void markAsDead(); // Marca al jugador como muerto }; \ No newline at end of file