diff --git a/data/config/config.txt b/data/config/config.txt index 56c3ec4..8074f6a 100644 --- a/data/config/config.txt +++ b/data/config/config.txt @@ -1,5 +1,5 @@ fullScreenMode=0 -windowSize=3 +windowSize=2 filter=FILTER_NEAREST vSync=true integerScale=true diff --git a/data/map/01.tmx b/data/map/01.tmx index 7bd5dc3..54382fb 100644 --- a/data/map/01.tmx +++ b/data/map/01.tmx @@ -1,7 +1,41 @@ - + + + +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,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 + + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,5628,5628,5628,5628,5628,5628,0,0,0,0,0,0,0,0, diff --git a/data/player/player.ani b/data/player/player.ani index 0654844..317d7b8 100644 --- a/data/player/player.ani +++ b/data/player/player.ani @@ -26,5 +26,5 @@ frames=28,29,30,31,32,33,34,35,36,37,38,39,40,41 name=death speed=10 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] \ No newline at end of file diff --git a/source/game.cpp b/source/game.cpp index ca28029..bc097db 100644 --- a/source/game.cpp +++ b/source/game.cpp @@ -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())); } \ No newline at end of file diff --git a/source/game.h b/source/game.h index 7a4c15a..81896a4 100644 --- a/source/game.h +++ b/source/game.h @@ -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(); diff --git a/source/player.cpp b/source/player.cpp index b0b00e7..07195e1 100644 --- a/source/player.cpp +++ b/source/player.cpp @@ -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; } \ No newline at end of file diff --git a/source/player.h b/source/player.h index f466b9b..0131b15 100644 --- a/source/player.h +++ b/source/player.h @@ -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