diff --git a/media/player/player01.ani b/media/player/player01.ani index 8499bc2..4559475 100644 --- a/media/player/player01.ani +++ b/media/player/player01.ani @@ -14,4 +14,11 @@ name=walk speed=8 loop=0 frames=0,1,2,3 +[/animation] + +[animation] +name=walk_menu +speed=50 +loop=0 +frames=0,1,2,3 [/animation] \ No newline at end of file diff --git a/source/game.cpp b/source/game.cpp index 23e65b1..6e0ded2 100644 --- a/source/game.cpp +++ b/source/game.cpp @@ -15,6 +15,7 @@ Game::Game(SDL_Renderer *renderer, Screen *screen, Asset *asset, Input *input) this->input = input; // Crea los objetos + scoreboard = new ScoreBoard(renderer, asset); itemTracker = new ItemTracker(); room = new Room(asset->get(currentRoom), renderer, asset, itemTracker); player = new Player(spawnPoint, asset->get("player01.png"), asset->get("player01.ani"), renderer, asset, input, room); @@ -38,6 +39,9 @@ Game::~Game() input = nullptr; // Libera la memoria de los objetos + delete scoreboard; + scoreboard = nullptr; + delete itemTracker; itemTracker = nullptr; @@ -118,7 +122,7 @@ void Game::update() case SDL_SCANCODE_F4: screen->setWindowSize(4); break; - + default: break; } @@ -134,6 +138,7 @@ void Game::update() checkPlayerOnFloor(); checkPlayerAndItems(); checkPlayerAndEnemies(); + scoreboard->update(); } } @@ -148,14 +153,8 @@ void Game::render() room->renderEnemies(); room->renderItems(); player->render(); - - // Texto en el centro de la pantalla - SDL_Rect rect = {0, 16 * 8, PLAY_AREA_RIGHT, 8}; - color_t color = stringToColor("light_black"); - SDL_SetRenderDrawColor(renderer, color.r, color.g, color.b, 0xFF); - SDL_RenderFillRect(renderer, &rect); - - text->writeCentered(GAMECANVAS_CENTER_X, 16 * 8, room->getName()); + renderRoomName(); + scoreboard->render(); // Debug info renderDebugInfo(); @@ -204,6 +203,18 @@ void Game::renderDebugInfo() debugText->write(0, line += inc, text); } +// Escribe el nombre de la pantalla +void Game::renderRoomName() +{ + // Texto en el centro de la pantalla + SDL_Rect rect = {0, 16 * BLOCK, PLAY_AREA_WIDTH, BLOCK}; + color_t color = stringToColor("light_black"); + SDL_SetRenderDrawColor(renderer, color.r, color.g, color.b, 0xFF); + SDL_RenderFillRect(renderer, &rect); + + text->writeCentered(GAMECANVAS_CENTER_X, 16 * 8, room->getName()); +} + // Cambia de habitación bool Game::changeRoom(std::string file) { diff --git a/source/game.h b/source/game.h index a207884..0e81db8 100644 --- a/source/game.h +++ b/source/game.h @@ -3,7 +3,7 @@ #include "utils.h" #include "sprite.h" -#include "movingsprite.h" +#include "animatedsprite.h" #include "text.h" #include "menu.h" #include "input.h" @@ -13,6 +13,7 @@ #include "item_tracker.h" #include "player.h" #include "jail_audio.h" +#include "scoreboard.h" #ifndef GAME_H #define GAME_H @@ -31,6 +32,7 @@ private: 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 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 @@ -47,6 +49,9 @@ private: // Pone la información de debug en pantalla void renderDebugInfo(); + // Escribe el nombre de la pantalla + void renderRoomName(); + // Cambia de habitación bool changeRoom(std::string file); diff --git a/source/item.h b/source/item.h index 893ca3b..eb87ce1 100644 --- a/source/item.h +++ b/source/item.h @@ -36,7 +36,7 @@ private: std::vector color; // Vector con los colores del objeto int counter; // Contador interno SDL_Rect collider; // Rectangulo de colisión - int colorChangeSpeed; // Cuanto mas alto, mas tarda en cambiar de color + int colorChangeSpeed; // Cuanto mas alto, mas tarda en cambiar de color public: // Constructor diff --git a/source/movingsprite.cpp b/source/movingsprite.cpp index f3d98df..55fd85e 100644 --- a/source/movingsprite.cpp +++ b/source/movingsprite.cpp @@ -163,6 +163,8 @@ void MovingSprite::setPos(SDL_Rect rect) { x = (float)rect.x; y = (float)rect.y; + w = rect.w; + h = rect.h; } // Establece el valor de la variable diff --git a/source/player.cpp b/source/player.cpp index 81f51b4..d49545c 100644 --- a/source/player.cpp +++ b/source/player.cpp @@ -14,10 +14,8 @@ Player::Player(player_t ini, std::string tileset, std::string animation, SDL_Ren // Crea objetos texture = new LTexture(); - sprite = new AnimatedSprite(texture, renderer, animation); - - // Carga la textura loadTextureFromFile(texture, asset->get(tileset), renderer); + sprite = new AnimatedSprite(texture, renderer, animation); // Inicializa variables color = stringToColor("white"); @@ -55,8 +53,10 @@ Player::~Player() void Player::render() { sprite->getTexture()->setColor(color.r, color.g, color.b); + //sprite->getTexture()->setBlendMode(SDL_BLENDMODE_INVALID); sprite->render(); - sprite->getTexture()->setColor(255, 255, 255); + //sprite->getTexture()->setBlendMode(SDL_BLENDMODE_BLEND); + //sprite->getTexture()->setColor(255, 255, 255); } // Actualiza las variables del objeto diff --git a/source/room.cpp b/source/room.cpp index eac427a..44c505f 100644 --- a/source/room.cpp +++ b/source/room.cpp @@ -211,30 +211,37 @@ bool Room::setVars(std::string var, std::string value) { name = value; } + else if (var == "bgColor") { bgColor = stringToColor(value); } + else if (var == "tileset") { tileset = value; } + else if (var == "roomUp") { roomUp = value; } + else if (var == "roomDown") { roomDown = value; } + else if (var == "roomLeft") { roomLeft = value; } + else if (var == "roomRight") { roomRight = value; } + else if (var == "tilemap") { // Se introducen los valores separados por comas en un vector @@ -245,9 +252,11 @@ bool Room::setVars(std::string var, std::string value) tilemap.push_back(std::stoi(tmp)); } } + else if (var == "") { } + else { success = false; @@ -350,7 +359,7 @@ bool Room::setItem(item_t *item, std::string var, std::string value) item->tileset = value; } - if (var == "counter") + else if (var == "counter") { item->counter = std::stoi(value); } diff --git a/source/scoreboard.cpp b/source/scoreboard.cpp new file mode 100644 index 0000000..9b3a873 --- /dev/null +++ b/source/scoreboard.cpp @@ -0,0 +1,82 @@ +#include "scoreboard.h" +#include +#include + +// Constructor +ScoreBoard::ScoreBoard(SDL_Renderer *renderer, Asset *asset) +{ + // Obten punteros a objetos + this->asset = asset; + this->renderer = renderer; + + // Reserva memoria para los objetos + texture = new LTexture(); + loadTextureFromFile(texture, asset->get("player01.png"), renderer); + sprite = new AnimatedSprite(texture, renderer, asset->get("player01.ani")); + sprite->setCurrentAnimation("walk_menu"); + + // Inicializa las variables + counter = 0; + colorChangeSpeed = 4; + + // Inicializa los colores + color_t c = stringToColor("blue"); + color.push_back(c); + + c = stringToColor("red"); + color.push_back(c); + + c = stringToColor("purple"); + color.push_back(c); + + c = stringToColor("green"); + color.push_back(c); + + c = stringToColor("cyan"); + color.push_back(c); + + c = stringToColor("yellow"); + color.push_back(c); +} + +// Destructor +ScoreBoard::~ScoreBoard() +{ + texture->unload(); + delete texture; + texture = nullptr; + + delete sprite; + sprite = nullptr; +} + +// Pinta el objeto en pantalla +void ScoreBoard::render() +{ + + const int num_lives = 9; + + // Dibuja el fondo del marcador + const SDL_Rect rect = {0, 17 * BLOCK, PLAY_AREA_WIDTH, GAMECANVAS_HEIGHT - PLAY_AREA_HEIGHT}; + SDL_SetRenderDrawColor(renderer, 0, 255, 0, 255); + SDL_RenderFillRect(renderer, &rect); + + sprite->setPosY(18 * BLOCK); + int index; + int desp = (counter / 40) % 8; + + for (int i = 0; i < num_lives; i++) + { + sprite->setPosX(8 + (16 * i) + desp); + index = i % color.size(); + sprite->getTexture()->setColor(color[index].r, color[index].g, color[index].b); + sprite->render(); + } +} + +// Actualiza las variables del objeto +void ScoreBoard::update() +{ + counter++; + sprite->update(); +} \ No newline at end of file diff --git a/source/scoreboard.h b/source/scoreboard.h new file mode 100644 index 0000000..c30a306 --- /dev/null +++ b/source/scoreboard.h @@ -0,0 +1,39 @@ +#pragma once + +#include +#include "utils.h" +#include "asset.h" +#include "animatedsprite.h" +#include "const.h" +#include + +#ifndef SCOREBOARD_H +#define SCOREBOARD_H + +// Clase ScoreBoard +class ScoreBoard +{ +private: + LTexture *texture; // Textura con los graficos para las vidas + AnimatedSprite *sprite; // Sprite para mostrar las vidas en el marcador + SDL_Renderer *renderer; // El renderizador de la ventana + Asset *asset; // Objeto con la ruta a todos los ficheros de recursos + std::vector color; // Vector con los colores del objeto + int counter; // Contador interno + int colorChangeSpeed; // Cuanto mas alto, mas tarda en cambiar de color + +public: + // Constructor + ScoreBoard(SDL_Renderer *renderer, Asset *asset); + + // Destructor + ~ScoreBoard(); + + // Pinta el objeto en pantalla + void render(); + + // Actualiza las variables del objeto + void update(); +}; + +#endif diff --git a/source/screen.cpp b/source/screen.cpp index 67de2d8..9f825c1 100644 --- a/source/screen.cpp +++ b/source/screen.cpp @@ -165,4 +165,10 @@ void Screen::setWindowSize(int size) void Screen::setBorderColor(color_t color) { borderColor = color; +} + +// Cambia el tipo de mezcla +void Screen::setBlendMode(SDL_BlendMode blendMode) +{ + SDL_SetRenderDrawBlendMode(renderer, blendMode); } \ No newline at end of file diff --git a/source/screen.h b/source/screen.h index 5c15402..d0f39e5 100644 --- a/source/screen.h +++ b/source/screen.h @@ -60,6 +60,9 @@ public: // Cambia el color del borde void setBorderColor(color_t color); + + // Cambia el tipo de mezcla + void setBlendMode(SDL_BlendMode blendMode); }; #endif