Quitadas todas las variables globales y transformadas en punteros

This commit is contained in:
2022-10-20 18:24:12 +02:00
parent 596bf2c4a5
commit b4e76a4c7d
25 changed files with 848 additions and 781 deletions

View File

@@ -1,11 +1,27 @@
#include "balloon.h" #include "balloon.h"
// Constructor // Constructor
Balloon::Balloon() Balloon::Balloon(SDL_Renderer *gRenderer)
{ {
this->gRenderer = gRenderer;
gBalloonTexture = new LTexture(gRenderer);
// Carga los gráficos de los globos
if (!gBalloonTexture->loadFromFile("media/gfx/balloon.png"))
{
printf("Failed to load balloon texture!\n");
}
init(0, 0, NO_KIND, BALLON_VELX_POSITIVE, 0); init(0, 0, NO_KIND, BALLON_VELX_POSITIVE, 0);
} }
// Destructor
Balloon::~Balloon()
{
gBalloonTexture->free();
}
// Inicializador // Inicializador
void Balloon::init(int x, int y, Uint8 kind, float velx, Uint16 creationtimer) void Balloon::init(int x, int y, Uint8 kind, float velx, Uint16 creationtimer)
{ {
@@ -133,7 +149,7 @@ void Balloon::init(int x, int y, Uint8 kind, float velx, Uint16 creationtimer)
} }
// Textura con los gráficos del sprite // Textura con los gráficos del sprite
mSprite.setTexture(gBalloonTexture); mSprite.setTexture(*gBalloonTexture);
// Alto y ancho del sprite // Alto y ancho del sprite
mSprite.setWidth(mWidth); mSprite.setWidth(mWidth);

View File

