Me voy a la cama. Sigo con la reescritura de todo el código

This commit is contained in:
2022-09-26 22:25:46 +02:00
parent 35e7abcd3c
commit c8bebfd2d9
74 changed files with 365 additions and 379 deletions

BIN
data/config/config.bin Normal file

Binary file not shown.

BIN
data/config/score.bin Normal file

Binary file not shown.

View File

Before

Width:  |  Height:  |  Size: 1.1 KiB

After

Width:  |  Height:  |  Size: 1.1 KiB

View File

Before

Width:  |  Height:  |  Size: 2.0 KiB

After

Width:  |  Height:  |  Size: 2.0 KiB

View File

Before

Width:  |  Height:  |  Size: 2.4 KiB

After

Width:  |  Height:  |  Size: 2.4 KiB

View File

Before

Width:  |  Height:  |  Size: 8.1 KiB

After

Width:  |  Height:  |  Size: 8.1 KiB

View File

Before

Width:  |  Height:  |  Size: 1.3 KiB

After

Width:  |  Height:  |  Size: 1.3 KiB

View File

Before

Width:  |  Height:  |  Size: 2.2 KiB

After

Width:  |  Height:  |  Size: 2.2 KiB

View File

Before

Width:  |  Height:  |  Size: 57 KiB

After

Width:  |  Height:  |  Size: 57 KiB

View File

Before

Width:  |  Height:  |  Size: 644 B

After

Width:  |  Height:  |  Size: 644 B

View File

Before

Width:  |  Height:  |  Size: 14 KiB

After

Width:  |  Height:  |  Size: 14 KiB

View File

Before

Width:  |  Height:  |  Size: 795 B

After

Width:  |  Height:  |  Size: 795 B

View File

Before

Width:  |  Height:  |  Size: 13 KiB

After

Width:  |  Height:  |  Size: 13 KiB

View File

Before

Width:  |  Height:  |  Size: 2.3 KiB

After

Width:  |  Height:  |  Size: 2.3 KiB

View File

Before

Width:  |  Height:  |  Size: 3.0 KiB

After

Width:  |  Height:  |  Size: 3.0 KiB

View File

Before

Width:  |  Height:  |  Size: 6.8 KiB

After

Width:  |  Height:  |  Size: 6.8 KiB

View File

Before

Width:  |  Height:  |  Size: 1.8 KiB

After

Width:  |  Height:  |  Size: 1.8 KiB

View File

Before

Width:  |  Height:  |  Size: 6.9 KiB

After

Width:  |  Height:  |  Size: 6.9 KiB

View File

Before

Width:  |  Height:  |  Size: 785 B

After

Width:  |  Height:  |  Size: 785 B

View File

Before

Width:  |  Height:  |  Size: 6.5 KiB

After

Width:  |  Height:  |  Size: 6.5 KiB

View File

Before

Width:  |  Height:  |  Size: 1.7 KiB

After

Width:  |  Height:  |  Size: 1.7 KiB

View File

Before

Width:  |  Height:  |  Size: 6.6 KiB

After

Width:  |  Height:  |  Size: 6.6 KiB

View File

Before

Width:  |  Height:  |  Size: 654 B

After

Width:  |  Height:  |  Size: 654 B

View File

Before

Width:  |  Height:  |  Size: 71 KiB

After

Width:  |  Height:  |  Size: 71 KiB

View File

