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

@@ -1,5 +1,5 @@
fullScreenMode=0 fullScreenMode=0
windowSize=3 windowSize=2
filter=FILTER_NEAREST filter=FILTER_NEAREST
vSync=true vSync=true
integerScale=true integerScale=true

View File

@@ -1,7 +1,41 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<map version="1.9" tiledversion="1.9.2" orientation="orthogonal" renderorder="right-down" width="40" height="30" tilewidth="8" tileheight="8" infinite="0" nextlayerid="5" nextobjectid="1"> <map version="1.9" tiledversion="1.9.1" orientation="orthogonal" renderorder="right-down" width="40" height="30" tilewidth="8" tileheight="8" infinite="0" nextlayerid="6" nextobjectid="1">
<tileset firstgid="1" source="surface.tsx"/> <tileset firstgid="1" source="surface.tsx"/>
<tileset firstgid="5626" source="tile_class.tsx"/> <tileset firstgid="5626" source="tile_class.tsx"/>
<layer id="5" name="estatico" width="40" height="30">
<data encoding="csv">
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2176,2177,2178,2179,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2251,2252,2253,2254,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2326,2327,2328,2329,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2401,2402,2403,2404,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
</data>
</layer>
<layer id="4" name="fondo" width="40" height="30"> <layer id="4" name="fondo" width="40" height="30">
<data encoding="csv"> <data encoding="csv">
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
@@ -93,7 +127,7 @@
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5627,5627,5627,5627,5627,5627,0,0,0,0,0,0,0,0,0,0,5628,5628,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5628,5628,5628,5628,5628,5628,0,0,0,0,0,0,0,0,0,0,5628,5628,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5628,5628,5628,5628,5628,5628,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5628,5628,5628,5628,5628,5628,0,0,0,0,0,0,0,0,

View File

@@ -26,5 +26,5 @@ frames=28,29,30,31,32,33,34,35,36,37,38,39,40,41
name=death name=death
speed=10 speed=10
loop=-1 loop=-1
frames=42,43,44,45,46,47,48,49,50,51,52 frames=42,43,44,45,46,47,48,49,50,51,52,52,52,52,52,52,52,52
[/animation] [/animation]

View File