@@ -3,7 +3,6 @@
#include "sprite.h" #include "sprite.h"
#include "const.h" #include "const.h"
#include "globals.h" #include "globals.h"
#include "globals2.h"
#ifndef BALLOON_H #ifndef BALLOON_H
#define BALLOON_H #define BALLOON_H
@@ -13,7 +12,10 @@ class Balloon
{ {
public: public:
// Constructor // Constructor
Balloon(); Balloon(SDL_Renderer *gRenderer);
// Destructor
~Balloon();
// Inicializador // Inicializador
void init(int x, int y, Uint8 kind, float velx, Uint16 creationtimer); void init(int x, int y, Uint8 kind, float velx, Uint16 creationtimer);
@@ -97,6 +99,11 @@ public:
Circle &getCollider(); Circle &getCollider();
private: private:
// El renderizador de la ventana
SDL_Renderer *gRenderer;
LTexture *gBalloonTexture;
// Posición X,Y del objeto globo // Posición X,Y del objeto globo
float mPosX; float mPosX;
int mPosY; int mPosY;

View File

@@ -1,11 +1,27 @@
#include "bullet.h" #include "bullet.h"
// Constructor // Constructor
Bullet::Bullet() Bullet::Bullet(SDL_Renderer *gRenderer)
{ {
this->gRenderer = gRenderer;
gBulletTexture = new LTexture(gRenderer);
// Carga los gráficos de las balas
if (!gBulletTexture->loadFromFile("media/gfx/bullet.png"))
{
printf("Failed to load bullet texture!\n");
}
init(0, 0, NO_KIND); init(0, 0, NO_KIND);
} }
// Destructor
Bullet::~Bullet()
{
gBulletTexture->free();
}
// Iniciador // Iniciador
void Bullet::init(int x, int y, int kind) void Bullet::init(int x, int y, int kind)
{ {
@@ -24,7 +40,7 @@ void Bullet::init(int x, int y, int kind)
mKind = kind; mKind = kind;
// Textura con los gráficos del objeto // Textura con los gráficos del objeto
mSprite.setTexture(gBulletTexture); mSprite.setTexture(*gBulletTexture);
// Alto y ancho del sprite // Alto y ancho del sprite
mSprite.setWidth(mWidth); mSprite.setWidth(mWidth);

View File

@@ -3,7 +3,6 @@
#include "sprite.h" #include "sprite.h"
#include "const.h" #include "const.h"
#include "globals.h" #include "globals.h"
#include "globals2.h"
#ifndef BULLET_H #ifndef BULLET_H
#define BULLET_H #define BULLET_H
@@ -13,7 +12,10 @@ class Bullet
{ {
public: public:
// Constructor // Constructor
Bullet(); Bullet(SDL_Renderer *gRenderer);
// Destructor
~Bullet();
// Iniciador // Iniciador
void init(int x, int y, int kind); void init(int x, int y, int kind);
@@ -54,6 +56,11 @@ public:
Circle &getCollider(); Circle &getCollider();
private: private:
// El renderizador de la ventana
SDL_Renderer *gRenderer;
LTexture *gBulletTexture;
// Posición X/Y del objeto // Posición X/Y del objeto
int mPosX; int mPosX;
int mPosY; int mPosY;

View File

@@ -27,8 +27,10 @@ bool checkCollision(Circle &a, Circle &b)
} }
// Constructor // Constructor
GameDirector::GameDirector() GameDirector::GameDirector(SDL_Renderer *gRenderer)
{ {
this->gRenderer = gRenderer;
init(); init();
} }
@@ -50,6 +52,34 @@ GameDirector::~GameDirector()
// Libera el mando // Libera el mando
SDL_JoystickClose(gGameController); SDL_JoystickClose(gGameController);
gGameController = NULL; gGameController = NULL;
// Libera texturas
gGameBackgroundTexture->free();
gTitleBackgroundTexture->free();
gWhiteFontTexture->free();
gBlackFontTexture->free();
gMiscTexture->free();
// Libera objetos
delete player;
delete menuPause;
delete menuTitle;
for (Uint8 i = 0; i < mMaxBalloons; i++)
{
if (balloon[i])
{
delete balloon[i];
}
}
for (int i = 0; i < mMaxBullets; i++)
{
if (bullet[i])
{
delete bullet[i];
}
}
} }
// Iniciador // Iniciador
@@ -83,6 +113,41 @@ void GameDirector::init()
printf("Failed to load bullet sound effect! SDL_mixer Error: %s\n", Mix_GetError()); printf("Failed to load bullet sound effect! SDL_mixer Error: %s\n", Mix_GetError());
} }
gGameBackgroundTexture = new LTexture(gRenderer);
// Carga los gráficos del fondo del juego
if (!gGameBackgroundTexture->loadFromFile("media/gfx/background.png"))
{
printf("Failed to load game background texture!\n");
}
gTitleBackgroundTexture = new LTexture(gRenderer);
// Carga los gráficos del fondo de la pantalla de titulo
if (!gTitleBackgroundTexture->loadFromFile("media/gfx/title.png"))
{
printf("Failed to load title texture!\n");
}
gMiscTexture = new LTexture(gRenderer);
// Carga varios gráficos para varios propósitos
if (!gMiscTexture->loadFromFile("media/gfx/misc.png"))
{
printf("Failed to load misc texture!\n");
}
gWhiteFontTexture = new LTexture(gRenderer);
// Carga los gráficos para el texto blanco
if (!gWhiteFontTexture->loadFromFile("media/gfx/white_font.png"))
{
printf("Failed to load white font texture!\n");
}
gBlackFontTexture = new LTexture(gRenderer);
// Carga los gráficos para el texto negro
if (!gBlackFontTexture->loadFromFile("media/gfx/black_font.png"))
{
printf("Failed to load black font texture!\n");
}
// Comprueba los mandos // Comprueba los mandos
if (SDL_NumJoysticks() < 1) if (SDL_NumJoysticks() < 1)
{ {
@@ -115,7 +180,8 @@ void GameDirector::init()
mGetReady = true; mGetReady = true;
// Objeto jugador // Objeto jugador
player.init(); player = new Player(gRenderer);
player->init();
// Establece a cero todos los valores del vector de objetos globo // Establece a cero todos los valores del vector de objetos globo
resetBalloons(); resetBalloons();
@@ -139,26 +205,28 @@ void GameDirector::init()
#endif #endif
// Los fondos // Los fondos
gameBackground.init(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT - (0 * BLOCK), &gGameBackgroundTexture); gameBackground.init(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT - (0 * BLOCK), gGameBackgroundTexture);
titleBackground.init(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, &gTitleBackgroundTexture); titleBackground.init(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, gTitleBackgroundTexture);
// Objetos texto, uno de cada color // Objetos texto, uno de cada color
whiteText.init(&gWhiteFontTexture); whiteText.init(gWhiteFontTexture);
blackText.init(&gBlackFontTexture); blackText.init(gBlackFontTexture);
// Inicializa el objeto con el menu del titulo // Inicializa el objeto con el menu del titulo
menuTitle.init(0, 16 * BLOCK, MENU_SELECTOR_WHITE, MENU_BACKGROUND_TRANSPARENT); menuTitle = new Menu(gRenderer);
menuTitle.addItem("START"); menuTitle->init(0, 16 * BLOCK, MENU_SELECTOR_WHITE, MENU_BACKGROUND_TRANSPARENT);
menuTitle.addItem("EXIT"); menuTitle->addItem("START");
menuTitle.setBackgroundColor(0, 0, 0, 255); menuTitle->addItem("EXIT");
menuTitle.centerMenuOnScreen(); menuTitle->setBackgroundColor(0, 0, 0, 255);
menuTitle->centerMenuOnScreen();
// Inicializa el objeto con el menu de pausa // Inicializa el objeto con el menu de pausa
menuPause.init(0, 12 * BLOCK, MENU_SELECTOR_WHITE, MENU_BACKGROUND_SOLID); menuPause = new Menu(gRenderer);
menuPause.addItem("CONTINUE"); menuPause->init(0, 12 * BLOCK, MENU_SELECTOR_WHITE, MENU_BACKGROUND_SOLID);
menuPause.addItem("EXIT TO TITLE"); menuPause->addItem("CONTINUE");
menuPause.setBackgroundColor(0x73, 0x27, 0x5c, 255); menuPause->addItem("EXIT TO TITLE");
menuPause.centerMenuOnScreen(); menuPause->setBackgroundColor(0x73, 0x27, 0x5c, 255);
menuPause->centerMenuOnScreen();
} }
// Hace una pausa de milisegundos // Hace una pausa de milisegundos
@@ -242,9 +310,9 @@ void GameDirector::moveBalloons()
{ {
for (Uint8 i = 0; i < mMaxBalloons; i++) for (Uint8 i = 0; i < mMaxBalloons; i++)
{ {
if (balloon[i].isActive()) if (balloon[i]->isActive())
{ {
balloon[i].move(); balloon[i]->move();
} }
} }
} }
@@ -254,9 +322,9 @@ void GameDirector::renderBalloons()
{ {
for (Uint8 i = 0; i < mMaxBalloons; i++) for (Uint8 i = 0; i < mMaxBalloons; i++)
{ {
if (balloon[i].isActive()) if (balloon[i]->isActive())
{ {
balloon[i].render(); balloon[i]->render();
} }
} }
} }
@@ -268,7 +336,7 @@ Uint8 GameDirector::getBallonFreeIndex()
for (Uint8 i = 0; i < mMaxBalloons; i++) for (Uint8 i = 0; i < mMaxBalloons; i++)
{ {
if (balloon[i].isActive() == false) if (balloon[i]->isActive() == false)
{ {
index = i; index = i;
break; break;
@@ -282,7 +350,8 @@ Uint8 GameDirector::getBallonFreeIndex()
Uint8 GameDirector::createNewBalloon(int x, int y, Uint8 kind, float velx, Uint16 creationtimer) Uint8 GameDirector::createNewBalloon(int x, int y, Uint8 kind, float velx, Uint16 creationtimer)
{ {
Uint8 index = getBallonFreeIndex(); Uint8 index = getBallonFreeIndex();
balloon[index].init(x, y, kind, velx, creationtimer); balloon[index] = new Balloon(gRenderer);
balloon[index]->init(x, y, kind, velx, creationtimer);
return index; return index;
} }
@@ -291,38 +360,38 @@ void GameDirector::resetBalloons()
{ {
for (Uint8 i = 0; i < mMaxBalloons; i++) for (Uint8 i = 0; i < mMaxBalloons; i++)
{ {
balloon[i].erase(); balloon[i]->erase();
} }
} }
// Explosiona un globo. Lo destruye y crea otros dos si es el caso // Explosiona un globo. Lo destruye y crea otros dos si es el caso
void GameDirector::popBalloon(Uint8 index) void GameDirector::popBalloon(Uint8 index)
{ {
if (balloon[index].isActive()) if (balloon[index]->isActive())
{ {
Uint8 kind = balloon[index].getKind(); Uint8 kind = balloon[index]->getKind();
Uint8 freeIndex = 0; Uint8 freeIndex = 0;
switch (kind) switch (kind)
{ {
// Si es del tipo más pequeño, simplemente elimina el globo // Si es del tipo más pequeño, simplemente elimina el globo
case BALLOON_1: case BALLOON_1:
balloon[index].erase(); balloon[index]->erase();
break; break;
// En cualquier otro caso, crea dos globos de un tipo inferior // En cualquier otro caso, crea dos globos de un tipo inferior
default: default:
freeIndex = getBallonFreeIndex(); freeIndex = getBallonFreeIndex();
balloon[freeIndex].init(0, balloon[index].getPosY(), balloon[index].getKind() - 1, BALLON_VELX_NEGATIVE, 0); balloon[freeIndex]->init(0, balloon[index]->getPosY(), balloon[index]->getKind() - 1, BALLON_VELX_NEGATIVE, 0);
balloon[freeIndex].allignTo(balloon[index].getPosX() + (balloon[index].getWidth() / 2)); balloon[freeIndex]->allignTo(balloon[index]->getPosX() + (balloon[index]->getWidth() / 2));
balloon[freeIndex].setVelY(-2.5); balloon[freeIndex]->setVelY(-2.5);
freeIndex = getBallonFreeIndex(); freeIndex = getBallonFreeIndex();
balloon[freeIndex].init(0, balloon[index].getPosY(), balloon[index].getKind() - 1, BALLON_VELX_POSITIVE, 0); balloon[freeIndex]->init(0, balloon[index]->getPosY(), balloon[index]->getKind() - 1, BALLON_VELX_POSITIVE, 0);
balloon[freeIndex].allignTo(balloon[index].getPosX() + (balloon[index].getWidth() / 2)); balloon[freeIndex]->allignTo(balloon[index]->getPosX() + (balloon[index]->getWidth() / 2));
balloon[freeIndex].setVelY(-2.5); balloon[freeIndex]->setVelY(-2.5);
// Elimina el globo // Elimina el globo
balloon[index].erase(); balloon[index]->erase();
break; break;
} }
} }
@@ -333,9 +402,9 @@ void GameDirector::stopAllBalloons()
{ {
for (Uint8 i = 0; i < mMaxBalloons; i++) for (Uint8 i = 0; i < mMaxBalloons; i++)
{ {
if (balloon[i].isActive()) if (balloon[i]->isActive())
{ {
balloon[i].setStop(true); balloon[i]->setStop(true);
} }
} }
} }
@@ -345,9 +414,9 @@ void GameDirector::startAllBalloons()
{ {
for (Uint8 i = 0; i < mMaxBalloons; i++) for (Uint8 i = 0; i < mMaxBalloons; i++)
{ {
if (balloon[i].isActive()) if (balloon[i]->isActive())
{ {
balloon[i].setStop(false); balloon[i]->setStop(false);
} }
} }
} }
@@ -358,7 +427,7 @@ Uint8 GameDirector::countBalloons()
Uint8 num = 0; Uint8 num = 0;
for (Uint8 i = 0; i < mMaxBalloons; i++) for (Uint8 i = 0; i < mMaxBalloons; i++)
{ {
if (balloon[i].isActive()) if (balloon[i]->isActive())
{ {
++num; ++num;
} }
@@ -372,9 +441,9 @@ bool GameDirector::checkPlayerBallonCollision()
bool result = false; bool result = false;
for (Uint8 i = 0; i < mMaxBalloons; i++) for (Uint8 i = 0; i < mMaxBalloons; i++)
{ {
if (balloon[i].isActive()) if (balloon[i]->isActive())
{ {
if (checkCollision(player.getCollider(), balloon[i].getCollider())) if (checkCollision(player->getCollider(), balloon[i]->getCollider()))
{ {
result = true; result = true;
break; break;
@@ -391,16 +460,16 @@ void GameDirector::processBulletBallonCollision()
{ {
for (Uint8 j = 0; j < mMaxBullets; j++) for (Uint8 j = 0; j < mMaxBullets; j++)
{ {
if (balloon[i].isActive() && !(balloon[i].isInvulnerable()) && bullet[j].isActive()) if (balloon[i]->isActive() && !(balloon[i]->isInvulnerable()) && bullet[j]->isActive())
{ {
if (checkCollision(balloon[i].getCollider(), bullet[j].getCollider())) if (checkCollision(balloon[i]->getCollider(), bullet[j]->getCollider()))
{ {
player.addScore(balloon[i].getScore()); player->addScore(balloon[i]->getScore());
setScore(player.getScore()); setScore(player->getScore());
updateHiScore(); updateHiScore();
popBalloon(i); popBalloon(i);
Mix_PlayChannel(-1, gPopBalloonFX, 0); Mix_PlayChannel(-1, gPopBalloonFX, 0);
bullet[j].erase(); bullet[j]->erase();
calculateMenaceLevel(); calculateMenaceLevel();
break; break;
} }
@@ -414,9 +483,9 @@ void GameDirector::moveBullets()
{ {
for (Uint8 i = 0; i < mMaxBullets; i++) for (Uint8 i = 0; i < mMaxBullets; i++)
{ {
if (bullet[i].isActive()) if (bullet[i]->isActive())
{ {
bullet[i].move(); bullet[i]->move();
} }
} }
} }
@@ -426,9 +495,9 @@ void GameDirector::renderBullets()
{ {
for (Uint8 i = 0; i < mMaxBullets; i++) for (Uint8 i = 0; i < mMaxBullets; i++)
{ {
if (bullet[i].isActive()) if (bullet[i]->isActive())
{ {
bullet[i].render(); bullet[i]->render();
} }
} }
} }
@@ -440,7 +509,7 @@ Uint8 GameDirector::getBulletFreeIndex()
for (int i = 0; i < mMaxBullets; i++) for (int i = 0; i < mMaxBullets; i++)
{ {
if (bullet[i].isActive() == false) if (bullet[i]->isActive() == false)
{ {
index = i; index = i;
break; break;
@@ -455,14 +524,16 @@ void GameDirector::resetBullets()
{ {
for (Uint8 i = 0; i < mMaxBullets; i++) for (Uint8 i = 0; i < mMaxBullets; i++)
{ {
bullet[i].init(0, 0, NO_KIND); bullet[i]->init(0, 0, NO_KIND);
} }
} }
// Crea un objeto bala // Crea un objeto bala
void GameDirector::createBullet(int x, int y, Uint8 kind) void GameDirector::createBullet(int x, int y, Uint8 kind)
{ {
bullet[getBulletFreeIndex()].init(x, y, kind); const int index = getBulletFreeIndex();
bullet[index] = new Bullet(gRenderer);
bullet[index]->init(x, y, kind);
} }
// Calcula y establece el valor de amenaza en funcion de los globos activos // Calcula y establece el valor de amenaza en funcion de los globos activos
@@ -471,7 +542,7 @@ void GameDirector::calculateMenaceLevel()
mMenaceLevel = 0; mMenaceLevel = 0;
for (Uint8 i = 0; i < mMaxBalloons; i++) for (Uint8 i = 0; i < mMaxBalloons; i++)
{ {
switch (balloon[i].getKind()) switch (balloon[i]->getKind())
{ {
case BALLOON_1: case BALLOON_1:
mMenaceLevel += 1; mMenaceLevel += 1;
@@ -514,7 +585,7 @@ void GameDirector::checkMenaceLevel()
Uint8 index = 0; Uint8 index = 0;
// Obtiene el centro del jugador en el eje X // Obtiene el centro del jugador en el eje X
int x = player.getPosX() + (player.getWidth() / 2); int x = player->getPosX() + (player->getWidth() / 2);
// Crea un globo sobre el jugador en dirección hacia el centro // Crea un globo sobre el jugador en dirección hacia el centro
if (x < (PLAY_AREA_WIDTH / 2)) if (x < (PLAY_AREA_WIDTH / 2))
@@ -525,7 +596,7 @@ void GameDirector::checkMenaceLevel()
{ {
index = createNewBalloon(0, PLAY_AREA_TOP + BLOCK - 37, BALLOON_4, BALLON_VELX_NEGATIVE, 400); index = createNewBalloon(0, PLAY_AREA_TOP + BLOCK - 37, BALLOON_4, BALLON_VELX_NEGATIVE, 400);
} }
balloon[index].allignTo(x); balloon[index]->allignTo(x);
// Recalcula el nivel de amenaza con el nuevo globo // Recalcula el nivel de amenaza con el nuevo globo
calculateMenaceLevel(); calculateMenaceLevel();
@@ -541,26 +612,26 @@ void GameDirector::checkGameInput()
// Si está pulsada la tecla izquierda o el mando hacia la izquierda // Si está pulsada la tecla izquierda o el mando hacia la izquierda
if ((keystates[SDL_SCANCODE_LEFT] != 0) || (SDL_JoystickGetAxis(gGameController, 0) < -JOYSTICK_DEAD_ZONE)) if ((keystates[SDL_SCANCODE_LEFT] != 0) || (SDL_JoystickGetAxis(gGameController, 0) < -JOYSTICK_DEAD_ZONE))
{ {
player.checkInput(INPUT_LEFT); player->checkInput(INPUT_LEFT);
} }
// Si está pulsada la tecla derecha o el mando hacia la derecha // Si está pulsada la tecla derecha o el mando hacia la derecha
else if ((keystates[SDL_SCANCODE_RIGHT] != 0) || (SDL_JoystickGetAxis(gGameController, 0) > JOYSTICK_DEAD_ZONE)) else if ((keystates[SDL_SCANCODE_RIGHT] != 0) || (SDL_JoystickGetAxis(gGameController, 0) > JOYSTICK_DEAD_ZONE))
{ {
player.checkInput(INPUT_RIGHT); player->checkInput(INPUT_RIGHT);
} }
// Ninguna de las dos direcciones pulsadas // Ninguna de las dos direcciones pulsadas
else else
{ {
player.checkInput(NO_INPUT); player->checkInput(NO_INPUT);
} }
// Comprobamos la tecla o el botón de disparo central // Comprobamos la tecla o el botón de disparo central
if ((SDL_JoystickGetButton(gGameController, BUTTON_X)) || (keystates[SDL_SCANCODE_W] != 0)) if ((SDL_JoystickGetButton(gGameController, BUTTON_X)) || (keystates[SDL_SCANCODE_W] != 0))
{ {
if (player.canFire()) if (player->canFire())
{ {
createBullet(player.getPosX() + (player.getWidth() / 2) - 4, player.getPosY(), BULLET_UP); createBullet(player->getPosX() + (player->getWidth() / 2) - 4, player->getPosY(), BULLET_UP);
player.setFireCooldown(10); player->setFireCooldown(10);
// Reproduce el sonido de disparo // Reproduce el sonido de disparo
Mix_PlayChannel(-1, gBulletFX, 0); Mix_PlayChannel(-1, gBulletFX, 0);
@@ -570,10 +641,10 @@ void GameDirector::checkGameInput()
// Comprobamos la tecla o el botón de disparo izquierdo // Comprobamos la tecla o el botón de disparo izquierdo
if ((SDL_JoystickGetButton(gGameController, BUTTON_Y)) || (keystates[SDL_SCANCODE_Q] != 0)) if ((SDL_JoystickGetButton(gGameController, BUTTON_Y)) || (keystates[SDL_SCANCODE_Q] != 0))
{ {
if (player.canFire()) if (player->canFire())
{ {
createBullet(player.getPosX() + (player.getWidth() / 2) - 4, player.getPosY(), BULLET_LEFT); createBullet(player->getPosX() + (player->getWidth() / 2) - 4, player->getPosY(), BULLET_LEFT);
player.setFireCooldown(10); player->setFireCooldown(10);
// Reproduce el sonido de disparo // Reproduce el sonido de disparo
Mix_PlayChannel(-1, gBulletFX, 0); Mix_PlayChannel(-1, gBulletFX, 0);
@@ -583,10 +654,10 @@ void GameDirector::checkGameInput()
// Comprobamos la tecla o el botón de disparo derecho // Comprobamos la tecla o el botón de disparo derecho
if ((SDL_JoystickGetButton(gGameController, BUTTON_A)) || (keystates[SDL_SCANCODE_E] != 0)) if ((SDL_JoystickGetButton(gGameController, BUTTON_A)) || (keystates[SDL_SCANCODE_E] != 0))
{ {
if (player.canFire()) if (player->canFire())
{ {
createBullet(player.getPosX() + (player.getWidth() / 2) - 4, player.getPosY(), BULLET_RIGHT); createBullet(player->getPosX() + (player->getWidth() / 2) - 4, player->getPosY(), BULLET_RIGHT);
player.setFireCooldown(10); player->setFireCooldown(10);
// Reproduce el sonido de disparo // Reproduce el sonido de disparo
Mix_PlayChannel(-1, gBulletFX, 0); Mix_PlayChannel(-1, gBulletFX, 0);
@@ -795,7 +866,7 @@ void GameDirector::renderGetReady()
if (mGetReady) if (mGetReady)
{ {
Sprite sprite; Sprite sprite;
sprite.setTexture(gMiscTexture); sprite.setTexture(*gMiscTexture);
sprite.setWidth(53); sprite.setWidth(53);
sprite.setHeight(10); sprite.setHeight(10);
sprite.setPosX((PLAY_AREA_WIDTH / 2) - (sprite.getWidth() / 2)); sprite.setPosX((PLAY_AREA_WIDTH / 2) - (sprite.getWidth() / 2));
@@ -837,27 +908,27 @@ void GameDirector::runTitle()
// Dibuja los objetos // Dibuja los objetos
titleBackground.render(); titleBackground.render();
menuTitle.render(whiteText); menuTitle->render(whiteText);
// Actualiza la pantalla // Actualiza la pantalla
SDL_RenderPresent(gRenderer); SDL_RenderPresent(gRenderer);
// Comprueba las entradas para el menu // Comprueba las entradas para el menu
checkMenuInput(&menuTitle); checkMenuInput(menuTitle);
// Comprueba si se ha seleccionado algún item del menú // Comprueba si se ha seleccionado algún item del menú
switch (menuTitle.getItemSelected()) switch (menuTitle->getItemSelected())
{ {
case 0: case 0:
setGameStatus(GAME_STATE_PLAYING); setGameStatus(GAME_STATE_PLAYING);
menuTitle.resetMenu(); menuTitle->resetMenu();
renderTransition(1); renderTransition(1);
Mix_HaltMusic(); Mix_HaltMusic();
SDL_Delay(1200); SDL_Delay(1200);
break; break;
case 1: case 1:
setGameStatus(GAME_STATE_QUIT); setGameStatus(GAME_STATE_QUIT);
menuTitle.resetMenu(); menuTitle->resetMenu();
renderTransition(1); renderTransition(1);
Mix_HaltMusic(); Mix_HaltMusic();
break; break;
@@ -938,7 +1009,7 @@ void GameDirector::runGame()
} }
// Actualiza el jugador // Actualiza el jugador
player.update(); player->update();
// Mueve los globos // Mueve los globos
moveBalloons(); moveBalloons();
@@ -979,9 +1050,9 @@ void GameDirector::runGame()
} }
#endif #endif
// whiteText.write(0, 0, std::to_string(mMenaceLevelThreshold)); // whiteText.write(0, 0, std::to_string(mMenaceLevelThreshold));
// whiteText.write(0, BLOCK, std::to_string(player.getPosX() + player.getWidth())); // whiteText.write(0, BLOCK, std::to_string(player->getPosX() + player->getWidth()));
renderBullets(); renderBullets();
player.render(); player->render();
renderScoreBoard(whiteText); renderScoreBoard(whiteText);
renderGetReady(); renderGetReady();
@@ -1006,26 +1077,26 @@ void GameDirector::runPausedGame()
gameBackground.render(); gameBackground.render();
renderBalloons(); renderBalloons();
renderBullets(); renderBullets();
player.render(); player->render();
renderScoreBoard(whiteText); renderScoreBoard(whiteText);
menuPause.render(whiteText); menuPause->render(whiteText);
// Limpia la pantalla // Limpia la pantalla
SDL_RenderPresent(gRenderer); SDL_RenderPresent(gRenderer);
// Comprueba las entradas para el menu // Comprueba las entradas para el menu
checkMenuInput(&menuPause); checkMenuInput(menuPause);
// Comprueba si se ha seleccionado algún item del menú // Comprueba si se ha seleccionado algún item del menú
switch (menuPause.getItemSelected()) switch (menuPause->getItemSelected())
{ {
case 0: case 0:
setGameStatus(GAME_STATE_PLAYING); setGameStatus(GAME_STATE_PLAYING);
menuPause.resetMenu(); menuPause->resetMenu();
break; break;
case 1: case 1:
setGameStatus(GAME_STATE_TITLE); setGameStatus(GAME_STATE_TITLE);
menuPause.resetMenu(); menuPause->resetMenu();
renderTransition(1); renderTransition(1);
init(); init();
break; break;

View File

@@ -18,7 +18,7 @@ class GameDirector
{ {
public: public:
// Constructor // Constructor
GameDirector(); GameDirector(SDL_Renderer *gRenderer);
// Destructor // Destructor
~GameDirector(); ~GameDirector();
@@ -129,6 +129,9 @@ public:
void runPausedGame(); void runPausedGame();
private: private:
// El renderizador de la ventana
SDL_Renderer *gRenderer = NULL;
// Objetos con la música del juego // Objetos con la música del juego
Mix_Music *gTitleMusic = NULL; Mix_Music *gTitleMusic = NULL;
Mix_Music *gPlayingMusic = NULL; Mix_Music *gPlayingMusic = NULL;
@@ -140,21 +143,28 @@ private:
// Manejador para el mando 1 // Manejador para el mando 1
SDL_Joystick *gGameController = NULL; SDL_Joystick *gGameController = NULL;
// Texturas
LTexture *gGameBackgroundTexture;
LTexture *gTitleBackgroundTexture;
LTexture *gWhiteFontTexture;
LTexture *gBlackFontTexture;
LTexture *gMiscTexture;
// Manejador de eventos // Manejador de eventos
SDL_Event eventHandler; SDL_Event eventHandler;
// El jugador // El jugador
Player player; Player *player;
// Vector con los objetos globo // Vector con los objetos globo
Balloon balloon[50]; Balloon *balloon[50];
#ifdef TEST #ifdef TEST
Balloon balloonTest; Balloon balloonTest;
Bullet bulletTest; Bullet bulletTest;
#endif #endif
// Vector con los objetos bala // Vector con los objetos bala
Bullet bullet[50]; Bullet *bullet[50];
// Fondo del juego // Fondo del juego
Background gameBackground; Background gameBackground;
@@ -169,10 +179,10 @@ private:
Text blackText; Text blackText;
// Menu de la pantalla de título // Menu de la pantalla de título
Menu menuTitle; Menu *menuTitle;
// Menú de la pantalla de pausa // Menú de la pantalla de pausa
Menu menuPause; Menu *menuPause;
// Indicador para el bucle principal // Indicador para el bucle principal
Uint8 mGameStatus; Uint8 mGameStatus;

View File

@@ -15,9 +15,4 @@ struct Circle
Uint8 r; Uint8 r;
}; };
//El renderizador de la ventana
SDL_Renderer *gRenderer = NULL;
#endif #endif

View File

@@ -1,19 +0,0 @@
#pragma once
#include "ltexture.h"
#ifndef GLOBALS2_H
#define GLOBALS2_H
//Texturas con gráficos
LTexture gPlayerTexture;
LTexture gGameBackgroundTexture;
LTexture gTitleBackgroundTexture;
LTexture gWhiteFontTexture;
LTexture gBlackFontTexture;
LTexture gMenuTexture;
LTexture gBalloonTexture;
LTexture gBulletTexture;
LTexture gMiscTexture;
#endif

View File

@@ -1,7 +1,9 @@
#include "ltexture.h" #include "ltexture.h"
LTexture::LTexture() LTexture::LTexture(SDL_Renderer *gRenderer)
{ {
this->gRenderer = gRenderer;
// Initialize // Initialize
mTexture = NULL; mTexture = NULL;
mWidth = 0; mWidth = 0;

View File

@@ -13,7 +13,7 @@ class LTexture
{ {
public: public:
// Initializes variables // Initializes variables
LTexture(); LTexture(SDL_Renderer *gRenderer);
// Deallocates memory // Deallocates memory
~LTexture(); ~LTexture();
@@ -55,6 +55,9 @@ class LTexture
Uint32 getPixel32(unsigned int x, unsigned int y); Uint32 getPixel32(unsigned int x, unsigned int y);
private: private:
// El renderizador de la ventana
SDL_Renderer *gRenderer = NULL;
// The actual hardware texture // The actual hardware texture
SDL_Texture *mTexture; SDL_Texture *mTexture;
void *mPixels; void *mPixels;

View File

@@ -43,7 +43,6 @@ un tipo asociado diferente a NO_KIND
#include "const.h" #include "const.h"
#include "gamedirector.h" #include "gamedirector.h"
#include "globals.h" #include "globals.h"
#include "globals2.h"
#include "ltexture.h" #include "ltexture.h"
#include "menu.h" #include "menu.h"
#include "player.h" #include "player.h"
@@ -57,6 +56,9 @@ un tipo asociado diferente a NO_KIND
// La ventana donde dibujamos // La ventana donde dibujamos
SDL_Window *gWindow = NULL; SDL_Window *gWindow = NULL;
// El renderizador de la ventana
SDL_Renderer *gRenderer = NULL;
// Arranca SDL y crea la ventana // Arranca SDL y crea la ventana
bool init(); bool init();
@@ -131,91 +133,9 @@ bool init()
return success; return success;
} }
//Carga todos los recursos
bool loadMedia()
{
//Indicador de éxito en la carga
bool success = true;
//Carga los gráficos del jugador
if (!gPlayerTexture.loadFromFile("media/gfx/player.png"))
{
printf("Failed to load player texture!\n");
success = false;
}
//Carga los gráficos de los globos
if (!gBalloonTexture.loadFromFile("media/gfx/balloon.png"))
{
printf("Failed to load balloon texture!\n");
success = false;
}
//Carga los gráficos de las balas
if (!gBulletTexture.loadFromFile("media/gfx/bullet.png"))
{
printf("Failed to load bullet texture!\n");
success = false;
}
//Carga los gráficos del fondo del juego
if (!gGameBackgroundTexture.loadFromFile("media/gfx/background.png"))
{
printf("Failed to load game background texture!\n");
success = false;
}
//Carga los gráficos del fondo de la pantalla de titulo
if (!gTitleBackgroundTexture.loadFromFile("media/gfx/title.png"))
{
printf("Failed to load title texture!\n");
success = false;
}
//Carga varios gráficos para varios propósitos
if (!gMiscTexture.loadFromFile("media/gfx/misc.png"))
{
printf("Failed to load misc texture!\n");
success = false;
}
//Carga los gráficos para el menu
if (!gMenuTexture.loadFromFile("media/gfx/menu.png"))
{
printf("Failed to load menu texture!\n");
success = false;
}
//Carga los gráficos para el texto blanco
if (!gWhiteFontTexture.loadFromFile("media/gfx/white_font.png"))
{
printf("Failed to load white font texture!\n");
success = false;
}
//Carga los gráficos para el texto negro
if (!gBlackFontTexture.loadFromFile("media/gfx/black_font.png"))
{
printf("Failed to load black font texture!\n");
success = false;
}
return success;
}
// Libera todos los recursos y cierra SDL // Libera todos los recursos y cierra SDL
void close() void close()
{ {
//Libera todas las imagenes
gPlayerTexture.free();
gGameBackgroundTexture.free();
gTitleBackgroundTexture.free();
gWhiteFontTexture.free();
gBlackFontTexture.free();
gMenuTexture.free();
gBalloonTexture.free();
gMiscTexture.free();
// Destruye la ventana // Destruye la ventana
SDL_DestroyRenderer(gRenderer); SDL_DestroyRenderer(gRenderer);
SDL_DestroyWindow(gWindow); SDL_DestroyWindow(gWindow);
@@ -237,15 +157,9 @@ int main(int argc, char *args[])
} }
else else
{ {
//Carga los recursos
if (!loadMedia())
{
printf("Failed to load media!\n");
}
else
{ {
// Crea el objeto gameDirector // Crea el objeto gameDirector
GameDirector gameDirector; GameDirector gameDirector(gRenderer);
// Inicializa el objeto gameDirector // Inicializa el objeto gameDirector
gameDirector.init(); gameDirector.init();

View File

@@ -1,11 +1,26 @@
#include "menu.h" #include "menu.h"
// Constructor // Constructor
Menu::Menu() Menu::Menu(SDL_Renderer *gRenderer)
{ {
this->gRenderer = gRenderer;
gMenuTexture = new LTexture(gRenderer);
// Carga los gráficos para el menu
if (!gMenuTexture->loadFromFile("media/gfx/menu.png"))
{
printf("Failed to load menu texture!\n");
}
init(0, 0, 0, MENU_BACKGROUND_SOLID); init(0, 0, 0, MENU_BACKGROUND_SOLID);
} }
// Destructor
Menu::~Menu()
{
gMenuTexture->free();
}
// Inicializador // Inicializador
void Menu::init(int x, int y, int offset_sprite_selector, int backgroundType) void Menu::init(int x, int y, int offset_sprite_selector, int backgroundType)
{ {
@@ -29,7 +44,7 @@ void Menu::init(int x, int y, int offset_sprite_selector, int backgroundType)
mSelectorSprite.setHeight(8); mSelectorSprite.setHeight(8);
mSelectorSprite.setPosX(0); mSelectorSprite.setPosX(0);
mSelectorSprite.setPosY(0); mSelectorSprite.setPosY(0);
mSelectorSprite.setTexture(gMenuTexture); mSelectorSprite.setTexture(*gMenuTexture);
mSelectorSprite.setSpriteClip(offset_sprite_selector, 0, mSelectorSprite.getWidth(), mSelectorSprite.getHeight()); mSelectorSprite.setSpriteClip(offset_sprite_selector, 0, mSelectorSprite.getWidth(), mSelectorSprite.getHeight());
// Elementos del menu // Elementos del menu

View File

@@ -3,7 +3,6 @@
#include "sprite.h" #include "sprite.h"
#include "const.h" #include "const.h"
#include "globals.h" #include "globals.h"
#include "globals2.h"
#include "text.h" #include "text.h"
#ifndef MENU_H #ifndef MENU_H
@@ -14,7 +13,10 @@ class Menu
{ {
public: public:
// Constructor // Constructor
Menu(); Menu(SDL_Renderer *gRenderer);
// Destructor
~Menu();
// Inicializador // Inicializador
void init(int x, int y, int offset_sprite_selector, int backgroundType); void init(int x, int y, int offset_sprite_selector, int backgroundType);
@@ -56,6 +58,11 @@ public:
void addItem(std::string text); void addItem(std::string text);
private: private:
// El renderizador de la ventana
SDL_Renderer *gRenderer;
LTexture *gMenuTexture;
// Posicion X/Y del texto del primer elemento del menu // Posicion X/Y del texto del primer elemento del menu
int mPosX; int mPosX;
int mPosY; int mPosY;

View File

@@ -1,11 +1,27 @@
#include "player.h" #include "player.h"
// Constructor // Constructor
Player::Player() Player::Player(SDL_Renderer *gRenderer)
{ {
this->gRenderer = gRenderer;
gPlayerTexture = new LTexture(gRenderer);
// Carga los gráficos del jugador
if (!gPlayerTexture->loadFromFile("media/gfx/player.png"))
{
printf("Failed to load player texture!\n");
}
init(); init();
} }
// Destructor
Player::~Player()
{
gPlayerTexture->free();
}
// Iniciador // Iniciador
void Player::init() void Player::init()
{ {
@@ -52,7 +68,7 @@ void Player::init()
mSprite.setPosY(mPosY); mSprite.setPosY(mPosY);
// Set sprite sheet // Set sprite sheet
mSprite.setTexture(gPlayerTexture); mSprite.setTexture(*gPlayerTexture);
// Set status // Set status
mStatus = PLAYER_STATE_STOPPED; mStatus = PLAYER_STATE_STOPPED;

View File

@@ -3,7 +3,6 @@
#include "spriteanimated.h" #include "spriteanimated.h"
#include "const.h" #include "const.h"
#include "globals.h" #include "globals.h"
#include "globals2.h"
#ifndef PLAYER_H #ifndef PLAYER_H
#define PLAYER_H #define PLAYER_H
@@ -13,7 +12,10 @@ class Player
{ {
public: public:
// Constructor // Constructor
Player(); Player(SDL_Renderer *gRenderer);
// DEstructor
~Player();
// Iniciador // Iniciador
void init(); void init();
@@ -70,6 +72,11 @@ public:
Circle &getCollider(); Circle &getCollider();
private: private:
// El renderizador de la ventana
SDL_Renderer *gRenderer;
LTexture *gPlayerTexture;
// Posición X, Y del jugador // Posición X, Y del jugador
float mPosX; float mPosX;
int mPosY; int mPosY;

View File

@@ -51,7 +51,6 @@ public:
// Establece el valor de la variable // Establece el valor de la variable
void setTexture(LTexture &texture); void setTexture(LTexture &texture);
private: private:
// Posición X,Y donde dibujar el sprite // Posición X,Y donde dibujar el sprite
int mPosX; int mPosX;

View File

@@ -38,7 +38,8 @@ void Text::init(LTexture *texture)
// Escribe el texto en pantalla // Escribe el texto en pantalla
void Text::write(int x, int y, std::string text) void Text::write(int x, int y, std::string text)
{; {
;
for (Uint8 i = 0; i < text.length(); ++i) for (Uint8 i = 0; i < text.length(); ++i)
{ {
mSprite.setSpriteClip(mOffset[int(text[i])].x, mOffset[int(text[i])].y, 8, 8); mSprite.setSpriteClip(mOffset[int(text[i])].x, mOffset[int(text[i])].y, 8, 8);

BIN
super_pang_clone_linux Normal file

Binary file not shown.