diff --git a/data/room/06.tmx b/data/room/06.tmx index 4fe540c..cbf7852 100644 --- a/data/room/06.tmx +++ b/data/room/06.tmx @@ -4,19 +4,19 @@ 26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26, -26,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,26, -26,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,26, -26,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,26, -26,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,26, -26,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,26, -26,0,0,0,0,0,0,0,0,0,46,46,46,46,46,46,46,46,46,46,0,0,0,0,0,0,0,0,0,0,0,26, -26,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,26, -26,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,26, -26,0,0,0,0,0,0,0,0,161,212,212,212,212,212,212,212,212,212,212,181,0,0,0,0,0,0,0,0,0,0,26, +26,0,0,0,0,0,0,0,0,0,0,0,0,0,0,183,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,26, +26,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,183,0,0,0,0,0,0,0,0,0,0,0,0,0,0,26, +26,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,183,0,0,0,0,0,0,0,0,0,0,0,0,0,26, +26,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,183,0,0,0,0,0,0,0,0,0,0,0,0,26, +26,0,0,0,0,0,0,0,0,0,0,0,0,0,0,167,66,66,66,66,187,0,0,0,0,164,65,65,0,0,0,26, +26,0,0,0,0,0,0,0,0,0,0,0,0,0,162,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,26, +26,0,0,0,0,0,0,0,0,0,0,0,0,162,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,26, +26,0,0,0,0,0,0,0,0,0,0,0,162,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,26, +26,0,0,0,0,0,0,0,0,161,212,212,212,212,212,212,212,0,212,212,181,0,0,0,0,0,0,0,0,0,0,26, 26,0,0,0,0,0,0,0,161,0,0,0,0,0,0,0,0,0,0,0,0,181,0,0,0,0,0,0,0,0,0,26, -26,0,0,0,0,0,0,161,0,0,0,0,0,0,0,0,0,0,0,0,0,0,181,0,0,0,0,0,0,0,0,26, -26,0,0,0,0,0,161,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,181,0,0,0,0,0,0,0,0, -26,0,0,0,0,161,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,181,0,0,0,0,0,0,0, +26,0,0,0,0,0,0,161,0,0,0,0,0,0,0,0,0,269,0,0,0,0,181,0,0,0,0,0,0,0,0,26, +26,0,0,0,0,0,161,0,0,0,0,0,0,0,0,0,0,269,0,0,0,0,0,181,0,0,0,0,0,0,0,0, +26,0,0,0,0,161,0,0,0,0,0,0,0,0,0,0,0,289,0,0,0,0,0,0,181,0,0,0,0,0,0,0, 26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26, 26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26 diff --git a/source/game.cpp b/source/game.cpp index 71c5c45..f71c37b 100644 --- a/source/game.cpp +++ b/source/game.cpp @@ -21,11 +21,10 @@ Game::Game(SDL_Renderer *renderer, Screen *screen, Asset *asset, Input *input, D // Crea los objetos scoreboard = new ScoreBoard(renderer, asset, &playerLives, &itemsPicked, &clock); itemTracker = new ItemTracker(); - room = new Room(asset->get(currentRoom), renderer, screen, asset, itemTracker, &itemsPicked); + room = new Room(asset->get(currentRoom), renderer, screen, asset, itemTracker, &itemsPicked, debug); player = new Player(spawnPoint, asset->get("player01.png"), asset->get("player01.ani"), renderer, asset, input, room, debug); eventHandler = new SDL_Event(); text = new Text(asset->get("smb2.png"), asset->get("smb2.txt"), renderer); - debugText = new Text(asset->get("debug.png"), asset->get("debug.txt"), renderer); music = JA_LoadMusic(asset->get("game.ogg").c_str()); // Inicializa el resto de variables @@ -51,25 +50,11 @@ Game::~Game() // Libera la memoria de los objetos delete scoreboard; - scoreboard = nullptr; - delete itemTracker; - itemTracker = nullptr; - delete room; - room = nullptr; - delete player; - player = nullptr; - delete eventHandler; - eventHandler = nullptr; - delete text; - text = nullptr; - - delete debugText; - debugText = nullptr; } // Comprueba los eventos de la cola @@ -273,7 +258,7 @@ bool Game::changeRoom(std::string file) room = nullptr; // Crea un objeto habitación nuevo a partir del fichero - room = new Room(asset->get(file), renderer, screen, asset, itemTracker, &itemsPicked); + room = new Room(asset->get(file), renderer, screen, asset, itemTracker, &itemsPicked, debug); // Pasa la nueva habitación al jugador player->setRoom(room); @@ -331,7 +316,7 @@ void Game::killPlayer() delete player; // Crea la nueva habitación y el nuevo jugador - room = new Room(asset->get(currentRoom), renderer, screen, asset, itemTracker, &itemsPicked); + room = new Room(asset->get(currentRoom), renderer, screen, asset, itemTracker, &itemsPicked, debug); player = new Player(spawnPoint, asset->get("player01.png"), asset->get("player01.ani"), renderer, asset, input, room, debug); } diff --git a/source/game.h b/source/game.h index c80c1a3..7da79a1 100644 --- a/source/game.h +++ b/source/game.h @@ -31,17 +31,16 @@ private: Asset *asset; // Objeto con la ruta a todos los ficheros de recursos Input *input; // Objeto pata gestionar la entrada Text *text; // Objeto para los textos del juego - Text *debugText; // Objeto para los textos de debug del juego ScoreBoard *scoreboard; // Objeto encargado de gestionar el marcador JA_Music music; // Musica que suena durante el juego - Debug *debug; + Debug *debug; // Objeto para gestionar la información de debug bool musicEnabled; // Indica si ha de sonar la musica durante el juego int ticks; // Contador de ticks para ajustar la velocidad del programa int ticksSpeed; // Velocidad a la que se repiten los bucles del programa section_t section; // Seccion actual dentro del juego std::string currentRoom; // Fichero de la habitación actual player_t spawnPoint; // Lugar de la habitación donde aparece el jugador - bool debugEnabled; // Indica si el modo debug está activo + bool debugEnabled; // Indica si el modo debug está activo int playerLives; // Lleva la cuenta de ls vidas restantes del jugador int itemsPicked; // Lleva la cuenta de los objetos recogidos Uint32 clock; // Cuenta el tiempo que dura la partida diff --git a/source/player.cpp b/source/player.cpp index 8ad0041..5845f0c 100644 --- a/source/player.cpp +++ b/source/player.cpp @@ -242,18 +242,37 @@ void Player::move() else { tile_e slope = checkSlopes(); - debug->add("SLOPE = " + std::to_string(slope)); + tile_e slope2 = checkSlopes2(); + debug->add("SLOPE = " + std::to_string(slope)); + debug->add("SLOPE2 = " + std::to_string(slope2)); if (slope != t_empty) { // Cuesta hacia la derecha if (slope == t_slope_r) { // Recoloca y = -h + room->getSlopeHeight(feet[1], t_slope_r); + debug->add("feet[1] = " + std::to_string(feet[1].y)); } // Cuesta hacia la izquierda if (slope == t_slope_l) { // Recoloca y = -h + room->getSlopeHeight(feet[0], t_slope_l); + debug->add("feet[0] = " + std::to_string(feet[0].y)); + } + } + else if (slope2 != t_empty) + { // Cuesta hacia la derecha + if (slope2 == t_slope_r) + { // Recoloca + y = -h + room->getSlopeHeight(underFeet[1], t_slope_r); + debug->add("ufeet[1] = " + std::to_string(underFeet[1].y)); + } + + // Cuesta hacia la izquierda + if (slope2 == t_slope_l) + { // Recoloca + y = -h + room->getSlopeHeight(underFeet[0], t_slope_l); + debug->add("ufeet[0] = " + std::to_string(underFeet[0].y)); } } } @@ -295,7 +314,7 @@ void Player::move() vy = 0.0f; // Si ademas ha habido un cambio de tile recoloca al jugador - if (tile_change) + if (tile_change && !checkSlopes2()) { y = ((int)y - ((int)y % tileSize)); } @@ -428,6 +447,44 @@ tile_e Player::checkSlopes() return t_empty; } +// Comprueba si el jugador está en una rampa +tile_e Player::checkSlopes2() +{ + // Actualiza los puntos de colisión + updateFeet(); + + bool slope_l = false; + bool slope_r = false; + bool wall = false; + bool passable = false; + + // Comprueba si ha colisionado con una rampa + for (auto f : underFeet) + { + slope_l |= (room->getTile(f) == t_slope_l); + slope_r |= (room->getTile(f) == t_slope_r); + wall |= (room->getTile(f) == t_wall); + passable |= (room->getTile(f) == t_passable); + } + + if (wall || passable) + { + return t_empty; + } + + if (slope_l) + { + return t_slope_l; + } + + if (slope_r) + { + return t_slope_r; + } + + return t_empty; +} + // Obtiene algunos parametros del jugador player_t Player::getSpawnParams() { diff --git a/source/player.h b/source/player.h index 3db25c6..e6ab9c1 100644 --- a/source/player.h +++ b/source/player.h @@ -95,6 +95,9 @@ public: // Comprueba si el jugador está en una rampa tile_e checkSlopes(); + // Comprueba si el jugador está en una rampa + tile_e checkSlopes2(); + // Actualiza los puntos de colisión void updateColliderPoints(); diff --git a/source/room.cpp b/source/room.cpp index 7a4b7bd..e294400 100644 --- a/source/room.cpp +++ b/source/room.cpp @@ -4,7 +4,7 @@ #include // Constructor -Room::Room(std::string file_path, SDL_Renderer *renderer, Screen *screen, Asset *asset, ItemTracker *itemTracker, int *items) +Room::Room(std::string file_path, SDL_Renderer *renderer, Screen *screen, Asset *asset, ItemTracker *itemTracker, int *items, Debug *debug) { // Copia los punteros a objetos this->renderer = renderer; @@ -12,6 +12,7 @@ Room::Room(std::string file_path, SDL_Renderer *renderer, Screen *screen, Asset this->screen = screen; this->itemTracker = itemTracker; this->itemsPicked = items; + this->debug = debug; // Crea los objetos load(file_path); @@ -602,21 +603,25 @@ int Room::getSlopeHeight(SDL_Point p, tile_e slope) // Calcula la base del tile int base = ((p.y / tileSize) * tileSize) + tileSize; printf("base %i\n", base); + debug->add("BASE = " + std::to_string(base)); // Calcula cuanto se ha entrado en el tile horizontalmente const int pos = (p.x % tileSize); // esto da un valor entre 0 y 7 printf("pos %i\n", base); + debug->add("POS = " + std::to_string(pos)); // Se resta a la base la cantidad de pixeles pos en funcion de la rampa if (slope == t_slope_r) { - base -= pos+1; + base -= pos + 1; printf("base_R %i\n", base); + debug->add("BASE_R = " + std::to_string(base)); } else { base -= (tileSize - pos); printf("base_L %i\n", base); + debug->add("BASE_L = " + std::to_string(base)); } return base; diff --git a/source/room.h b/source/room.h index 3e2d65b..abd4550 100644 --- a/source/room.h +++ b/source/room.h @@ -9,6 +9,7 @@ #include "item_tracker.h" #include "const.h" #include "jail_audio.h" +#include "debug.h" #include #include @@ -62,6 +63,7 @@ private: SDL_Texture *mapTexture; // Textura para dibujar el mapa de la habitación JA_Sound itemSound; // Sonido producido al coger un objeto int *itemsPicked; // Puntero a la cantidad de items recogidos que lleva el juego + Debug *debug; // Objeto para gestionar la información de debug int tileSize; // Ancho del tile en pixels int mapWidth; // Ancho del mapa en tiles @@ -85,7 +87,7 @@ private: public: // Constructor - Room(std::string file_path, SDL_Renderer *renderer, Screen *screen, Asset *asset, ItemTracker *item_tracker, int *items); + Room(std::string file_path, SDL_Renderer *renderer, Screen *screen, Asset *asset, ItemTracker *item_tracker, int *items, Debug *debug); // Destructor ~Room();