Añadida la animación de morir

This commit is contained in:
2022-09-24 00:03:05 +02:00
parent e18db352e0
commit 330185720d
7 changed files with 133 additions and 30 deletions

View File

@@ -3,20 +3,24 @@
// Constructor
Game::Game(SDL_Renderer *renderer, Screen *screen, Asset *asset, Input *input, Debug *debug)
{
// Inicializa algunas variables
spawnPoint = {63, 190, 0, 0, s_standing, SDL_FLIP_NONE};
currentMap = "01.map";
// Copia punteros
this->renderer = renderer;
this->asset = asset;
this->screen = screen;
this->input = input;
this->debug = debug;
this->debug->setEnabled(true);
// this->debug->setEnabled(true);
// Reserva memoria para los objetos
scoreboard = new ScoreBoard(renderer, asset, input, &board);
eventHandler = new SDL_Event();
itemTracker = new ItemTracker();
map = new Map(asset->get("01.map"), renderer, asset, itemTracker);
player = new Player(renderer, asset, input, map, debug, &board.diamonds);
map = new Map(asset->get(currentMap), renderer, asset, itemTracker);
player = new Player(spawnPoint, renderer, asset, input, map, debug, &board.diamonds);
enemyEngine = new EnemyEngine(renderer, asset, player, map, asset->get(map->getEnemyFile()));
music = JA_LoadMusic(asset->get("music_surface.ogg").c_str());
@@ -192,9 +196,11 @@ void Game::checkEventHandler()
case SDL_SCANCODE_R:
delete map;
map = new Map(asset->get("01.map"), renderer, asset, itemTracker);
map = new Map(asset->get(currentMap), renderer, asset, itemTracker);
delete player;
player = new Player(renderer, asset, input, map, debug, &board.diamonds);
player = new Player(spawnPoint, renderer, asset, input, map, debug, &board.diamonds);
delete enemyEngine;
enemyEngine = new EnemyEngine(renderer, asset, player, map, asset->get(map->getEnemyFile()));
break;
@@ -270,7 +276,6 @@ void Game::renderDebugInfo()
// Cambia el mapa
bool Game::changeMap(std::string file)
{
bool success = false;
// En las habitaciones los limites tienen la cadena del fichero o un 0 en caso de no limitar con nada
if (file != "0")
{ // Verifica que exista el fichero que se va a cargar
@@ -284,11 +289,14 @@ bool Game::changeMap(std::string file)
delete enemyEngine;
enemyEngine = new EnemyEngine(renderer, asset, player, map, asset->get(map->getEnemyFile()));
success = true;
// Actualiza el valor de la variable
currentMap = file;
return true;
}
}
return success;
return false;
}
// Comprueba si el jugador está en el borde y se ha de cambiar el mapa
@@ -296,10 +304,12 @@ void Game::checkScreenBorders()
{
if (player->isOnScreenBorder())
{
if (changeMap(map->getRoomFileName(player->getBorder())))
const std::string room_name = map->getRoomFileName(player->getBorder());
if (changeMap(room_name))
{
player->setMap(map);
player->switchBorders();
spawnPoint = player->getSpawnParams();
}
}
}
@@ -315,10 +325,14 @@ void Game::reLoadTextures()
// Comprueba las colisiones del jugador con los enemigos
bool Game::checkPlayerEnemyCollisions()
{
if (player->getLivingState() != l_alive)
{
return false;
}
if (enemyEngine->checkEnemyCollision(player->getCollider()))
{
debug->add("COLLISION");
player->setLivingState(l_dead);
player->setLivingState(l_dying);
return true;
}
return false;
@@ -344,9 +358,9 @@ void Game::killPlayer()
board.lives--;
// Destruye el mapa, el jugador y los enemigos
//delete map;
// delete map;
delete player;
//delete enemyEngine;
// delete enemyEngine;
// Sonido
// JA_PlaySound(deathSound);
@@ -354,7 +368,7 @@ void Game::killPlayer()
// setBlackScreen();
// Crea el nuevo mapa, el nuevo jugador y nuevos enemigos
//map = new Map(asset->get("01.map"), renderer, asset, itemTracker);
player = new Player(renderer, asset, input, map, debug, &board.diamonds);
//enemyEngine = new EnemyEngine(renderer, asset, player, map, asset->get(map->getEnemyFile()));
// map = new Map(asset->get("01.map"), renderer, asset, itemTracker);
player = new Player(spawnPoint, renderer, asset, input, map, debug, &board.diamonds);
// enemyEngine = new EnemyEngine(renderer, asset, player, map, asset->get(map->getEnemyFile()));
}