@@ -2,22 +2,11 @@
#include "balloon.h"
// Constructor
Balloon::Balloon()
Balloon::Balloon(float x, float y, Uint8 kind, float velx, float speed, Uint16 creationtimer, LTexture *texture, SDL_Renderer *renderer)
{
mSprite = new AnimatedSprite();
disable();
}
// Destructor
Balloon::~Balloon()
{
delete mSprite;
mSprite = nullptr;
}
// Inicializador
void Balloon::init(float x, float y, Uint8 kind, float velx, float speed, Uint16 creationtimer, LTexture *texture, SDL_Renderer *renderer)
{
const Uint8 NUM_FRAMES_BALLON = 10;
const Uint8 NUM_FRAMES_BALLON_POP = 12;
const Uint8 NUM_FRAMES_BALLON_BORN = 10;
@@ -435,6 +424,13 @@ void Balloon::init(float x, float y, Uint8 kind, float velx, float speed, Uint16
mSprite->setSpriteClip(mSprite->getAnimationClip(0, 0));
}
// Destructor
Balloon::~Balloon()
{
delete mSprite;
mSprite = nullptr;
}
// Centra el globo en la posición X
void Balloon::allignTo(int x)
{

View File

@@ -146,14 +146,11 @@ private:
public:
// Constructor
Balloon();
Balloon(float x, float y, Uint8 kind, float velx, float speed, Uint16 creationtimer, LTexture *texture, SDL_Renderer *renderer);
// Destructor
~Balloon();
// Inicializador
void init(float x, float y, Uint8 kind, float velx, float speed, Uint16 creationtimer, LTexture *texture, SDL_Renderer *renderer);
// Centra el globo en la posición X
void allignTo(int x);

View File

@@ -177,75 +177,73 @@ bool Director::initSDL()
// Crea el indice de ficheros
bool Director::setFileList()
{
// Ficheros binarios
asset->add("data/score.bin", t_data, false);
asset->add("data/demo.bin", t_data);
asset->add("data/config.bin", t_data, false);
// Ficheros de configuración
asset->add("data/config/score.bin", t_data, false);
asset->add("data/config/demo.bin", t_data);
asset->add("data/config/config.bin", t_data, false);
asset->add("data/config/gamecontrollerdb.txt", t_data);
// Musicas
asset->add("media/music/intro.ogg", t_music);
asset->add("media/music/playing.ogg", t_music);
asset->add("media/music/title.ogg", t_music);
asset->add("data/music/intro.ogg", t_music);
asset->add("data/music/playing.ogg", t_music);
asset->add("data/music/title.ogg", t_music);
// Sonidos
asset->add("media/sound/balloon.wav", t_sound);
asset->add("media/sound/bubble1.wav", t_sound);
asset->add("media/sound/bubble2.wav", t_sound);
asset->add("media/sound/bubble3.wav", t_sound);
asset->add("media/sound/bubble4.wav", t_sound);
asset->add("media/sound/bullet.wav", t_sound);
asset->add("media/sound/coffeeout.wav", t_sound);
asset->add("media/sound/hiscore.wav", t_sound);
asset->add("media/sound/itemdrop.wav", t_sound);
asset->add("media/sound/itempickup.wav", t_sound);
asset->add("media/sound/menu_cancel.wav", t_sound);
asset->add("media/sound/menu_move.wav", t_sound);
asset->add("media/sound/menu_select.wav", t_sound);
asset->add("media/sound/player_collision.wav", t_sound);
asset->add("media/sound/stage_change.wav", t_sound);
asset->add("media/sound/title.wav", t_sound);
asset->add("media/sound/clock.wav", t_sound);
asset->add("media/sound/powerball.wav", t_sound);
asset->add("data/sound/balloon.wav", t_sound);
asset->add("data/sound/bubble1.wav", t_sound);
asset->add("data/sound/bubble2.wav", t_sound);
asset->add("data/sound/bubble3.wav", t_sound);
asset->add("data/sound/bubble4.wav", t_sound);
asset->add("data/sound/bullet.wav", t_sound);
asset->add("data/sound/coffeeout.wav", t_sound);
asset->add("data/sound/hiscore.wav", t_sound);
asset->add("data/sound/itemdrop.wav", t_sound);
asset->add("data/sound/itempickup.wav", t_sound);
asset->add("data/sound/menu_cancel.wav", t_sound);
asset->add("data/sound/menu_move.wav", t_sound);
asset->add("data/sound/menu_select.wav", t_sound);
asset->add("data/sound/player_collision.wav", t_sound);
asset->add("data/sound/stage_change.wav", t_sound);
asset->add("data/sound/title.wav", t_sound);
asset->add("data/sound/clock.wav", t_sound);
asset->add("data/sound/powerball.wav", t_sound);
// Texturas
asset->add("media/gfx/balloon.png", t_bitmap);
asset->add("media/gfx/bullet.png", t_bitmap);
asset->add("media/gfx/game_bg.png", t_bitmap);
asset->add("media/gfx/game_text.png", t_bitmap);
asset->add("media/gfx/intro.png", t_bitmap);
asset->add("media/gfx/items.png", t_bitmap);
asset->add("media/gfx/logo.png", t_bitmap);
asset->add("media/gfx/player1_body.png", t_bitmap);
asset->add("media/gfx/player1_death.png", t_bitmap);
asset->add("media/gfx/player1_legs.png", t_bitmap);
asset->add("media/gfx/title.png", t_bitmap);
asset->add("media/gfx/player1_head.png", t_bitmap);
asset->add("media/gfx/player2_body.png", t_bitmap);
asset->add("media/gfx/player2_death.png", t_bitmap);
asset->add("media/gfx/player2_legs.png", t_bitmap);
asset->add("media/gfx/player2_head.png", t_bitmap);
asset->add("data/gfx/balloon.png", t_bitmap);
asset->add("data/gfx/bullet.png", t_bitmap);
asset->add("data/gfx/game_bg.png", t_bitmap);
asset->add("data/gfx/game_text.png", t_bitmap);
asset->add("data/gfx/intro.png", t_bitmap);
asset->add("data/gfx/items.png", t_bitmap);
asset->add("data/gfx/logo.png", t_bitmap);
asset->add("data/gfx/player1_body.png", t_bitmap);
asset->add("data/gfx/player1_death.png", t_bitmap);
asset->add("data/gfx/player1_legs.png", t_bitmap);
asset->add("data/gfx/title.png", t_bitmap);
asset->add("data/gfx/player1_head.png", t_bitmap);
asset->add("data/gfx/player2_body.png", t_bitmap);
asset->add("data/gfx/player2_death.png", t_bitmap);
asset->add("data/gfx/player2_legs.png", t_bitmap);
asset->add("data/gfx/player2_head.png", t_bitmap);
// Fuentes
asset->add("media/font/8bithud.png", t_font);
asset->add("media/font/8bithud.txt", t_font);
asset->add("media/font/nokia.png", t_font);
asset->add("media/font/nokia_big2.png", t_font);
asset->add("media/font/nokia.txt", t_font);
asset->add("media/font/nokia2.png", t_font);
asset->add("media/font/nokia2.txt", t_font);
asset->add("media/font/nokia_big2.txt", t_font);
asset->add("media/font/smb2_big.png", t_font);
asset->add("media/font/smb2_big.txt", t_font);
asset->add("media/font/smb2.png", t_font);
asset->add("media/font/smb2.txt", t_font);
asset->add("data/font/8bithud.png", t_font);
asset->add("data/font/8bithud.txt", t_font);
asset->add("data/font/nokia.png", t_font);
asset->add("data/font/nokia_big2.png", t_font);
asset->add("data/font/nokia.txt", t_font);
asset->add("data/font/nokia2.png", t_font);
asset->add("data/font/nokia2.txt", t_font);
asset->add("data/font/nokia_big2.txt", t_font);
asset->add("data/font/smb2_big.png", t_font);
asset->add("data/font/smb2_big.txt", t_font);
asset->add("data/font/smb2.png", t_font);
asset->add("data/font/smb2.txt", t_font);
// Textos
asset->add("media/lang/es_ES.txt", t_lang);
asset->add("media/lang/en_UK.txt", t_lang);
asset->add("media/lang/ba_BA.txt", t_lang);
// DATA
asset->add("data/gamecontrollerdb.txt", t_data);
asset->add("data/lang/es_ES.txt", t_lang);
asset->add("data/lang/en_UK.txt", t_lang);
asset->add("data/lang/ba_BA.txt", t_lang);
return asset->check();
}

View File

@@ -24,7 +24,21 @@ Game::Game(int numPlayers, int currentStage, SDL_Renderer *renderer, Screen *scr
mDifficulty = mOptions->difficulty;
// Crea los objetos
for (int i = 0; i < mNumPlayers; i++)
// Vector de jugadores
if (mNumPlayers == 1)
{
Player *player = new Player(PLAY_AREA_CENTER_X - 11, PLAY_AREA_BOTTOM - 24, mTexturePlayer1Legs, mTexturePlayer1Body, mTexturePlayer1Head, mTexturePlayer1Death, mRenderer);
players.push_back(player);
}
else if (mNumPlayers == 2)
{
Player *player1 = new Player((PLAY_AREA_CENTER_FIRST_QUARTER_X * ((0 * 2) + 1)) - 11, PLAY_AREA_BOTTOM - 24, mTexturePlayer1Legs, mTexturePlayer1Body, mTexturePlayer1Head, mTexturePlayer1Death, mRenderer);
Player *player2 = new Player((PLAY_AREA_CENTER_FIRST_QUARTER_X * ((1 * 2) + 1)) - 11, PLAY_AREA_BOTTOM - 24, mTexturePlayer2Legs, mTexturePlayer2Body, mTexturePlayer2Head, mTexturePlayer2Death, mRenderer);
players.push_back(player1);
players.push_back(player2);
}
/*for (int i = 0; i < mNumPlayers; i++)
{
mPlayer[i] = new Player();
}
@@ -41,13 +55,13 @@ Game::Game(int numPlayers, int currentStage, SDL_Renderer *renderer, Screen *scr
for (int i = 0; i < MAX_ITEMS; i++)
{
mItem[i] = new Item();
mItem[i] = new Item(mTextureItems, mRenderer);
}
for (int i = 0; i < MAX_SMART_SPRITES; i++)
{
mSmartSprite[i] = new SmartSprite();
}
mSmartSprite[i] = new SmartSprite(nullptr, mRenderer);
}*/
mTextureBalloon = new LTexture(mRenderer, mAsset->get("balloon.png"));
mTextureBullet = new LTexture(mRenderer, mAsset->get("bullet.png"));
@@ -81,9 +95,11 @@ Game::Game(int numPlayers, int currentStage, SDL_Renderer *renderer, Screen *scr
mClouds1b = new MovingSprite(256, 0, 256, 52, -0.4f, 0.0f, 0.0f, 0.0f, mTextureGameBG, mRenderer);
mClouds2a = new MovingSprite(0, 52, 256, 32, -0.2f, 0.0f, 0.0f, 0.0f, mTextureGameBG, mRenderer);
mClouds2b = new MovingSprite(256, 52, 256, 32, -0.2f, 0.0f, 0.0f, 0.0f, mTextureGameBG, mRenderer);
m1000Bitmap = new SmartSprite();
m2500Bitmap = new SmartSprite();
m5000Bitmap = new SmartSprite();
m1000Bitmap = new SmartSprite(mTextureGameText, mRenderer);
m2500Bitmap = new SmartSprite(mTextureGameText, mRenderer);
m5000Bitmap = new SmartSprite(mTextureGameText, mRenderer);
mSpriteBackground = new Sprite(0, 0, GAME_WIDTH, GAME_HEIGHT, mTextureGameBG, mRenderer);
mSpriteGetReady = new Sprite(0, PLAY_AREA_CENTER_Y - 10, 109, 20, mTextureGameText, mRenderer);
mSpriteGradient = new Sprite(0, 0, GAME_WIDTH, GAME_HEIGHT, mTextureGameBG, mRenderer);
@@ -105,35 +121,30 @@ Game::~Game()
mLang = nullptr;
mInput = nullptr;
for (int i = 0; i < mNumPlayers; i++)
for (auto player : players)
{
delete mPlayer[i];
mPlayer[i] = nullptr;
}
delete player;
};
for (int i = 0; i < MAX_BALLOONS; i++)
for (auto ballon : ballons)
{
delete mBalloon[i];
mBalloon[i] = nullptr;
}
delete ballon;
};
for (int i = 0; i < MAX_BULLETS; i++)
for (auto bullet : bullets)
{
delete mBullet[i];
mBullet[i] = nullptr;
}
delete bullet;
};
for (int i = 0; i < MAX_ITEMS; i++)
for (auto item : items)
{
delete mItem[i];
mItem[i] = nullptr;
}
delete item;
};
for (int i = 0; i < MAX_SMART_SPRITES; i++)
for (auto smartSprite : smartSprites)
{
delete mSmartSprite[i];
mSmartSprite[i] = nullptr;
}
delete smartSprite;
};
mTextureBalloon->unload();
delete mTextureBalloon;
@@ -277,8 +288,10 @@ void Game::initSin()
{
// Vector con los valores del seno para 360 grados
for (int i = 0; i < 360; i++)
{
mSin[i] = SDL_sinf((float)i * 3.14f / 180.0f);
}
}
// Inicializa las variables necesarias para la sección 'Game'
void Game::init()
@@ -428,18 +441,6 @@ void Game::init()
mSpriteScoreBoard->setSpriteClip(0, 160, 256, 32);
mSpritePowerMeter->setSpriteClip(256, 192 - 8, 40, 8);
// Vector de jugadores
if (mNumPlayers == 1)
{
mPlayer[0]->init(PLAY_AREA_CENTER_X - 11, PLAY_AREA_BOTTOM - 24, mTexturePlayer1Legs, mTexturePlayer1Body, mTexturePlayer1Head, mTexturePlayer1Death, mRenderer);
}
else if (mNumPlayers == 2)
{
mPlayer[0]->init((PLAY_AREA_CENTER_FIRST_QUARTER_X * ((0 * 2) + 1)) - 11, PLAY_AREA_BOTTOM - 24, mTexturePlayer1Legs, mTexturePlayer1Body, mTexturePlayer1Head, mTexturePlayer1Death, mRenderer);
mPlayer[1]->init((PLAY_AREA_CENTER_FIRST_QUARTER_X * ((1 * 2) + 1)) - 11, PLAY_AREA_BOTTOM - 24, mTexturePlayer2Legs, mTexturePlayer2Body, mTexturePlayer2Head, mTexturePlayer2Death, mRenderer);
}
// Establece a cero todos los valores del vector de objetos globo
resetBalloons();
@@ -459,7 +460,7 @@ void Game::init()
mSpriteGetReady->setSpriteClip(0, 0, 109, 20);
// Inicializa el bitmap de 1000 puntos
m1000Bitmap->init(mTextureGameText, mRenderer);
m1000Bitmap->init();
m1000Bitmap->setPosX(0);
m1000Bitmap->setPosY(0);
m1000Bitmap->setWidth(26);
@@ -475,7 +476,7 @@ void Game::init()
m1000Bitmap->setDestY(0);
// Inicializa el bitmap de 2500 puntos
m2500Bitmap->init(mTextureGameText, mRenderer);
m2500Bitmap->init();
m2500Bitmap->setPosX(0);
m2500Bitmap->setPosY(0);
m2500Bitmap->setWidth(28);
@@ -491,7 +492,7 @@ void Game::init()
m2500Bitmap->setDestY(0);
// Inicializa el bitmap de 5000 puntos
m5000Bitmap->init(mTextureGameText, mRenderer);
m5000Bitmap->init();
m5000Bitmap->setPosX(0);
m5000Bitmap->setPosY(0);
m5000Bitmap->setWidth(28);
@@ -1497,11 +1498,12 @@ void Game::setHiScore(Uint32 score)
void Game::updateHiScore()
{
// Si la puntuación actual es mayor que la máxima puntuación
for (int i = 0; i < mNumPlayers; i++)
if (mPlayer[i]->getScore() > mHiScore)
for (auto player : players)
// for (int i = 0; i < mNumPlayers; i++)
if (player->getScore() > mHiScore)
{
// Actualiza la máxima puntuación
mHiScore = mPlayer[i]->getScore();
mHiScore = player->getScore();
// Almacena la máxima puntuación en el fichero junto con un checksum
mScoreDataFile[0] = mHiScore;
@@ -1574,21 +1576,21 @@ void Game::renderScoreBoard()
// PLAYER1 - SCORE
mTextScoreBoard->writeCentered(offsetLeft, offset1, mLang->getText(53));
mTextScoreBoard->writeCentered(offsetLeft, offset2, updateScoreText(mPlayer[0]->getScore()));
mTextScoreBoard->writeCentered(offsetLeft, offset2, updateScoreText(players[0]->getScore()));
// PLAYER1 - MULT
mTextScoreBoard->writeCentered(offsetLeft, offset3, mLang->getText(55));
mTextScoreBoard->writeCentered(offsetLeft, offset4, std::to_string(mPlayer[0]->getScoreMultiplier()).substr(0, 3));
mTextScoreBoard->writeCentered(offsetLeft, offset4, std::to_string(players[0]->getScoreMultiplier()).substr(0, 3));
if (mNumPlayers == 2)
{
// PLAYER2 - SCORE
mTextScoreBoard->writeCentered(offsetRight, offset1, mLang->getText(54));
mTextScoreBoard->writeCentered(offsetRight, offset2, updateScoreText(mPlayer[1]->getScore()));
mTextScoreBoard->writeCentered(offsetRight, offset2, updateScoreText(players[1]->getScore()));
// PLAYER2 - MULT
mTextScoreBoard->writeCentered(offsetRight, offset3, mLang->getText(55));
mTextScoreBoard->writeCentered(offsetRight, offset4, std::to_string(mPlayer[1]->getScoreMultiplier()).substr(0, 3));
mTextScoreBoard->writeCentered(offsetRight, offset4, std::to_string(players[1]->getScoreMultiplier()).substr(0, 3));
}
else
{
@@ -1620,24 +1622,29 @@ void Game::renderScoreBoard()
// Actualiza las variables del jugador
void Game::updatePlayer()
{
for (int i = 0; i < mNumPlayers; i++)
for (auto player : players)
// for (int i = 0; i < mNumPlayers; i++)
{
mPlayer[i]->update();
player->update();
// Comprueba la colisión entre el jugador y los globos
if (checkPlayerBalloonCollision(i))
if (checkPlayerBalloonCollision(player))
{
if (mPlayer[i]->isAlive())
if (player->isAlive())
{
if (mDemo.enabled)
{
mSection = {PROG_SECTION_TITLE, TITLE_SECTION_INSTRUCTIONS};
}
else
killPlayer(i);
{
killPlayer(player);
}
}
}
// Comprueba las colisiones entre el jugador y los items
checkPlayerItemCollision(i);
checkPlayerItemCollision(player);
}
}
@@ -1657,11 +1664,12 @@ void Game::updateStage()
destroyAllBalloons(); // Destruye a todos los enemigos
mStage[mCurrentStage].currentPower = 0; // Vuelve a dejar el poder a cero, por lo que hubiera podido subir al destruir todos lo globos
mMenaceCurrent = 255; // Sube el nivel de amenaza para que no cree mas globos
for (int i = 0; i < mNumPlayers; i++) // Añade un millon de puntos a los jugadores que queden vivos
for (auto player : players)
// for (int i = 0; i < mNumPlayers; i++) // Añade un millon de puntos a los jugadores que queden vivos
{
if (mPlayer[i]->isAlive())
if (player->isAlive())
{
mPlayer[i]->addScore(1000000);
player->addScore(1000000);
}
}
updateHiScore();
@@ -1696,47 +1704,48 @@ void Game::updateDeath()
{
// Comprueba si todos los jugadores estan muertos
bool allAreDead = true;
for (int i = 0; i < mNumPlayers; i++)
for (auto player : players)
// for (int i = 0; i < mNumPlayers; i++)
{
allAreDead &= (!mPlayer[i]->isAlive());
allAreDead &= (!player->isAlive());
if (!mPlayer[i]->isAlive())
if (!player->isAlive())
{
// Animación
if ((mPlayer[i]->getDeathCounter() / 5) % 4 == 0)
if ((player->getDeathCounter() / 5) % 4 == 0)
{
mSmartSprite[mPlayer[i]->mDeathIndex]->setSpriteClip(24 * 0, 24, 24, 24);
smartSprites[player->mDeathIndex]->setSpriteClip(24 * 0, 24, 24, 24);
}
else if ((mPlayer[i]->getDeathCounter() / 5) % 4 == 1)
else if ((player->getDeathCounter() / 5) % 4 == 1)
{
mSmartSprite[mPlayer[i]->mDeathIndex]->setSpriteClip(24 * 1, 24, 24, 24);
smartSprites[player->mDeathIndex]->setSpriteClip(24 * 1, 24, 24, 24);
}
else if ((mPlayer[i]->getDeathCounter() / 5) % 4 == 2)
else if ((player->getDeathCounter() / 5) % 4 == 2)
{
mSmartSprite[mPlayer[i]->mDeathIndex]->setSpriteClip(24 * 2, 24, 24, 24);
smartSprites[player->mDeathIndex]->setSpriteClip(24 * 2, 24, 24, 24);
}
else if ((mPlayer[i]->getDeathCounter() / 5) % 4 == 3)
else if ((player->getDeathCounter() / 5) % 4 == 3)
{
mSmartSprite[mPlayer[i]->mDeathIndex]->setSpriteClip(24 * 3, 24, 24, 24);
smartSprites[player->mDeathIndex]->setSpriteClip(24 * 3, 24, 24, 24);
}
// Rebote en los laterales
if (mSmartSprite[mPlayer[i]->mDeathIndex]->getVelX() > 0)
if (smartSprites[player->mDeathIndex]->getVelX() > 0)
{
if (mSmartSprite[mPlayer[i]->mDeathIndex]->getPosX() > (GAME_WIDTH - mSmartSprite[mPlayer[i]->mDeathIndex]->getWidth()))
if (smartSprites[player->mDeathIndex]->getPosX() > (GAME_WIDTH - smartSprites[player->mDeathIndex]->getWidth()))
{
mSmartSprite[mPlayer[i]->mDeathIndex]->setPosX(GAME_WIDTH - mSmartSprite[mPlayer[i]->mDeathIndex]->getWidth());
mSmartSprite[mPlayer[i]->mDeathIndex]->setVelX(mSmartSprite[mPlayer[i]->mDeathIndex]->getVelX() * (-1));
mSmartSprite[mPlayer[i]->mDeathIndex]->setDestX(mSmartSprite[mPlayer[i]->mDeathIndex]->getDestX() * (-1));
smartSprites[player->mDeathIndex]->setPosX(GAME_WIDTH - smartSprites[player->mDeathIndex]->getWidth());
smartSprites[player->mDeathIndex]->setVelX(smartSprites[player->mDeathIndex]->getVelX() * (-1));
smartSprites[player->mDeathIndex]->setDestX(smartSprites[player->mDeathIndex]->getDestX() * (-1));
}
}
else
{
if (mSmartSprite[mPlayer[i]->mDeathIndex]->getPosX() < 0)
if (smartSprites[player->mDeathIndex]->getPosX() < 0)
{
mSmartSprite[mPlayer[i]->mDeathIndex]->setPosX(0);
mSmartSprite[mPlayer[i]->mDeathIndex]->setVelX(mSmartSprite[mPlayer[i]->mDeathIndex]->getVelX() * (-1));
mSmartSprite[mPlayer[i]->mDeathIndex]->setDestX(mSmartSprite[mPlayer[i]->mDeathIndex]->getDestX() * (-1));
smartSprites[player->mDeathIndex]->setPosX(0);
smartSprites[player->mDeathIndex]->setVelX(smartSprites[player->mDeathIndex]->getVelX() * (-1));
smartSprites[player->mDeathIndex]->setDestX(smartSprites[player->mDeathIndex]->getDestX() * (-1));
}
}
}
@@ -1810,37 +1819,29 @@ void Game::renderDeathFade(int counter)
// Actualiza los globos
void Game::updateBalloons()
{
for (int i = 0; i < MAX_BALLOONS; i++)
mBalloon[i]->update();
for (auto balloon : balloons)
// for (int i = 0; i < MAX_BALLOONS; i++)
balloon->update();
}
// Pinta en pantalla todos los globos activos
void Game::renderBalloons()
{
for (int i = 0; i < MAX_BALLOONS; i++)
for (auto balloon : balloons)
// for (int i = 0; i < MAX_BALLOONS; i++)
{
mBalloon[i]->render();
if ((mDebug.enabled) && (mBalloon[i]->isPopping() == false))
mText->writeCentered(mBalloon[i]->getPosX() + (mBalloon[i]->getWidth() / 2), mBalloon[i]->getPosY() - 8, std::to_string(i));
balloon->render();
if ((mDebug.enabled) && (balloon->isPopping() == false))
mText->writeCentered(balloon->getPosX() + (balloon->getWidth() / 2), balloon->getPosY() - 8, std::to_string(i));
}
}
// Devuelve el primer indice no activo del vector de globos
Uint8 Game::getBalloonFreeIndex()
{
for (int i = 0; i < MAX_BALLOONS; i++)
if (!mBalloon[i]->isEnabled())
return i;
return 0;
}
// Crea un globo nuevo en el vector de globos
Uint8 Game::createNewBalloon(float x, int y, Uint8 kind, float velx, float speed, Uint16 creationtimer, LTexture *texture)
{
const Uint8 index = getBalloonFreeIndex();
mBalloon[index]->init(x, y, kind, velx, speed, creationtimer, texture, mRenderer);
return index;
Balloon *b = new Balloon(x, y, kind, velx, speed, creationtimer, texture, mRenderer);
balloons.push_back(b);
return (Uint8)(balloons.size() - 1);
}
// Crea una PowerBall
@@ -1855,7 +1856,9 @@ void Game::createPowerBall()
const int x[3] = {left, center, right};
const int posX = x[rand() % 3];
mBalloon[getBalloonFreeIndex()]->init(posX, posY, POWER_BALL, BALLOON_VELX_POSITIVE * (((rand() % 2) * 2) - 1), mEnemySpeed, 100, mTextureBalloon, mRenderer);
Balloon *b = new Balloon(posX, posY, POWER_BALL, BALLOON_VELX_POSITIVE * (((rand() % 2) * 2) - 1), mEnemySpeed, 100, mTextureBalloon, mRenderer);
balloons.push_back(b);
mPowerBallEnabled = true;
mPowerBallCounter = POWERBALL_COUNTER;
}
@@ -1863,16 +1866,25 @@ void Game::createPowerBall()
// Establece a cero todos los valores del vector de objetos globo
void Game::resetBalloons()
{
for (int i = 0; i < MAX_BALLOONS; i++)
mBalloon[i]->disable();
for (auto balloon : balloons)
// for (int i = 0; i < MAX_BALLOONS; i++)
{
balloon->disable();
}
}
// Establece la velocidad de los globos
void Game::setBalloonSpeed(float speed)
{
for (int i = 0; i < MAX_BALLOONS; i++)
if (mBalloon[i]->isEnabled())
mBalloon[i]->setSpeed(speed);
for (auto balloon : balloons)
// for (int i = 0; i < MAX_BALLOONS; i++)
{
if (balloon->isEnabled())
{
balloon->setSpeed(speed);
}
}
}
// Incrementa la velocidad de los globos
@@ -1951,7 +1963,7 @@ void Game::updateBalloonSpeed()
}
// Explosiona un globo. Lo destruye y crea otros dos si es el caso
void Game::popBalloon(Uint8 index)
void Game::popBalloon(Balloon *balloon)
{
// Aumenta el poder de la fase
increaseStageCurrentPower(1);
@@ -2159,33 +2171,38 @@ bool Game::checkPlayerBalloonCollision(int index)
}
// Comprueba la colisión entre el jugador y los items
void Game::checkPlayerItemCollision(int index)
void Game::checkPlayerItemCollision(Player *player)
{
if (mPlayer[index]->isAlive())
for (int i = 0; i < MAX_ITEMS; i++)
if (!player->isAlive())
{
if (mItem[i]->isEnabled())
return;
}
for (auto item : items)
// for (int i = 0; i < MAX_ITEMS; i++)
{
if (checkCollision(mPlayer[index]->getCollider(), mItem[i]->getCollider()))
if (item->isEnabled())
{
switch (mItem[i]->getClass())
if (checkCollision(player->getCollider(), item->getCollider()))
{
switch (item->getClass())
{
case ITEM_POINTS_1_DISK:
mPlayer[index]->addScore(1000);
player->addScore(1000);
updateHiScore();
createItemScoreSprite(mItem[i]->getPosX() + (mItem[i]->getWidth() / 2) - (m1000Bitmap->getWidth() / 2), mPlayer[index]->getPosY(), m1000Bitmap);
createItemScoreSprite(item->getPosX() + (item->getWidth() / 2) - (m1000Bitmap->getWidth() / 2), player->getPosY(), m1000Bitmap);
JA_PlaySound(mSoundItemPickup);
break;
case ITEM_POINTS_2_GAVINA:
mPlayer[index]->addScore(2500);
player->addScore(2500);
updateHiScore();
createItemScoreSprite(mItem[i]->getPosX() + (mItem[i]->getWidth() / 2) - (m2500Bitmap->getWidth() / 2), mPlayer[index]->getPosY(), m2500Bitmap);
createItemScoreSprite(item->getPosX() + (item->getWidth() / 2) - (m2500Bitmap->getWidth() / 2), player->getPosY(), m2500Bitmap);
JA_PlaySound(mSoundItemPickup);
break;
case ITEM_POINTS_3_PACMAR:
mPlayer[index]->addScore(5000);
player->addScore(5000);
updateHiScore();
createItemScoreSprite(mItem[i]->getPosX() + (mItem[i]->getWidth() / 2) - (m5000Bitmap->getWidth() / 2), mPlayer[index]->getPosY(), m5000Bitmap);
createItemScoreSprite(item->getPosX() + (item->getWidth() / 2) - (m5000Bitmap->getWidth() / 2), player->getPosY(), m5000Bitmap);
JA_PlaySound(mSoundItemPickup);
break;
case ITEM_CLOCK:
@@ -2193,17 +2210,17 @@ void Game::checkPlayerItemCollision(int index)
JA_PlaySound(mSoundItemPickup);
break;
case ITEM_COFFEE:
if (mPlayer[index]->getCoffees() == 2)
if (player->getCoffees() == 2)
{
mPlayer[index]->addScore(5000);
player->addScore(5000);
updateHiScore();
createItemScoreSprite(mItem[i]->getPosX() + (mItem[i]->getWidth() / 2) - (m5000Bitmap->getWidth() / 2), mPlayer[index]->getPosY(), m5000Bitmap);
createItemScoreSprite(item->getPosX() + (item->getWidth() / 2) - (m5000Bitmap->getWidth() / 2), player->getPosY(), m5000Bitmap);
}
mPlayer[index]->giveExtraHit();
player->giveExtraHit();
JA_PlaySound(mSoundItemPickup);
break;
case ITEM_COFFEE_MACHINE:
mPlayer[index]->setPowerUp(true);
player->setPowerUp(true);
JA_PlaySound(mSoundItemPickup);
mCoffeeMachineEnabled = false;
break;
@@ -2211,7 +2228,7 @@ void Game::checkPlayerItemCollision(int index)
default:
break;
}
mItem[i]->erase();
item->erase();
}
}
}
@@ -2441,7 +2458,7 @@ Uint8 Game::dropItem()
// Crea un objeto item
void Game::createItem(int x, int y, Uint8 kind)
{
mItem[getItemFreeIndex()]->init(kind, x, y, mTextureItems, mRenderer);
mItem[getItemFreeIndex()]->init(kind, x, y);
}
// Crea un objeto SmartSprite para mostrar la puntuación al coger un objeto
@@ -2494,7 +2511,7 @@ void Game::throwCoffee(int x, int y)
{
const Uint8 index = getSmartSpriteFreeIndex();
mSmartSprite[index]->init(mTextureItems, mRenderer);
mSmartSprite[index]->init();
mSmartSprite[index]->setPosX(x - 8);
mSmartSprite[index]->setPosY(y - 8);
mSmartSprite[index]->setWidth(16);
@@ -2519,7 +2536,8 @@ void Game::throwPlayer(int x, int y, int index)
const int sentit = ((rand() % 2) ? 1 : -1);
mPlayer[index]->mDeathIndex = getSmartSpriteFreeIndex();
mSmartSprite[mPlayer[index]->mDeathIndex]->init(mPlayer[index]->getDeadTexture(), mRenderer);
// mSmartSprite[mPlayer[index]->mDeathIndex]->init(mPlayer[index]->getDeadTexture(), mRenderer);
mSmartSprite[mPlayer[index]->mDeathIndex]->setTexture(mPlayer[index]->getDeadTexture());
mSmartSprite[mPlayer[index]->mDeathIndex]->setPosX(x);
mSmartSprite[mPlayer[index]->mDeathIndex]->setPosY(y);
mSmartSprite[mPlayer[index]->mDeathIndex]->setWidth(24);
@@ -2572,12 +2590,12 @@ void Game::resetSmartSprites()
{
for (int i = 0; i < MAX_SMART_SPRITES; i++)
{
mSmartSprite[i]->erase();
mSmartSprite[i]->init();
}
}
// Acciones a realizar cuando el jugador muere
void Game::killPlayer(int index)
void Game::killPlayer(Player *player)
{
if (!mPlayer[index]->isInvulnerable())
{

View File

@@ -132,15 +132,20 @@ private:
Screen *mScreen; // Objeto encargado de dibujar en pantalla
Asset *mAsset; // Objeto que gestiona todos los ficheros de recursos
Lang *mLang; // Objeto para gestionar los textos en diferentes idiomas
int mNumPlayers; // Numero de jugadores
Player *mPlayer[2]; // Vector con los jugadores jugador
Input *mInput; // Manejador de entrada
Balloon *mBalloon[MAX_BALLOONS]; // Vector con los objetos globo
Bullet *mBullet[MAX_BULLETS]; // Vector con los objetos bala
Item *mItem[MAX_ITEMS]; // Vector con los objetos item
SmartSprite *mSmartSprite[MAX_SMART_SPRITES]; // Vector para almacenar y gestionar SmartSprites
// Player *mPlayer[2]; // Vector con los jugadores jugador
// Balloon *mBalloon[MAX_BALLOONS]; // Vector con los objetos globo
// Bullet *mBullet[MAX_BULLETS]; // Vector con los objetos bala
// Item *mItem[MAX_ITEMS]; // Vector con los objetos item
// SmartSprite *mSmartSprite[MAX_SMART_SPRITES]; // Vector para almacenar y gestionar SmartSprites
int mNumPlayers; // Numero de jugadores
std::vector<Player *> players; // Vector con los jugadores
std::vector<Balloon *> balloons; // Vector con los globos
std::vector<Bullet *> bullets; // Vector con las balas
std::vector<Item *> items; // Vector con los items
std::vector<SmartSprite *> smartSprites; // Vector con los smartsprites
LTexture *mTextureBalloon; // Textura para los enemigos
LTexture *mTextureBullet; // Textura para las balas
@@ -311,9 +316,6 @@ private:
// Pinta en pantalla todos los globos activos
void renderBalloons();
// Devuelve el primer indice no activo del vector de globos
Uint8 getBalloonFreeIndex();
// Crea un globo nuevo en el vector de globos
Uint8 createNewBalloon(float x, int y, Uint8 kind, float velx, float speed, Uint16 stoppedcounter, LTexture *texture);
@@ -336,10 +338,10 @@ private:
void updateBalloonSpeed();
// Explosiona un globo. Lo destruye y crea otros dos si es el caso
void popBalloon(Uint8 index);
void popBalloon(Balloon *balloon);
// Explosiona un globo. Lo destruye
void destroyBalloon(Uint8 index);
void destroyBalloon(Balloon *balloon);
// Explosiona todos los globos
void popAllBalloons();
@@ -357,10 +359,10 @@ private:
Uint8 countBalloons();
// Comprueba la colisión entre el jugador y los globos activos
bool checkPlayerBalloonCollision(int index);
bool checkPlayerBalloonCollision(Player *player);
// Comprueba la colisión entre el jugador y los items
void checkPlayerItemCollision(int index);
void checkPlayerItemCollision(Player *player);
// Comprueba la colisión entre las balas y los globos
void checkBulletBalloonCollision();
@@ -371,9 +373,6 @@ private:
// Pinta las balas activas
void renderBullets();
// Devuelve el primer indice no activo del vector de balas
Uint8 getBulletFreeIndex();
// Establece a cero todos los valores del vector de objetos bala
void resetBullets();
@@ -386,9 +385,6 @@ private:
// Pinta los items activos
void renderItems();
// Devuelve el primer indice no activo del vector de items
Uint8 getItemFreeIndex();
// Establece a cero todos los valores del vector de objetos item
void resetItems();
@@ -419,14 +415,11 @@ private:
// Pinta los SmartSprites activos
void renderSmartSprites();
// Devuelve el primer indice no activo del vector de SmartSprites
Uint8 getSmartSpriteFreeIndex();
// Establece a cero todos los valores del vector de objetos SmafrtSprite
void resetSmartSprites();
// Acciones a realizar cuando el jugador muere
void killPlayer(int index);
void killPlayer(Player *player);
// Obtiene el valor de la variable
Uint8 getSubsection();

View File

@@ -13,7 +13,7 @@ Instructions::Instructions(SDL_Renderer *renderer, Screen *screen, Asset *mAsset
// Reserva memoria para los punteros
mEventHandler = new SDL_Event();
mItemTexture = new LTexture(mRenderer);
mItemTexture = new LTexture(mRenderer,mAsset->get("items.png"));
mSprite = new Sprite(0, 0, GAME_WIDTH, GAME_HEIGHT, mItemTexture, mRenderer);
mText = new Text(mAsset->get("smb2.png"), mAsset->get("smb2.txt"), mRenderer);
@@ -50,22 +50,9 @@ Instructions::~Instructions()
mBackbuffer = nullptr;
}
// Carga los recursos necesarios para la sección 'Instructions'
bool Instructions::loadMedia()
{
bool success = true;
success &= loadTextureFromFile(mItemTexture, mAsset->get("items.png"), mRenderer);
return success;
}
// Inicializa las variables necesarias para la sección 'Instructions'
void Instructions::init()
{
// Carga los recursos
loadMedia();
// Inicializa variables
mSection.name = SELF;
mTicks = 0;

View File

@@ -38,9 +38,6 @@ private:
Uint8 mTicksSpeed; // Velocidad a la que se repiten los bucles del programa
bool mManualQuit; // Indica si se quiere salir del modo manual
// Carga los recursos
bool loadMedia();
// Actualiza las variables
void update();

View File

@@ -11,12 +11,12 @@ Intro::Intro(SDL_Renderer *renderer, Screen *screen, Asset *mAsset, Lang *lang)
// Reserva memoria para los punteros
mEventHandler = new SDL_Event();
mBitmapTexture = new LTexture(mRenderer);
mBitmapTexture = new LTexture(mRenderer,mAsset->get("intro.png"));
mText = new Text(mAsset->get("nokia.png"), mAsset->get("nokia.txt"), mRenderer);
for (int i = 0; i < INTRO_TOTAL_BITMAPS; i++)
{
mBitmap[i] = new SmartSprite();
mBitmap[i] = new SmartSprite(mBitmapTexture, mRenderer);
}
for (int i = 0; i < INTRO_TOTAL_TEXTS; i++)
@@ -67,12 +67,14 @@ void Intro::init()
// Inicializa el vector de eventos de la intro
for (int i = 0; i < INTRO_TOTAL_EVENTS; i++)
{
mEvents[i] = EVENT_WAITING;
}
// Inicializa los bitmaps de la intro
for (int i = 0; i < INTRO_TOTAL_BITMAPS; i++)
{
mBitmap[i]->init(mBitmapTexture, mRenderer);
mBitmap[i]->init();
mBitmap[i]->setId(i);
mBitmap[i]->setIntroEvents(&mEvents[0]);
mBitmap[i]->setWidth(128);
@@ -191,9 +193,6 @@ bool Intro::loadMedia()
{
bool success = true;
// Texturas
success &= loadTextureFromFile(mBitmapTexture, mAsset->get("intro.png"), mRenderer);
// Musicas
mMusic = JA_LoadMusic(mAsset->get("intro.ogg").c_str());

View File

@@ -2,12 +2,23 @@
#include "item.h"
// Constructor
Item::Item(Uint8 value, float x, float y, LTexture *texture, SDL_Renderer *renderer)
Item::Item(LTexture *texture, SDL_Renderer *renderer)
{
mSprite = new AnimatedSprite(texture, renderer);
mClass = NO_KIND;
init(NO_KIND, 0.0f, 0.0f);
}
mClass = value;
// Destructor
Item::~Item()
{
delete mSprite;
mSprite = nullptr;
}
// Inicializador
void Item::init(Uint8 type, float x, float y)
{
mClass = type;
mEnabled = true;
mTimeToLive = 600;
mPosX = x;
@@ -32,7 +43,7 @@ Item::Item(Uint8 value, float x, float y, LTexture *texture, SDL_Renderer *rende
mSprite->setPosX(mPosX);
mSprite->setPosY(mPosY);
switch (value)
switch (type)
{
case NO_KIND:
mEnabled = false;
@@ -93,13 +104,6 @@ Item::Item(Uint8 value, float x, float y, LTexture *texture, SDL_Renderer *rende
}
}
// Destructor
Item::~Item()
{
delete mSprite;
mSprite = nullptr;
}
// Centra el objeto en la posición X
void Item::allignTo(int x)
{
@@ -205,7 +209,7 @@ void Item::update()
{
move();
shiftColliders();
mSprite->animate(0);
mSprite->animate();
updateTimeToLive();
checkTimeToLive();
}

View File

@@ -43,11 +43,14 @@ public:
Uint16 mTimeToLive; // Temporizador con el tiempo que el objeto está presente
// Constructor
Item(Uint8 value, float x, float y, LTexture *texture, SDL_Renderer *renderer);
Item(LTexture *texture, SDL_Renderer *renderer);
// Destructor
~Item();
// Inicializador
void init(Uint8 type, float x, float y);
// Centra el objeto en la posición X
void allignTo(int x);

View File

@@ -907,3 +907,12 @@ void Menu::setBackgroundType(int value)
{
backgroundType = value;
}
// Establece la fuente de texto que se utilizará
void Menu::setText(std::string font_png, std::string font_txt)
{
if (!text)
{
text = new Text(asset->get(font_png), asset->get(font_txt), renderer);
}
}

View File

@@ -217,8 +217,8 @@ public:
// Establece el tipo de fondo del menu
void setBackgroundType(int value);
// hacer procedimientos para establecer el titulo, la x, la y, la tipografia y el tipo de fondo
// Establece la fuente de texto que se utilizará
void setText(std::string font_png, std::string font_txt);
};
#endif

View File

@@ -2,11 +2,20 @@
#include "player.h"
// Constructor
Player::Player()
Player::Player(float x, int y, LTexture *textureLegs, LTexture *textureBody, LTexture *textureHead, LTexture *textureDead, SDL_Renderer *renderer)
{
mSpriteLegs = new AnimatedSprite();
mSpriteBody = new AnimatedSprite();
mSpriteHead = new AnimatedSprite();
mSpriteLegs = new AnimatedSprite(textureLegs, renderer);
mSpriteBody = new AnimatedSprite(textureBody, renderer);
mSpriteHead = new AnimatedSprite(textureHead, renderer);
// Copia punteros
mPlayerDeadTexture = textureDead;
// Establece la posición inicial del jugador
mPosX = x;
mPosY = y;
init();
}
// Destructor
@@ -23,11 +32,8 @@ Player::~Player()
}
// Iniciador
void Player::init(float x, int y, LTexture *textureLegs, LTexture *textureBody, LTexture *textureHead, LTexture *textureDead, SDL_Renderer *renderer)
void Player::init()
{
// Copia punteros
mPlayerDeadTexture = textureDead;
// Inicializa variables de estado
mAlive = true;
mDeathCounter = DEATH_COUNTER;
@@ -47,10 +53,6 @@ void Player::init(float x, int y, LTexture *textureLegs, LTexture *textureBody,
mWidth = 3 * BLOCK;
mHeight = 3 * BLOCK;
// Establece la posición inicial del jugador
mPosX = x;
mPosY = y;
// Establece el tamaño del circulo de colisión
mCollider.r = 7;
@@ -75,8 +77,8 @@ void Player::init(float x, int y, LTexture *textureLegs, LTexture *textureBody,
// Inicia el sprite
mSpriteLegs->init();
mSpriteBody->init(textureBody, renderer);
mSpriteHead->init(textureHead, renderer);
mSpriteBody->init();
mSpriteHead->init();
// Establece el alto y ancho del sprite
mSpriteLegs->setWidth(mWidth);

View File

@@ -97,13 +97,13 @@ public:
Uint16 mPowerUpCounter; // Temporizador para el modo PowerUp
// Constructor
Player();
Player(float x, int y, LTexture *textureLegs, LTexture *textureBody, LTexture *textureHead, LTexture *textureDead, SDL_Renderer *renderer);
// Destructor
~Player();
// Iniciador
void init(float x, int y, LTexture *textureLegs, LTexture *textureBody, LTexture *textureHead, LTexture *textureDead, SDL_Renderer *renderer);
void init();
// Actua en consecuencia de la entrada recibida
void setInput(Uint8 input);

View File

@@ -2,8 +2,10 @@
#include "smartsprite.h"
// Constructor
SmartSprite::SmartSprite()
SmartSprite::SmartSprite(LTexture *texture, SDL_Renderer *renderer)
{
setTexture(texture);
setRenderer(renderer);
}
// Destructor
@@ -12,11 +14,8 @@ SmartSprite::~SmartSprite()
}
// Inicializador
void SmartSprite::init(LTexture *texture, SDL_Renderer *renderer)
void SmartSprite::init()
{
setTexture(texture);
setRenderer(renderer);
setPosX(0);
setPosY(0);
setWidth(0);
@@ -48,12 +47,6 @@ void SmartSprite::init(LTexture *texture, SDL_Renderer *renderer)
introEvents = nullptr;
}
// Pone a cero los elementos del objeto
void SmartSprite::erase()
{
init(nullptr, nullptr);
}
// Obtiene el valor de la variable
bool SmartSprite::isEnabled()
{

View File

@@ -21,16 +21,13 @@ private:
public:
// Constructor
SmartSprite();
SmartSprite(LTexture *texture, SDL_Renderer *renderer);
// Destructor
~SmartSprite();
// Inicializador
void init(LTexture *texture, SDL_Renderer *renderer);
// Pone a cero los elementos del objeto
void erase();
void init();
// Obtiene el valor de la variable
bool isEnabled();

View File

@@ -15,18 +15,21 @@ Title::Title(SDL_Window *window, SDL_Renderer *renderer, Screen *screen, Input *
// Reserva memoria para los punteros propios
mEventHandler = new SDL_Event();
mFade = new Fade(renderer);
mTitleTexture = new LTexture(mRenderer);
mItemsTexture = new LTexture(mRenderer);
mCoffeeBitmap = new SmartSprite();
mCrisisBitmap = new SmartSprite();
mDustBitmapL = new AnimatedSprite();
mDustBitmapR = new AnimatedSprite();
mTitleTexture = new LTexture(mRenderer, mAsset->get("title.png"));
mItemsTexture = new LTexture(mRenderer, mAsset->get("items.png"));
mCoffeeBitmap = new SmartSprite(mTitleTexture, mRenderer);
mCrisisBitmap = new SmartSprite(mTitleTexture, mRenderer);
mDustBitmapL = new AnimatedSprite(mTitleTexture, mRenderer);
mDustBitmapR = new AnimatedSprite(mTitleTexture, mRenderer);
mTile = new Sprite();
mGradient = new Sprite();
mText = new Text(mAsset->get("smb2.png"), mAsset->get("smb2.txt"), mRenderer);
mText2 = new Text(mAsset->get("8bithud.png"), mAsset->get("8bithud.txt"), mRenderer);
mMenu.title = new Menu(mRenderer, mText, mInput, mAsset);
mMenu.options = new Menu(mRenderer, mText, mInput, mAsset);
mMenu.title = new Menu(mRenderer, mInput, mAsset);
mMenu.options = new Menu(mRenderer, mInput, mAsset);
// Crea la textura para el mosaico de fondo
mBackground = SDL_CreateTexture(mRenderer, SDL_PIXELFORMAT_RGBA8888, SDL_TEXTUREACCESS_TARGET, GAME_WIDTH * 2, GAME_HEIGHT * 2);
@@ -67,14 +70,6 @@ Title::~Title()
delete mItemsTexture;
mItemsTexture = nullptr;
mTextTexture->unload();
delete mTextTexture;
mTextTexture = nullptr;
mTextTexture2->unload();
delete mTextTexture2;
mTextTexture2 = nullptr;
delete mCoffeeBitmap;
mCoffeeBitmap = nullptr;
@@ -154,7 +149,6 @@ void Title::init(bool demo, Uint8 subsection)
}
// Inicializa el bitmap de Coffee
mCoffeeBitmap->init(mTitleTexture, mRenderer);
mCoffeeBitmap->setId(0);
mCoffeeBitmap->setIntroEvents(&mEvents[0]);
mCoffeeBitmap->setPosX(45);
@@ -172,7 +166,6 @@ void Title::init(bool demo, Uint8 subsection)
mCoffeeBitmap->setDestY(11);
// Inicializa el bitmap de Crisis
mCrisisBitmap->init(mTitleTexture, mRenderer);
mCrisisBitmap->setId(1);
mCrisisBitmap->setIntroEvents(&mEvents[0]);
mCrisisBitmap->setPosX(60);
@@ -190,14 +183,12 @@ void Title::init(bool demo, Uint8 subsection)
mCrisisBitmap->setDestY(57);
// Inicializa el bitmap de DustRight
mDustBitmapR->init(mTitleTexture, mRenderer);
mDustBitmapR->setPosX(218);
mDustBitmapR->setPosY(47);
mDustBitmapR->setWidth(16);
mDustBitmapR->setHeight(14);
mDustBitmapR->setCurrentFrame(0);
mDustBitmapR->setAnimationCounter(0);
mDustBitmapR->setAnimationNumFrames(0, 7);
mDustBitmapR->setAnimationSpeed(0, 8);
mDustBitmapR->setAnimationLoop(0, false);
mDustBitmapR->setAnimationFrames(0, 0, 160 + (mDustBitmapR->getWidth() * 0), 80, mDustBitmapR->getWidth(), mDustBitmapR->getHeight());
@@ -209,14 +200,12 @@ void Title::init(bool demo, Uint8 subsection)
mDustBitmapR->setAnimationFrames(0, 6, 160 + (mDustBitmapR->getWidth() * 6), 80, mDustBitmapR->getWidth(), mDustBitmapR->getHeight());
// Inicializa el bitmap de DustLeft
mDustBitmapL->init(mTitleTexture, mRenderer);
mDustBitmapL->setPosX(33);
mDustBitmapL->setPosY(47);
mDustBitmapL->setWidth(16);
mDustBitmapL->setHeight(14);
mDustBitmapL->setCurrentFrame(0);
mDustBitmapL->setAnimationCounter(0);
mDustBitmapL->setAnimationNumFrames(0, 7);
mDustBitmapL->setAnimationSpeed(0, 8);
mDustBitmapL->setAnimationLoop(0, false);
mDustBitmapL->setAnimationFrames(0, 0, 160 + (mDustBitmapL->getWidth() * 0), 66, mDustBitmapL->getWidth(), mDustBitmapL->getHeight());
@@ -233,7 +222,9 @@ void Title::init(bool demo, Uint8 subsection)
// Inicializa el vector de eventos de la pantalla de titulo
for (int i = 0; i < TITLE_TOTAL_EVENTS; i++)
{
mEvents[i] = EVENT_WAITING;
}
// Crea el mosaico de fondo del titulo
createTiledBackground();
@@ -246,22 +237,30 @@ void Title::init(bool demo, Uint8 subsection)
// Inicializa los valores del vector con los valores del seno
for (int i = 0; i < 360; i++)
{
mSin[i] = SDL_sinf((float)i * 3.14f / 180.0f);
}
// Inicializa los objetos de menu
mMenu.title->init("TITLE", 0, (14 * BLOCK) + 4, MENU_BACKGROUND_TRANSPARENT);
mMenu.title->setText(mAsset->get("smb2.png"), mAsset->get("smb2.txt"));
mMenu.title->setName("TITLE");
mMenu.title->setPos(0, (14 * BLOCK) + 4);
mMenu.title->setBackgroundType(MENU_BACKGROUND_TRANSPARENT);
mMenu.title->addItem(mLang->getText(51), 2); // 1 PLAYER
mMenu.title->addItem(mLang->getText(52), 7); // 2 PLAYERS
mMenu.title->addItem(mLang->getText(1), 7); // OPTIONS
mMenu.title->addItem(mLang->getText(3)); // QUIT
mMenu.title->setDefaultActionWhenCancel(3);
mMenu.title->setBackgroundColor(0x30, 0x30, 0x40, 192);
mMenu.title->setSelectorColor(0xe5, 0x1c, 0x23, 0);
mMenu.title->setSelectorTextColor(0xFF, 0xB4, 0x00);
mMenu.title->setBackgroundColor({0x30, 0x30, 0x40}, 192);
mMenu.title->setSelectorColor({0xe5, 0x1c, 0x23}, 0);
mMenu.title->setSelectorTextColor({0xFF, 0xB4, 0x00});
mMenu.title->centerMenuOnX(SCREEN_CENTER_X);
mMenu.title->centerMenuElementsOnX();
mMenu.options->init("OPTIONS", 0, BLOCK, MENU_BACKGROUND_TRANSPARENT);
mMenu.options->setText(mAsset->get("smb2.png"), mAsset->get("smb2.txt"));
mMenu.options->setName("OPTIONS");
mMenu.options->setPos(0, BLOCK);
mMenu.options->setBackgroundType(MENU_BACKGROUND_TRANSPARENT);
mMenu.options->addItem(mLang->getText(59), 7); // (0) DIFFICULTY
mMenu.options->addItem(mLang->getText(62), 2, true, false, true); // (1) PLAYER 1 CONTROLS
mMenu.options->addItem(mLang->getText(69), 7, false, false); // (2) KEYBOARD
@@ -277,9 +276,9 @@ void Title::init(bool demo, Uint8 subsection)
mMenu.options->addItem(mLang->getText(9), 2); // (12) ACCEPT
mMenu.options->addItem(mLang->getText(10)); // (13) CANCEL
mMenu.options->setDefaultActionWhenCancel(13);
mMenu.options->setBackgroundColor(0x30, 0x30, 0x40, 192);
mMenu.options->setSelectorColor(0xe5, 0x1c, 0x23, 255);
mMenu.options->setSelectorTextColor(0xFF, 0xF1, 0x76);
mMenu.options->setBackgroundColor({0x30, 0x30, 0x40}, 192);
mMenu.options->setSelectorColor({0xe5, 0x1c, 0x23}, 255);
mMenu.options->setSelectorTextColor({0xFF, 0xF1, 0x76});
mMenu.options->centerMenuOnX(SCREEN_CENTER_X);
mMenu.options->centerMenuOnY(SCREEN_CENTER_Y);
@@ -293,12 +292,6 @@ bool Title::loadMedia()
// Indicador de éxito en la carga
bool success = true;
// Texturas
success &= loadTextureFromFile(mTitleTexture, mAsset->get("title.png"), mRenderer);
success &= loadTextureFromFile(mItemsTexture, mAsset->get("items.png"), mRenderer);
success &= loadTextureFromFile(mTextTexture, mAsset->get("smb2.png"), mRenderer);
success &= loadTextureFromFile(mTextTexture2, mAsset->get("8bithud.png"), mRenderer);
// Sonidos
mSound = JA_LoadSound(mAsset->get("title.wav").c_str());