From 4de34c388d76231751c7841db3cfedc248b6b8ae Mon Sep 17 00:00:00 2001 From: Sergio Valor Date: Thu, 18 Aug 2022 13:42:30 +0200 Subject: [PATCH] =?UTF-8?q?A=C3=B1adidas=20f=C3=ADsicas=20al=20movimiento?= =?UTF-8?q?=20y=20salto?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- data/animations/player.ani | 4 +- media/gfx/player.png | Bin 7523 -> 7754 bytes source/game.cpp | 10 ++- source/player.cpp | 128 ++++++++++++++++++++++++++++++------- source/player.h | 50 +++++++++------ 5 files changed, 147 insertions(+), 45 deletions(-) diff --git a/data/animations/player.ani b/data/animations/player.ani index 6bd3498..5b628b0 100644 --- a/data/animations/player.ani +++ b/data/animations/player.ani @@ -19,8 +19,8 @@ frames=8,9,10,10,9,8,11,12,13,13,14,15 [animation] name=jump speed=10 -loop=yes -frames=16 +loop=no +frames=16,17,18,17,16 [/animation] [animation] diff --git a/media/gfx/player.png b/media/gfx/player.png index 59e22be846bbb332b951585a5ab44f1f444b359a..fe0808be8cd783f1f9d510dd55833d5569d69487 100644 GIT binary patch literal 7754 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 literal 7523 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 NSVdd8{E>C&{{U6Nk6-`* diff --git a/source/game.cpp b/source/game.cpp index ba743d0..05e8b21 100644 --- a/source/game.cpp +++ b/source/game.cpp @@ -116,6 +116,12 @@ void Game::renderDebugInfo() text = std::to_string((int)player->sprite->getPosX()) + "," + std::to_string((int)player->sprite->getPosY()); debugText->write(0, line, text, -1); - //text = std::to_string(player->checkMapCollisions()); - //debugText->write(0, line+=6, text, -1); + text = "VY " + std::to_string(player->vy) + " " + std::to_string(player->jumpStrenght); + debugText->write(0, line+=6, text, -1); + + text = "VX " + std::to_string(player->vx); + debugText->write(0, line+=6, text, -1); + + text = "jump_pressed " + std::to_string(player->jumpPressed); + debugText->write(0, line+=6, text, -1); } \ No newline at end of file diff --git a/source/player.cpp b/source/player.cpp index b07c52c..84c2744 100644 --- a/source/player.cpp +++ b/source/player.cpp @@ -18,7 +18,7 @@ Player::Player(SDL_Renderer *renderer, Asset *asset, Input *input, Map *map) sprite = new AnimatedSprite(texture, renderer, asset->get("player.ani")); x = 3 * 16; - y = 40; + y = 168; vx = 0; vy = 0; const SDL_Rect rect = {(int)x, (int)y, 16, 24}; @@ -26,18 +26,25 @@ Player::Player(SDL_Renderer *renderer, Asset *asset, Input *input, Map *map) sprite->setCurrentAnimation("stand"); sprite->setFlip(SDL_FLIP_HORIZONTAL); + // jumpStrenght = -5.6f; + jumpStrenght = 2.0f; gravity = 0.3f; - can_jump = true; + accelX = 0.12f; + maxVX = 1.5f; + maxVY = 4.0f; + + jumping = false; + jumpPressed = false; standing = true; - invulnerable = true; - jumpforce = 10; + invulnerable = false; enabled = true; cooldown = 0; - lifes = 10; + lives = 10; coins = 0; key.insert(key.end(), {0, 0, 0, 0, 0, 0}); const SDL_Point p = {0, 0}; collider.insert(collider.end(), {p, p, p, p, p, p}); + underFeet.insert(underFeet.end(), {p, p}); } // Destructor @@ -59,6 +66,7 @@ void Player::update() checkInput(); addGravity(); move(); + animate(); } // Dibuja el objeto @@ -70,36 +78,59 @@ void Player::render() // Comprueba las entradas y modifica variables void Player::checkInput() { - const float speed = 1.0f; - // Solo comprueba las entradas de dirección cuando está de pie if (input->checkInput(INPUT_LEFT, REPEAT_TRUE)) { - vx = -speed; + vx = std::max(vx -= accelX, -maxVX); sprite->setFlip(SDL_FLIP_NONE); - sprite->setCurrentAnimation("walk"); } else if (input->checkInput(INPUT_RIGHT, REPEAT_TRUE)) { - vx = speed; + vx = std::min(vx += accelX, maxVX); sprite->setFlip(SDL_FLIP_HORIZONTAL); - sprite->setCurrentAnimation("walk"); } else { - vx = 0; - sprite->setCurrentAnimation("stand"); + if (vx > 0.0f) + { + vx = std::max(vx -= accelX, 0.0f); + } + else + { + vx = std::min(vx += accelX, 0.0f); + } } - if (input->checkInput(INPUT_UP, REPEAT_FALSE)) + if (input->checkInput(INPUT_UP, REPEAT_TRUE)) { - vy = -5.0f; + if (!jumping) + { + if (!jumpPressed) + { + jumpStrenght = 2.0f; + vy -= jumpStrenght; + jumping = true; + jumpPressed = true; + } + } + else + { + jumpStrenght = std::max(jumpStrenght -= 0.4f, 0.0f); + vy -= jumpStrenght; + } + } + else + { + jumpPressed = false; } } // Aplica la gravedad void Player::addGravity() { - vy = std::min(vy += gravity, 2.0f); + if (!isOnFloor()) + { + vy = std::min(vy += gravity, maxVY); + } } // Actualiza los puntos de colisión @@ -113,6 +144,9 @@ void Player::updateColliders() collider[3] = {p.x + 15, p.y}; collider[4] = {p.x + 15, p.y + 12}; collider[5] = {p.x + 15, p.y + 23}; + + underFeet[0] = {p.x, p.y + 24}; + underFeet[1] = {p.x + 15, p.y + 24}; } // Compruena las colisiones con el mapa @@ -133,24 +167,39 @@ bool Player::checkMapCollisions() // Mueve al jugador en función de la velocidad/desplazamiento void Player::move() { - const float old_x = x; x += vx; if (checkMapCollisions()) { - x = old_x; + if (vx > 0) + { + do + { + x--; + } while (checkMapCollisions()); + } + else + { + do + { + x++; + } while (checkMapCollisions()); + } + + vx = 0.0f; } - // const float old_y = y; y += vy; if (checkMapCollisions()) { - // y = old_y; if (vy > 0) { do { y--; } while (checkMapCollisions()); + jumping = false; + vy = 0.0f; + jumpStrenght = 2.0f; } else { @@ -159,11 +208,44 @@ void Player::move() y++; } while (checkMapCollisions()); } - - vy = 0; } sprite->setPosX(x); sprite->setPosY(y); - sprite->update(); +} + +// Anima al jugador +void Player::animate() +{ + if (jumping) + { + sprite->setCurrentAnimation("jump"); + } + else + { + if (abs(vx) < 1.00f) + { + sprite->setCurrentAnimation("stand"); + } + else + { + sprite->setCurrentAnimation("walk"); + } + } + + sprite->animate(); +} + +// Comprueba si el jugador tiene suelo debajo de los pies +bool Player::isOnFloor() +{ + bool onFloor = false; + + updateColliders(); + + for (auto f : underFeet) + { + onFloor |= (map->getTile(f) == wall); + } + return onFloor; } \ No newline at end of file diff --git a/source/player.h b/source/player.h index ad21266..89fc19c 100644 --- a/source/player.h +++ b/source/player.h @@ -21,24 +21,32 @@ public: LTexture *texture; // Textura con los graficos del jugador Map *map; // Objeto con el mapa - float x; // Posición del jugador en el eje X - float y; // Posición del jugador en el eje Y - float vx; // Velocidad/desplazamiento del jugador en el eje X - float vy; // Velocidad/desplazamiento del jugador en el eje Y - bool can_jump; // Si puede saltar - bool enabled; // Si está habilitado - bool standing; // Si esta de pie (o quieto?) - bool invulnerable; // Si es invulnerable - int coins; // Cantidad de monedas - int cooldown; // Tiempo de inhabilitación - int jumpforce; // Cantidad de pixels a desplazarse y velocidad que pilla al saltar - int lifes; // Cantidad de vidas - float gravity; // Gravedad - std::vector key; // Indica las llaves que posee el jugador - std::vector collider; // Contiene los puntos de colisión del jugador con el mapa - JA_Sound sound_coin; // Sonido al coger monedas - JA_Sound sound_death; // Sonido al morir - JA_Sound sound_jump; // Sonido al saltar + float x; // Posición del jugador en el eje X + float y; // Posición del jugador en el eje Y + float vx; // Velocidad/desplazamiento del jugador en el eje X + float vy; // Velocidad/desplazamiento del jugador en el eje Y + bool jumping; // Indica si se encuentra saltando + bool jumpPressed; // Indica si esta pulsada la tecla de salto + bool enabled; // Si está habilitado + bool standing; // Si esta de pie (o quieto?) + bool invulnerable; // Indica si se encuentra en estado invulnerable + int coins; // Cantidad de monedas + int cooldown; // Tiempo de inhabilitación + int lives; // Cantidad de vidas + + // Variables que afectan a la inercia del movimiento + float jumpStrenght; // Cantidad de pixels a desplazarse y velocidad que pilla al saltar + float gravity; // Gravedad + float accelX; // Aceleración al desplazarse horizontalmente + float maxVX; // Velocidad mazima de desplazamiento horizontal + float maxVY; // Velocidad mazima de desplazamiento vertical + + std::vector key; // Indica las llaves que posee el jugador + std::vector collider; // Contiene los puntos de colisión del jugador con el mapa + std::vector underFeet; // Contiene los puntos que hay bajo cada pie del jugador + JA_Sound sound_coin; // Sonido al coger monedas + JA_Sound sound_death; // Sonido al morir + JA_Sound sound_jump; // Sonido al saltar // Comprueba las entradas y modifica variables void checkInput(); @@ -55,6 +63,12 @@ public: // Mueve al jugador en función de la velocidad/desplazamiento void move(); + // Anima al jugador + void animate(); + + // Comprueba si el jugador tiene suelo debajo de los pies + bool isOnFloor(); + public: // Constructor Player(SDL_Renderer *renderer, Asset *asset, Input *input, Map *map);