diff --git a/data/config/config.bin b/data/config/config.bin index b64371a..3036bae 100644 Binary files a/data/config/config.bin and b/data/config/config.bin differ diff --git a/data/gfx/player_arounder_fire.png b/data/gfx/player_arounder_fire.png new file mode 100644 index 0000000..5da208b Binary files /dev/null and b/data/gfx/player_arounder_fire.png differ diff --git a/data/gfx/player_bal1_fire.png b/data/gfx/player_bal1_fire.png new file mode 100644 index 0000000..4751249 Binary files /dev/null and b/data/gfx/player_bal1_fire.png differ diff --git a/data/gfx/player_fire.ani b/data/gfx/player_fire.ani new file mode 100644 index 0000000..8552ba5 --- /dev/null +++ b/data/gfx/player_fire.ani @@ -0,0 +1,9 @@ +frameWidth=28 +frameHeight=32 + +[animation] +name=default +speed=5 +loop=0 +frames=0,1,2,3 +[/animation] \ No newline at end of file diff --git a/data/menu/gameover.men b/data/menu/gameover.men index 0f07dc5..89fcdf9 100644 --- a/data/menu/gameover.men +++ b/data/menu/gameover.men @@ -7,16 +7,16 @@ sound_move=menu_move.wav name=GAME OVER x=0 -y=96 +y=120 backgroundType=0 -backgroundColor=0,0,0,255 +backgroundColor=128,64,0,0 areElementsCenteredOnX=true isCenteredOnX=true centerX=199 -selector_color=84,110,122,0 -selector_text_color=255,122,0 +selector_color=255,122,0,255 +selector_text_color=255,255,235 defaultActionWhenCancel=1 diff --git a/source/director.cpp b/source/director.cpp index f0eaf22..aefc980 100644 --- a/source/director.cpp +++ b/source/director.cpp @@ -238,16 +238,19 @@ bool Director::setFileList() asset->add("data/gfx/player_body.ani", t_data); asset->add("data/gfx/player_legs.ani", t_data); asset->add("data/gfx/player_death.ani", t_data); + asset->add("data/gfx/player_fire.ani", t_data); asset->add("data/gfx/player_bal1_head.png", t_bitmap); asset->add("data/gfx/player_bal1_body.png", t_bitmap); asset->add("data/gfx/player_bal1_legs.png", t_bitmap); asset->add("data/gfx/player_bal1_death.png", t_bitmap); + asset->add("data/gfx/player_bal1_fire.png", t_bitmap); asset->add("data/gfx/player_arounder_head.png", t_bitmap); asset->add("data/gfx/player_arounder_body.png", t_bitmap); asset->add("data/gfx/player_arounder_legs.png", t_bitmap); asset->add("data/gfx/player_arounder_death.png", t_bitmap); + asset->add("data/gfx/player_arounder_fire.png", t_bitmap); // Fuentes asset->add("data/font/8bithud.png", t_font); diff --git a/source/game.cpp b/source/game.cpp index 4e60e51..9929674 100644 --- a/source/game.cpp +++ b/source/game.cpp @@ -212,12 +212,17 @@ void Game::init() difficultyScoreMultiplier = 0.5f; difficultyColor = {75, 105, 47}; pauseMenu->setSelectorColor(difficultyColor, 255); + // gameOverMenu->setSelectorTextColor(difficultyColor); + gameOverMenu->setSelectorColor(difficultyColor, 255); break; case DIFFICULTY_NORMAL: defaultEnemySpeed = BALLOON_SPEED_1; difficultyScoreMultiplier = 1.0f; - difficultyColor = {46, 63, 71}; + difficultyColor = {255, 122, 0}; + pauseMenu->setSelectorColor(difficultyColor, 255); + // gameOverMenu->setSelectorTextColor(difficultyColor); + gameOverMenu->setSelectorColor(difficultyColor, 255); break; case DIFFICULTY_HARD: @@ -225,6 +230,8 @@ void Game::init() difficultyScoreMultiplier = 1.5f; difficultyColor = {118, 66, 138}; pauseMenu->setSelectorColor(difficultyColor, 255); + // gameOverMenu->setSelectorTextColor(difficultyColor); + gameOverMenu->setSelectorColor(difficultyColor, 255); break; default: @@ -425,6 +432,9 @@ void Game::loadMedia() LTexture *player1Death = new LTexture(renderer, asset->get("player_bal1_death.png")); player1Textures.push_back(player1Death); + LTexture *player1Fire = new LTexture(renderer, asset->get("player_bal1_fire.png")); + player1Textures.push_back(player1Fire); + // Texturas - Player2 LTexture *player2Head = new LTexture(renderer, asset->get("player_arounder_head.png")); player2Textures.push_back(player2Head); @@ -438,6 +448,9 @@ void Game::loadMedia() LTexture *player2Death = new LTexture(renderer, asset->get("player_arounder_death.png")); player2Textures.push_back(player2Death); + LTexture *player2Fire = new LTexture(renderer, asset->get("player_arounder_fire.png")); + player1Textures.push_back(player2Fire); + // Animaciones -- Jugador std::vector *playerHeadAnimation = new std::vector; loadAnimations(asset->get("player_head.ani"), playerHeadAnimation); @@ -455,6 +468,10 @@ void Game::loadMedia() loadAnimations(asset->get("player_death.ani"), playerDeathAnimation); playerAnimations.push_back(playerDeathAnimation); + std::vector *playerFireAnimation = new std::vector; + loadAnimations(asset->get("player_fire.ani"), playerFireAnimation); + playerAnimations.push_back(playerFireAnimation); + // Animaciones -- Globos std::vector *balloon1Animation = new std::vector; loadAnimations(asset->get("balloon1.ani"), balloon1Animation); @@ -508,6 +525,9 @@ void Game::loadMedia() gameOverMenu = new Menu(renderer, asset, input, asset->get("gameover.men")); gameOverMenu->setItemCaption(0, lang->getText(48)); gameOverMenu->setItemCaption(1, lang->getText(49)); + const int w = text->getCharacterSize() * lang->getText(45).length(); + gameOverMenu->setRectSize(w, 0); + gameOverMenu->centerMenuOnX(199); pauseMenu = new Menu(renderer, asset, input, asset->get("pause.men")); pauseMenu->setItemCaption(0, lang->getText(46)); pauseMenu->setItemCaption(1, lang->getText(47)); @@ -1557,7 +1577,14 @@ std::string Game::updateScoreText(Uint32 num) void Game::renderScoreBoard() { // Dibuja el fondo del marcador - SDL_SetRenderDrawColor(renderer, difficultyColor.r, difficultyColor.g, difficultyColor.b, 255); + if (difficulty == DIFFICULTY_NORMAL) + { // Pone el color gris de siempre + SDL_SetRenderDrawColor(renderer, 46, 63, 71, 255); + } + else + { // Pinta el fondo del marcador del color de la dificultad + SDL_SetRenderDrawColor(renderer, difficultyColor.r, difficultyColor.g, difficultyColor.b, 255); + } SDL_Rect rect = {0, 160, 256, 32}; SDL_RenderFillRect(renderer, &rect); @@ -3375,9 +3402,11 @@ void Game::runGameOverScreen() { // Game Over textBig->writeCentered(PLAY_AREA_CENTER_X, PLAY_AREA_CENTER_Y - (BLOCK * 6), lang->getText(43)); + // textBig->writeDX(TXT_CENTER | TXT_SHADOW, PLAY_AREA_CENTER_X, PLAY_AREA_CENTER_Y - (BLOCK * 6), lang->getText(43), 1, {255, 255, 235}, 1, difficultyColor); // Your Score text->writeCentered(PLAY_AREA_CENTER_X, PLAY_AREA_CENTER_Y - (BLOCK * 3), lang->getText(44) + std::to_string(players.at(0)->getScore())); + // text->writeDX(TXT_CENTER | TXT_SHADOW, PLAY_AREA_CENTER_X, PLAY_AREA_CENTER_Y - (BLOCK * 3), lang->getText(44) + std::to_string(players.at(0)->getScore()), 1, {255, 255, 235}, 1, difficultyColor); } else { @@ -3386,7 +3415,8 @@ void Game::runGameOverScreen() text->writeCentered(PLAY_AREA_CENTER_X, PLAY_AREA_CENTER_Y, lang->getText(78) + std::to_string(players.at(1)->getScore())); } // Continue? - text->writeCentered(99, PLAY_AREA_CENTER_Y + BLOCK * 2, lang->getText(45)); + text->writeCentered(199, PLAY_AREA_CENTER_Y + BLOCK * 3, lang->getText(45)); + // text->writeDX(TXT_CENTER | TXT_SHADOW, 199, PLAY_AREA_CENTER_Y + BLOCK * 3, lang->getText(45), 1, {255, 255, 235}, 1, difficultyColor); gameOverMenu->render(); fade->render(); diff --git a/source/menu.cpp b/source/menu.cpp index 071e430..56dcbe6 100644 --- a/source/menu.cpp +++ b/source/menu.cpp @@ -20,6 +20,7 @@ Menu::Menu(SDL_Renderer *renderer, Asset *asset, Input *input, std::string file) itemSelected = MENU_NO_OPTION; x = 0; y = 0; + w = 0; rectBG.rect = {0, 0, 0, 0}; rectBG.color = {0, 0, 0}; rectBG.a = 0; @@ -608,8 +609,6 @@ void Menu::render() // Renderiza el rectangulo del selector const SDL_Rect temp = {selector.rect.x, selector.rect.y - 1, selector.rect.w, selector.rect.h + 1}; - // temp.y--; - // temp.h++; SDL_SetRenderDrawColor(renderer, selector.color.r, selector.color.g, selector.color.b, selector.a); SDL_RenderFillRect(renderer, &temp); @@ -628,17 +627,18 @@ void Menu::render() const color_t color = {selector.itemColor.r, selector.itemColor.g, selector.itemColor.b}; text->writeColored(item[i].rect.x, item[i].rect.y, item[i].label, color); } + else if (item[i].selectable) { text->write(item[i].rect.x, item[i].rect.y, item[i].label); } + else if (item[i].greyed) { text->writeColored(item[i].rect.x, item[i].rect.y, item[i].label, colorGreyed); } else - // No seleccionable - { + { // No seleccionable if ((item[i].linkedUp) && (i == selector.index + 1)) { const color_t color = {selector.itemColor.r, selector.itemColor.g, selector.itemColor.b}; @@ -653,13 +653,45 @@ void Menu::render() } // Establece el rectangulo de fondo del menu y el selector -void Menu::setRectSize() +void Menu::setRectSize(int w, int h) { - rectBG.rect.w = findWidth() + text->getCharacterSize(); - rectBG.rect.h = findHeight() + text->getCharacterSize(); + // Establece el ancho + if (w == 0) + { // Si no se pasa un valor, se busca si hay uno prefijado + if (this->w == 0) + { // Si no hay prefijado, coge el item mas ancho + rectBG.rect.w = findWidth() + text->getCharacterSize(); + } + else + { // Si hay prefijado, coge ese + rectBG.rect.w = this->w; + } + } + else + { // Si se pasa un valor, se usa y se prefija + rectBG.rect.w = w; + this->w = w; + } + + // Establece el alto + if (h == 0) + { // Si no se pasa un valor, se busca de manera automatica + rectBG.rect.h = findHeight() + text->getCharacterSize(); + } + else + { // Si se pasa un valor, se aplica + rectBG.rect.h = h; + } // La posición X es la del menú menos medio caracter - rectBG.rect.x = x - (text->getCharacterSize() / 2); + if (this->w != 0) + { // Si el ancho esta prefijado, la x coinccide + rectBG.rect.x = x; + } + else + { // Si el ancho es automatico, se le da un poco de margen + rectBG.rect.x = x - (text->getCharacterSize() / 2); + } // La posición Y es la del menu menos la altura de medio caracter rectBG.rect.y = y - (text->getCharacterSize() / 2); @@ -692,10 +724,28 @@ void Menu::setSelectorTextColor(color_t color) void Menu::centerMenuOnX(int value) { isCenteredOnX = true; - centerX = value; + if (value != 0) + { + centerX = value; + } + else if (centerX == 0) + { + return; + } - // Establece la nueva posición centrada en funcion del elemento más ancho - x = (value) - (findWidth() / 2); + // Establece la nueva posición centrada en funcion del elemento más ancho o del ancho fijo del menu + if (w != 0) + { // Si se ha definido un ancho fijo + x = (centerX) - (w / 2); + } + else + { // Si se actua en función del elemento más ancho + x = (centerX) - (findWidth() / 2); + } + + // Actualiza el rectangulo de fondo y del selector + rectBG.rect.x = x; + selector.rect.x = x; // Reposiciona los elementos del menu for (auto &i : item) @@ -705,6 +755,12 @@ void Menu::centerMenuOnX(int value) // Recalcula el rectangulo de fondo setRectSize(); + + // Vuelve a centrar los elementos si fuera el caso + if (areElementsCenteredOnX) + { + centerMenuElementsOnX(); + } } // Centra el menu respecto un punto en el eje Y diff --git a/source/menu.h b/source/menu.h index 08ded19..d67fa6b 100644 --- a/source/menu.h +++ b/source/menu.h @@ -68,6 +68,13 @@ private: int a; // Cantidad de transparencia para el rectangulo del selector }; + // Objetos + SDL_Renderer *renderer; // Puntero al renderizador de la ventana + Text *text; // Texto para poder escribir los items del menu + Input *input; // Gestor de eventos de entrada de teclado o gamepad + Asset *asset; // Objeto para gestionar los ficheros de recursos + + // Variables std::string name; // Nombre del menu int x; // Posición en el eje X de la primera letra del primer elemento int y; // Posición en el eje Y de la primera letra del primer elemento @@ -85,10 +92,6 @@ private: JA_Sound soundAccept; // Sonido al aceptar o elegir una opción del menu JA_Sound soundCancel; // Sonido al cancelar el menu JA_Sound soundMove; // Sonido al mover el selector - SDL_Renderer *renderer; // Puntero al renderizador de la ventana - Text *text; // Texto para poder escribir los items del menu - Input *input; // Gestor de eventos de entrada de teclado o gamepad - Asset *asset; // Objeto para gestionar los ficheros de recursos color_t colorGreyed; // Color para los elementos agrisados rectangle_t rectBG; // Rectangulo de fondo del menu std::vector item; // Estructura para cada elemento del menu @@ -108,9 +111,6 @@ private: // Inicializa las variables void init(); - // Establece el rectangulo de fondo del menu - void setRectSize(); - // Actualiza el menu para recolocarlo correctamente y establecer el tamaño void reorganize(); @@ -143,7 +143,7 @@ private: public: // Constructor - Menu(SDL_Renderer *renderer, Asset *asset, Input *input, std::string file=""); + Menu(SDL_Renderer *renderer, Asset *asset, Input *input, std::string file = ""); // Destructor ~Menu(); @@ -179,7 +179,7 @@ public: void setSelectorTextColor(color_t color); // Centra el menu respecto a un punto en el eje X - void centerMenuOnX(int value); + void centerMenuOnX(int value = 0); // Centra el menu respecto a un punto en el eje Y void centerMenuOnY(int value); @@ -219,6 +219,9 @@ public: // Establece la fuente de texto que se utilizará void setText(std::string font_png, std::string font_txt); + + // Establece el rectangulo de fondo del menu + void setRectSize(int w = 0, int h = 0); }; #endif diff --git a/source/player.cpp b/source/player.cpp index 301deda..fb458c0 100644 --- a/source/player.cpp +++ b/source/player.cpp @@ -12,6 +12,8 @@ Player::Player(float x, int y, SDL_Renderer *renderer, std::vector t bodySprite = new AnimatedSprite(texture.at(1), renderer, "", animations.at(1)); legsSprite = new AnimatedSprite(texture.at(2), renderer, "", animations.at(2)); deathSprite = new AnimatedSprite(texture.at(3), renderer, "", animations.at(3)); + fireSprite = new AnimatedSprite(texture.at(4), renderer, "", animations.at(4)); + fireSprite->getTexture()->setAlpha(224); // Establece la posición inicial del jugador posX = x; @@ -27,6 +29,7 @@ Player::~Player() delete bodySprite; delete legsSprite; delete deathSprite; + delete fireSprite; } // Iniciador @@ -144,6 +147,9 @@ void Player::move() headSprite->setPosX(getPosX()); headSprite->setPosY(posY); + + fireSprite->setPosX(getPosX() - 2); + fireSprite->setPosY(posY - 8); } else { @@ -170,6 +176,10 @@ void Player::render() { if ((invulnerableCounter % 10) > 4) { + if (powerUp) + { + fireSprite->render(); + } legsSprite->render(); bodySprite->render(); headSprite->render(); @@ -177,6 +187,10 @@ void Player::render() } else { + if (powerUp) + { + fireSprite->render(); + } legsSprite->render(); bodySprite->render(); headSprite->render(); @@ -250,6 +264,9 @@ void Player::setAnimation() legsSprite->animate(); bodySprite->animate(); headSprite->animate(); + + fireSprite->animate(); + fireSprite->setFlip(flipWalk); } // Obtiene el valor de la variable @@ -604,4 +621,5 @@ void Player::setPlayerTextures(std::vector texture) bodySprite->setTexture(texture.at(1)); legsSprite->setTexture(texture.at(2)); deathSprite->setTexture(texture.at(3)); + fireSprite->setTexture(texture.at(4)); } \ No newline at end of file diff --git a/source/player.h b/source/player.h index 0499b53..bb043f6 100644 --- a/source/player.h +++ b/source/player.h @@ -37,6 +37,7 @@ private: AnimatedSprite *bodySprite; // Sprite para dibujar el cuerpo AnimatedSprite *legsSprite; // Sprite para dibujar las piernas AnimatedSprite *deathSprite; // Sprite para dibujar el jugador derrotado + AnimatedSprite *fireSprite; // Sprite para dibujar el aura del jugador con el poder a tope // Variables float posX; // Posicion en el eje X