View File

@@ -37,6 +37,8 @@ private:
Uint32 ticks; // Contador de ticks para ajustar la velocidad del programa
Uint32 ticksSpeed; // Velocidad a la que se repiten los bucles del programa
bool musicEnabled; // Indica si la musica puede sonar o no
std::string currentMap; // Fichero del mapa actual
player_t spawnPoint; // Lugar de la mapa donde aparece el jugador
// Actualiza el juego, las variables, comprueba la entrada, etc.
void update();

View File

@@ -1,7 +1,7 @@
#include "player.h"
// Constructor
Player::Player(SDL_Renderer *renderer, Asset *asset, Input *input, Map *map, Debug *debug, int *diamonds)
Player::Player(player_t player, SDL_Renderer *renderer, Asset *asset, Input *input, Map *map, Debug *debug, int *diamonds)
{
this->asset = asset;
this->renderer = renderer;
@@ -19,14 +19,14 @@ Player::Player(SDL_Renderer *renderer, Asset *asset, Input *input, Map *map, Deb
w = 16;
h = 24;
x = 8 * map->getTileSize();
y = 20 * map->getTileSize();
vx = 0;
vy = 0;
x = player.x;
y = player.y;
vx = player.vx;
vy = player.vy;
lastPosition = {(int)x, (int)y};
sprite->setRect({(int)x, (int)y, w, h});
sprite->setCurrentAnimation("stand");
sprite->setFlip(SDL_FLIP_NONE);
sprite->setFlip(player.flip);
jumpStrenght = 2.0f;
gravity = 0.3f;
@@ -34,7 +34,7 @@ Player::Player(SDL_Renderer *renderer, Asset *asset, Input *input, Map *map, Deb
maxVX = 1.5f;
maxVY = 4.0f;
state = s_standing;
state = player.state;
living = l_alive;
jumpPressed = false;
key.insert(key.end(), {0, 0, 0, 0, 0, 0});
@@ -61,6 +61,7 @@ Player::~Player()
// Actualiza todas las variables
void Player::update()
{
checkLivingState();
checkInput();
move();
animate();
@@ -87,6 +88,21 @@ void Player::render()
// Comprueba las entradas y modifica variables
void Player::checkInput()
{
if (living == l_dying)
{ // Aplica fricción
if (vx > 0.0f)
{
vx -= (accelX / 3);
vx = std::max(vx, 0.0f);
}
else
{
vx += (accelX / 3);
vx = std::min(vx, 0.0f);
}
return;
}
if (input->checkInput(INPUT_LEFT, REPEAT_TRUE))
{
vx -= accelX;
@@ -100,7 +116,7 @@ void Player::checkInput()
sprite->setFlip(SDL_FLIP_NONE);
}
else
{
{ // Aplica fricción
if (vx > 0.0f)
{
vx -= accelX;
@@ -333,7 +349,12 @@ void Player::move()
// Anima al jugador
void Player::animate()
{
if (state != s_standing)
if (living == l_dying)
{
sprite->setCurrentAnimation("death");
}
else if (state != s_standing)
{
sprite->setCurrentAnimation("jump");
}
@@ -531,6 +552,10 @@ void Player::checkLivingState()
break;
case l_dying:
if (sprite->animationIsCompleted())
{
living = l_dead;
}
break;
case l_dead:
@@ -551,4 +576,19 @@ void Player::setLivingState(e_living value)
e_living Player::getLivingState()
{
return living;
}
// Obtiene algunos parametros del jugador
player_t Player::getSpawnParams()
{
player_t params;
params.x = x;
params.y = y;
params.vx = vx;
params.vy = vy;
params.state = state;
params.flip = sprite->getFlip();
return params;
}

View File

@@ -34,6 +34,16 @@ enum e_floor
f_platform
};
struct player_t
{
float x;
float y;
float vx;
float vy;
e_state state;
SDL_RendererFlip flip;
};
// The player
class Player
{
@@ -111,7 +121,7 @@ private:
public:
// Constructor
Player(SDL_Renderer *renderer, Asset *asset, Input *input, Map *map, Debug *debug, int *diamonds);
Player(player_t player, SDL_Renderer *renderer, Asset *asset, Input *input, Map *map, Debug *debug, int *diamonds);
// Destructor
~Player();
@@ -148,6 +158,9 @@ public:
// Obtiene el estado de vida del jugador
e_living getLivingState();
// Obtiene algunos parametros del jugador
player_t getSpawnParams();
};
#endif