Trabajando el menu de game over y el player_fire

This commit is contained in:
2022-10-07 22:44:57 +02:00
parent 88041eba23
commit 9784b5517a
11 changed files with 147 additions and 27 deletions

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 887 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 835 B

9
data/gfx/player_fire.ani Normal file
View File

@@ -0,0 +1,9 @@
frameWidth=28
frameHeight=32
[animation]
name=default
speed=5
loop=0
frames=0,1,2,3
[/animation]

View File

@@ -7,16 +7,16 @@ sound_move=menu_move.wav
name=GAME OVER name=GAME OVER
x=0 x=0
y=96 y=120
backgroundType=0 backgroundType=0
backgroundColor=0,0,0,255 backgroundColor=128,64,0,0
areElementsCenteredOnX=true areElementsCenteredOnX=true
isCenteredOnX=true isCenteredOnX=true
centerX=199 centerX=199
selector_color=84,110,122,0 selector_color=255,122,0,255
selector_text_color=255,122,0 selector_text_color=255,255,235
defaultActionWhenCancel=1 defaultActionWhenCancel=1

View File

@@ -238,16 +238,19 @@ bool Director::setFileList()
asset->add("data/gfx/player_body.ani", t_data); asset->add("data/gfx/player_body.ani", t_data);
asset->add("data/gfx/player_legs.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_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_head.png", t_bitmap);
asset->add("data/gfx/player_bal1_body.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_legs.png", t_bitmap);
asset->add("data/gfx/player_bal1_death.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_head.png", t_bitmap);
asset->add("data/gfx/player_arounder_body.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_legs.png", t_bitmap);
asset->add("data/gfx/player_arounder_death.png", t_bitmap); asset->add("data/gfx/player_arounder_death.png", t_bitmap);
asset->add("data/gfx/player_arounder_fire.png", t_bitmap);
// Fuentes // Fuentes
asset->add("data/font/8bithud.png", t_font); asset->add("data/font/8bithud.png", t_font);

View File