@@ -3,20 +3,24 @@
// Constructor // Constructor
Game::Game(SDL_Renderer *renderer, Screen *screen, Asset *asset, Input *input, Debug *debug) 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 // Copia punteros
this->renderer = renderer; this->renderer = renderer;
this->asset = asset; this->asset = asset;
this->screen = screen; this->screen = screen;
this->input = input; this->input = input;
this->debug = debug; this->debug = debug;
this->debug->setEnabled(true); // this->debug->setEnabled(true);
// Reserva memoria para los objetos // Reserva memoria para los objetos
scoreboard = new ScoreBoard(renderer, asset, input, &board); scoreboard = new ScoreBoard(renderer, asset, input, &board);
eventHandler = new SDL_Event(); eventHandler = new SDL_Event();
itemTracker = new ItemTracker(); itemTracker = new ItemTracker();
map = new Map(asset->get("01.map"), renderer, asset, itemTracker); map = new Map(asset->get(currentMap), renderer, asset, itemTracker);
player = new Player(renderer, asset, input, map, debug, &board.diamonds); player = new Player(spawnPoint, renderer, asset, input, map, debug, &board.diamonds);
enemyEngine = new EnemyEngine(renderer, asset, player, map, asset->get(map->getEnemyFile())); enemyEngine = new EnemyEngine(renderer, asset, player, map, asset->get(map->getEnemyFile()));
music = JA_LoadMusic(asset->get("music_surface.ogg").c_str()); music = JA_LoadMusic(asset->get("music_surface.ogg").c_str());
@@ -192,9 +196,11 @@ void Game::checkEventHandler()
case SDL_SCANCODE_R: case SDL_SCANCODE_R:
delete map; delete map;
map = new Map(asset->get("01.map"), renderer, asset, itemTracker); map = new Map(asset->get(currentMap), renderer, asset, itemTracker);
delete player; 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; delete enemyEngine;
enemyEngine = new EnemyEngine(renderer, asset, player, map, asset->get(map->getEnemyFile())); enemyEngine = new EnemyEngine(renderer, asset, player, map, asset->get(map->getEnemyFile()));
break; break;
@@ -270,7 +276,6 @@ void Game::renderDebugInfo()
// Cambia el mapa // Cambia el mapa
bool Game::changeMap(std::string file) 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 // En las habitaciones los limites tienen la cadena del fichero o un 0 en caso de no limitar con nada
if (file != "0") if (file != "0")
{ // Verifica que exista el fichero que se va a cargar { // Verifica que exista el fichero que se va a cargar
@@ -284,11 +289,14 @@ bool Game::changeMap(std::string file)
delete enemyEngine; delete enemyEngine;
enemyEngine = new EnemyEngine(renderer, asset, player, map, asset->get(map->getEnemyFile())); 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 // 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 (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->setMap(map);
player->switchBorders(); player->switchBorders();
spawnPoint = player->getSpawnParams();
} }
} }
} }
@@ -315,10 +325,14 @@ void Game::reLoadTextures()
// Comprueba las colisiones del jugador con los enemigos // Comprueba las colisiones del jugador con los enemigos
bool Game::checkPlayerEnemyCollisions() bool Game::checkPlayerEnemyCollisions()
{ {
if (player->getLivingState() != l_alive)
{
return false;
}
if (enemyEngine->checkEnemyCollision(player->getCollider())) if (enemyEngine->checkEnemyCollision(player->getCollider()))
{ {
debug->add("COLLISION"); player->setLivingState(l_dying);
player->setLivingState(l_dead);
return true; return true;
} }
return false; return false;
@@ -355,6 +369,6 @@ void Game::killPlayer()
// Crea el nuevo mapa, el nuevo jugador y nuevos enemigos // Crea el nuevo mapa, el nuevo jugador y nuevos enemigos
// map = new Map(asset->get("01.map"), renderer, asset, itemTracker); // map = new Map(asset->get("01.map"), renderer, asset, itemTracker);
player = new Player(renderer, asset, input, map, debug, &board.diamonds); player = new Player(spawnPoint, renderer, asset, input, map, debug, &board.diamonds);
// enemyEngine = new EnemyEngine(renderer, asset, player, map, asset->get(map->getEnemyFile())); // 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 ticks; // Contador de ticks para ajustar la velocidad del programa
Uint32 ticksSpeed; // Velocidad a la que se repiten los bucles del programa Uint32 ticksSpeed; // Velocidad a la que se repiten los bucles del programa
bool musicEnabled; // Indica si la musica puede sonar o no 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. // Actualiza el juego, las variables, comprueba la entrada, etc.
void update(); void update();

View File

@@ -1,7 +1,7 @@
#include "player.h" #include "player.h"
// Constructor // 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->asset = asset;
this->renderer = renderer; this->renderer = renderer;
@@ -19,14 +19,14 @@ Player::Player(SDL_Renderer *renderer, Asset *asset, Input *input, Map *map, Deb
w = 16; w = 16;
h = 24; h = 24;
x = 8 * map->getTileSize(); x = player.x;
y = 20 * map->getTileSize(); y = player.y;
vx = 0; vx = player.vx;
vy = 0; vy = player.vy;
lastPosition = {(int)x, (int)y}; lastPosition = {(int)x, (int)y};
sprite->setRect({(int)x, (int)y, w, h}); sprite->setRect({(int)x, (int)y, w, h});
sprite->setCurrentAnimation("stand"); sprite->setCurrentAnimation("stand");
sprite->setFlip(SDL_FLIP_NONE); sprite->setFlip(player.flip);
jumpStrenght = 2.0f; jumpStrenght = 2.0f;
gravity = 0.3f; gravity = 0.3f;
@@ -34,7 +34,7 @@ Player::Player(SDL_Renderer *renderer, Asset *asset, Input *input, Map *map, Deb
maxVX = 1.5f; maxVX = 1.5f;
maxVY = 4.0f; maxVY = 4.0f;
state = s_standing; state = player.state;
living = l_alive; living = l_alive;
jumpPressed = false; jumpPressed = false;
key.insert(key.end(), {0, 0, 0, 0, 0, 0}); key.insert(key.end(), {0, 0, 0, 0, 0, 0});
@@ -61,6 +61,7 @@ Player::~Player()
// Actualiza todas las variables // Actualiza todas las variables
void Player::update() void Player::update()
{ {
checkLivingState();
checkInput(); checkInput();
move(); move();
animate(); animate();
@@ -87,6 +88,21 @@ void Player::render()
// Comprueba las entradas y modifica variables // Comprueba las entradas y modifica variables
void Player::checkInput() 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)) if (input->checkInput(INPUT_LEFT, REPEAT_TRUE))
{ {
vx -= accelX; vx -= accelX;
@@ -100,7 +116,7 @@ void Player::checkInput()
sprite->setFlip(SDL_FLIP_NONE); sprite->setFlip(SDL_FLIP_NONE);
} }
else else
{ { // Aplica fricción
if (vx > 0.0f) if (vx > 0.0f)
{ {
vx -= accelX; vx -= accelX;
@@ -333,7 +349,12 @@ void Player::move()
// Anima al jugador // Anima al jugador
void Player::animate() void Player::animate()
{ {
if (state != s_standing) if (living == l_dying)
{
sprite->setCurrentAnimation("death");
}
else if (state != s_standing)
{ {
sprite->setCurrentAnimation("jump"); sprite->setCurrentAnimation("jump");
} }
@@ -531,6 +552,10 @@ void Player::checkLivingState()
break; break;
case l_dying: case l_dying:
if (sprite->animationIsCompleted())
{
living = l_dead;
}
break; break;
case l_dead: case l_dead:
@@ -552,3 +577,18 @@ e_living Player::getLivingState()
{ {
return living; 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 f_platform
}; };
struct player_t
{
float x;
float y;
float vx;
float vy;
e_state state;
SDL_RendererFlip flip;
};
// The player // The player
class Player class Player
{ {
@@ -111,7 +121,7 @@ private:
public: public:
// Constructor // 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 // Destructor
~Player(); ~Player();
@@ -148,6 +158,9 @@ public:
// Obtiene el estado de vida del jugador // Obtiene el estado de vida del jugador
e_living getLivingState(); e_living getLivingState();
// Obtiene algunos parametros del jugador
player_t getSpawnParams();
}; };
#endif #endif