@@ -212,12 +212,17 @@ void Game::init()
difficultyScoreMultiplier = 0.5f; difficultyScoreMultiplier = 0.5f;
difficultyColor = {75, 105, 47}; difficultyColor = {75, 105, 47};
pauseMenu->setSelectorColor(difficultyColor, 255); pauseMenu->setSelectorColor(difficultyColor, 255);
// gameOverMenu->setSelectorTextColor(difficultyColor);
gameOverMenu->setSelectorColor(difficultyColor, 255);
break; break;
case DIFFICULTY_NORMAL: case DIFFICULTY_NORMAL:
defaultEnemySpeed = BALLOON_SPEED_1; defaultEnemySpeed = BALLOON_SPEED_1;
difficultyScoreMultiplier = 1.0f; difficultyScoreMultiplier = 1.0f;
difficultyColor = {46, 63, 71}; difficultyColor = {255, 122, 0};
pauseMenu->setSelectorColor(difficultyColor, 255);
// gameOverMenu->setSelectorTextColor(difficultyColor);
gameOverMenu->setSelectorColor(difficultyColor, 255);
break; break;
case DIFFICULTY_HARD: case DIFFICULTY_HARD:
@@ -225,6 +230,8 @@ void Game::init()
difficultyScoreMultiplier = 1.5f; difficultyScoreMultiplier = 1.5f;
difficultyColor = {118, 66, 138}; difficultyColor = {118, 66, 138};
pauseMenu->setSelectorColor(difficultyColor, 255); pauseMenu->setSelectorColor(difficultyColor, 255);
// gameOverMenu->setSelectorTextColor(difficultyColor);
gameOverMenu->setSelectorColor(difficultyColor, 255);
break; break;
default: default:
@@ -425,6 +432,9 @@ void Game::loadMedia()
LTexture *player1Death = new LTexture(renderer, asset->get("player_bal1_death.png")); LTexture *player1Death = new LTexture(renderer, asset->get("player_bal1_death.png"));
player1Textures.push_back(player1Death); player1Textures.push_back(player1Death);
LTexture *player1Fire = new LTexture(renderer, asset->get("player_bal1_fire.png"));
player1Textures.push_back(player1Fire);
// Texturas - Player2 // Texturas - Player2
LTexture *player2Head = new LTexture(renderer, asset->get("player_arounder_head.png")); LTexture *player2Head = new LTexture(renderer, asset->get("player_arounder_head.png"));
player2Textures.push_back(player2Head); player2Textures.push_back(player2Head);
@@ -438,6 +448,9 @@ void Game::loadMedia()
LTexture *player2Death = new LTexture(renderer, asset->get("player_arounder_death.png")); LTexture *player2Death = new LTexture(renderer, asset->get("player_arounder_death.png"));
player2Textures.push_back(player2Death); player2Textures.push_back(player2Death);
LTexture *player2Fire = new LTexture(renderer, asset->get("player_arounder_fire.png"));
player1Textures.push_back(player2Fire);
// Animaciones -- Jugador // Animaciones -- Jugador
std::vector<std::string> *playerHeadAnimation = new std::vector<std::string>; std::vector<std::string> *playerHeadAnimation = new std::vector<std::string>;
loadAnimations(asset->get("player_head.ani"), playerHeadAnimation); loadAnimations(asset->get("player_head.ani"), playerHeadAnimation);
@@ -455,6 +468,10 @@ void Game::loadMedia()
loadAnimations(asset->get("player_death.ani"), playerDeathAnimation); loadAnimations(asset->get("player_death.ani"), playerDeathAnimation);
playerAnimations.push_back(playerDeathAnimation); playerAnimations.push_back(playerDeathAnimation);
std::vector<std::string> *playerFireAnimation = new std::vector<std::string>;
loadAnimations(asset->get("player_fire.ani"), playerFireAnimation);
playerAnimations.push_back(playerFireAnimation);
// Animaciones -- Globos // Animaciones -- Globos
std::vector<std::string> *balloon1Animation = new std::vector<std::string>; std::vector<std::string> *balloon1Animation = new std::vector<std::string>;
loadAnimations(asset->get("balloon1.ani"), balloon1Animation); loadAnimations(asset->get("balloon1.ani"), balloon1Animation);
@@ -508,6 +525,9 @@ void Game::loadMedia()
gameOverMenu = new Menu(renderer, asset, input, asset->get("gameover.men")); gameOverMenu = new Menu(renderer, asset, input, asset->get("gameover.men"));
gameOverMenu->setItemCaption(0, lang->getText(48)); gameOverMenu->setItemCaption(0, lang->getText(48));
gameOverMenu->setItemCaption(1, lang->getText(49)); 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 = new Menu(renderer, asset, input, asset->get("pause.men"));
pauseMenu->setItemCaption(0, lang->getText(46)); pauseMenu->setItemCaption(0, lang->getText(46));
pauseMenu->setItemCaption(1, lang->getText(47)); pauseMenu->setItemCaption(1, lang->getText(47));
@@ -1557,7 +1577,14 @@ std::string Game::updateScoreText(Uint32 num)
void Game::renderScoreBoard() void Game::renderScoreBoard()
{ {
// Dibuja el fondo del marcador // 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_Rect rect = {0, 160, 256, 32};
SDL_RenderFillRect(renderer, &rect); SDL_RenderFillRect(renderer, &rect);
@@ -3375,9 +3402,11 @@ void Game::runGameOverScreen()
{ {
// Game Over // Game Over
textBig->writeCentered(PLAY_AREA_CENTER_X, PLAY_AREA_CENTER_Y - (BLOCK * 6), lang->getText(43)); 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 // 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->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 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())); text->writeCentered(PLAY_AREA_CENTER_X, PLAY_AREA_CENTER_Y, lang->getText(78) + std::to_string(players.at(1)->getScore()));
} }
// Continue? // 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(); gameOverMenu->render();
fade->render(); fade->render();

View File

@@ -20,6 +20,7 @@ Menu::Menu(SDL_Renderer *renderer, Asset *asset, Input *input, std::string file)
itemSelected = MENU_NO_OPTION; itemSelected = MENU_NO_OPTION;
x = 0; x = 0;
y = 0; y = 0;
w = 0;
rectBG.rect = {0, 0, 0, 0}; rectBG.rect = {0, 0, 0, 0};
rectBG.color = {0, 0, 0}; rectBG.color = {0, 0, 0};
rectBG.a = 0; rectBG.a = 0;
@@ -608,8 +609,6 @@ void Menu::render()
// Renderiza el rectangulo del selector // Renderiza el rectangulo del selector
const SDL_Rect temp = {selector.rect.x, selector.rect.y - 1, selector.rect.w, selector.rect.h + 1}; 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_SetRenderDrawColor(renderer, selector.color.r, selector.color.g, selector.color.b, selector.a);
SDL_RenderFillRect(renderer, &temp); SDL_RenderFillRect(renderer, &temp);
@@ -628,17 +627,18 @@ void Menu::render()
const color_t color = {selector.itemColor.r, selector.itemColor.g, selector.itemColor.b}; 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); text->writeColored(item[i].rect.x, item[i].rect.y, item[i].label, color);
} }
else if (item[i].selectable) else if (item[i].selectable)
{ {
text->write(item[i].rect.x, item[i].rect.y, item[i].label); text->write(item[i].rect.x, item[i].rect.y, item[i].label);
} }
else if (item[i].greyed) else if (item[i].greyed)
{ {
text->writeColored(item[i].rect.x, item[i].rect.y, item[i].label, colorGreyed); text->writeColored(item[i].rect.x, item[i].rect.y, item[i].label, colorGreyed);
} }
else else
// No seleccionable { // No seleccionable
{
if ((item[i].linkedUp) && (i == selector.index + 1)) if ((item[i].linkedUp) && (i == selector.index + 1))
{ {
const color_t color = {selector.itemColor.r, selector.itemColor.g, selector.itemColor.b}; 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 // 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(); // Establece el ancho
rectBG.rect.h = findHeight() + text->getCharacterSize(); 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 // 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 // La posición Y es la del menu menos la altura de medio caracter
rectBG.rect.y = y - (text->getCharacterSize() / 2); rectBG.rect.y = y - (text->getCharacterSize() / 2);
@@ -692,10 +724,28 @@ void Menu::setSelectorTextColor(color_t color)
void Menu::centerMenuOnX(int value) void Menu::centerMenuOnX(int value)
{ {
isCenteredOnX = true; 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 // Establece la nueva posición centrada en funcion del elemento más ancho o del ancho fijo del menu
x = (value) - (findWidth() / 2); 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 // Reposiciona los elementos del menu
for (auto &i : item) for (auto &i : item)
@@ -705,6 +755,12 @@ void Menu::centerMenuOnX(int value)
// Recalcula el rectangulo de fondo // Recalcula el rectangulo de fondo
setRectSize(); setRectSize();
// Vuelve a centrar los elementos si fuera el caso
if (areElementsCenteredOnX)
{
centerMenuElementsOnX();
}
} }
// Centra el menu respecto un punto en el eje Y // Centra el menu respecto un punto en el eje Y

View File

@@ -68,6 +68,13 @@ private:
int a; // Cantidad de transparencia para el rectangulo del selector 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 std::string name; // Nombre del menu
int x; // Posición en el eje X de la primera letra del primer elemento 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 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 soundAccept; // Sonido al aceptar o elegir una opción del menu
JA_Sound soundCancel; // Sonido al cancelar el menu JA_Sound soundCancel; // Sonido al cancelar el menu
JA_Sound soundMove; // Sonido al mover el selector 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 color_t colorGreyed; // Color para los elementos agrisados
rectangle_t rectBG; // Rectangulo de fondo del menu rectangle_t rectBG; // Rectangulo de fondo del menu
std::vector<item_t> item; // Estructura para cada elemento del menu std::vector<item_t> item; // Estructura para cada elemento del menu
@@ -108,9 +111,6 @@ private:
// Inicializa las variables // Inicializa las variables
void init(); void init();
// Establece el rectangulo de fondo del menu
void setRectSize();
// Actualiza el menu para recolocarlo correctamente y establecer el tamaño // Actualiza el menu para recolocarlo correctamente y establecer el tamaño
void reorganize(); void reorganize();
@@ -143,7 +143,7 @@ private:
public: public:
// Constructor // Constructor
Menu(SDL_Renderer *renderer, Asset *asset, Input *input, std::string file=""); Menu(SDL_Renderer *renderer, Asset *asset, Input *input, std::string file = "");
// Destructor // Destructor
~Menu(); ~Menu();
@@ -179,7 +179,7 @@ public:
void setSelectorTextColor(color_t color); void setSelectorTextColor(color_t color);
// Centra el menu respecto a un punto en el eje X // 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 // Centra el menu respecto a un punto en el eje Y
void centerMenuOnY(int value); void centerMenuOnY(int value);
@@ -219,6 +219,9 @@ public:
// Establece la fuente de texto que se utilizará // Establece la fuente de texto que se utilizará
void setText(std::string font_png, std::string font_txt); 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 #endif

View File

@@ -12,6 +12,8 @@ Player::Player(float x, int y, SDL_Renderer *renderer, std::vector<LTexture *> t
bodySprite = new AnimatedSprite(texture.at(1), renderer, "", animations.at(1)); bodySprite = new AnimatedSprite(texture.at(1), renderer, "", animations.at(1));
legsSprite = new AnimatedSprite(texture.at(2), renderer, "", animations.at(2)); legsSprite = new AnimatedSprite(texture.at(2), renderer, "", animations.at(2));
deathSprite = new AnimatedSprite(texture.at(3), renderer, "", animations.at(3)); 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 // Establece la posición inicial del jugador
posX = x; posX = x;
@@ -27,6 +29,7 @@ Player::~Player()
delete bodySprite; delete bodySprite;
delete legsSprite; delete legsSprite;
delete deathSprite; delete deathSprite;
delete fireSprite;
} }
// Iniciador // Iniciador
@@ -144,6 +147,9 @@ void Player::move()
headSprite->setPosX(getPosX()); headSprite->setPosX(getPosX());
headSprite->setPosY(posY); headSprite->setPosY(posY);
fireSprite->setPosX(getPosX() - 2);
fireSprite->setPosY(posY - 8);
} }
else else
{ {
@@ -170,6 +176,10 @@ void Player::render()
{ {
if ((invulnerableCounter % 10) > 4) if ((invulnerableCounter % 10) > 4)
{ {
if (powerUp)
{
fireSprite->render();
}
legsSprite->render(); legsSprite->render();
bodySprite->render(); bodySprite->render();
headSprite->render(); headSprite->render();
@@ -177,6 +187,10 @@ void Player::render()
} }
else else
{ {
if (powerUp)
{
fireSprite->render();
}
legsSprite->render(); legsSprite->render();
bodySprite->render(); bodySprite->render();
headSprite->render(); headSprite->render();
@@ -250,6 +264,9 @@ void Player::setAnimation()
legsSprite->animate(); legsSprite->animate();
bodySprite->animate(); bodySprite->animate();
headSprite->animate(); headSprite->animate();
fireSprite->animate();
fireSprite->setFlip(flipWalk);
} }
// Obtiene el valor de la variable // Obtiene el valor de la variable
@@ -604,4 +621,5 @@ void Player::setPlayerTextures(std::vector<LTexture *> texture)
bodySprite->setTexture(texture.at(1)); bodySprite->setTexture(texture.at(1));
legsSprite->setTexture(texture.at(2)); legsSprite->setTexture(texture.at(2));
deathSprite->setTexture(texture.at(3)); deathSprite->setTexture(texture.at(3));
fireSprite->setTexture(texture.at(4));
} }

View File

@@ -37,6 +37,7 @@ private:
AnimatedSprite *bodySprite; // Sprite para dibujar el cuerpo AnimatedSprite *bodySprite; // Sprite para dibujar el cuerpo
AnimatedSprite *legsSprite; // Sprite para dibujar las piernas AnimatedSprite *legsSprite; // Sprite para dibujar las piernas
AnimatedSprite *deathSprite; // Sprite para dibujar el jugador derrotado AnimatedSprite *deathSprite; // Sprite para dibujar el jugador derrotado
AnimatedSprite *fireSprite; // Sprite para dibujar el aura del jugador con el poder a tope
// Variables // Variables
float posX; // Posicion en el eje X float posX; // Posicion en el eje X