diff --git a/data/config/config.bin b/data/config/config.bin new file mode 100644 index 0000000..0f82916 Binary files /dev/null and b/data/config/config.bin differ diff --git a/data/demo.bin b/data/config/demo.bin similarity index 100% rename from data/demo.bin rename to data/config/demo.bin diff --git a/data/gamecontrollerdb.txt b/data/config/gamecontrollerdb.txt similarity index 100% rename from data/gamecontrollerdb.txt rename to data/config/gamecontrollerdb.txt diff --git a/data/config/score.bin b/data/config/score.bin new file mode 100644 index 0000000..b88b120 Binary files /dev/null and b/data/config/score.bin differ diff --git a/media/font/8bithud.png b/data/font/8bithud.png similarity index 100% rename from media/font/8bithud.png rename to data/font/8bithud.png diff --git a/media/font/8bithud.txt b/data/font/8bithud.txt similarity index 100% rename from media/font/8bithud.txt rename to data/font/8bithud.txt diff --git a/media/font/nokia.png b/data/font/nokia.png similarity index 100% rename from media/font/nokia.png rename to data/font/nokia.png diff --git a/media/font/nokia.txt b/data/font/nokia.txt similarity index 100% rename from media/font/nokia.txt rename to data/font/nokia.txt diff --git a/media/font/nokia2.png b/data/font/nokia2.png similarity index 100% rename from media/font/nokia2.png rename to data/font/nokia2.png diff --git a/media/font/nokia2.txt b/data/font/nokia2.txt similarity index 100% rename from media/font/nokia2.txt rename to data/font/nokia2.txt diff --git a/media/font/nokia_big2.png b/data/font/nokia_big2.png similarity index 100% rename from media/font/nokia_big2.png rename to data/font/nokia_big2.png diff --git a/media/font/nokia_big2.txt b/data/font/nokia_big2.txt similarity index 100% rename from media/font/nokia_big2.txt rename to data/font/nokia_big2.txt diff --git a/media/font/smb2.png b/data/font/smb2.png similarity index 100% rename from media/font/smb2.png rename to data/font/smb2.png diff --git a/media/font/smb2.txt b/data/font/smb2.txt similarity index 100% rename from media/font/smb2.txt rename to data/font/smb2.txt diff --git a/media/font/smb2_big.png b/data/font/smb2_big.png similarity index 100% rename from media/font/smb2_big.png rename to data/font/smb2_big.png diff --git a/media/font/smb2_big.txt b/data/font/smb2_big.txt similarity index 100% rename from media/font/smb2_big.txt rename to data/font/smb2_big.txt diff --git a/media/gfx/balloon.png b/data/gfx/balloon.png similarity index 100% rename from media/gfx/balloon.png rename to data/gfx/balloon.png diff --git a/media/gfx/bullet.png b/data/gfx/bullet.png similarity index 100% rename from media/gfx/bullet.png rename to data/gfx/bullet.png diff --git a/media/gfx/game_bg.png b/data/gfx/game_bg.png similarity index 100% rename from media/gfx/game_bg.png rename to data/gfx/game_bg.png diff --git a/media/gfx/game_text.png b/data/gfx/game_text.png similarity index 100% rename from media/gfx/game_text.png rename to data/gfx/game_text.png diff --git a/media/gfx/intro.png b/data/gfx/intro.png similarity index 100% rename from media/gfx/intro.png rename to data/gfx/intro.png diff --git a/media/gfx/items.png b/data/gfx/items.png similarity index 100% rename from media/gfx/items.png rename to data/gfx/items.png diff --git a/media/gfx/logo.png b/data/gfx/logo.png similarity index 100% rename from media/gfx/logo.png rename to data/gfx/logo.png diff --git a/media/gfx/player1_body.png b/data/gfx/player1_body.png similarity index 100% rename from media/gfx/player1_body.png rename to data/gfx/player1_body.png diff --git a/media/gfx/player1_death.png b/data/gfx/player1_death.png similarity index 100% rename from media/gfx/player1_death.png rename to data/gfx/player1_death.png diff --git a/media/gfx/player1_head.png b/data/gfx/player1_head.png similarity index 100% rename from media/gfx/player1_head.png rename to data/gfx/player1_head.png diff --git a/media/gfx/player1_legs.png b/data/gfx/player1_legs.png similarity index 100% rename from media/gfx/player1_legs.png rename to data/gfx/player1_legs.png diff --git a/media/gfx/player2_body.png b/data/gfx/player2_body.png similarity index 100% rename from media/gfx/player2_body.png rename to data/gfx/player2_body.png diff --git a/media/gfx/player2_death.png b/data/gfx/player2_death.png similarity index 100% rename from media/gfx/player2_death.png rename to data/gfx/player2_death.png diff --git a/media/gfx/player2_head.png b/data/gfx/player2_head.png similarity index 100% rename from media/gfx/player2_head.png rename to data/gfx/player2_head.png diff --git a/media/gfx/player2_legs.png b/data/gfx/player2_legs.png similarity index 100% rename from media/gfx/player2_legs.png rename to data/gfx/player2_legs.png diff --git a/media/gfx/title.png b/data/gfx/title.png similarity index 100% rename from media/gfx/title.png rename to data/gfx/title.png diff --git a/media/lang/ba_BA.txt b/data/lang/ba_BA.txt similarity index 100% rename from media/lang/ba_BA.txt rename to data/lang/ba_BA.txt diff --git a/media/lang/en_UK.txt b/data/lang/en_UK.txt similarity index 100% rename from media/lang/en_UK.txt rename to data/lang/en_UK.txt diff --git a/media/lang/es_ES.txt b/data/lang/es_ES.txt similarity index 100% rename from media/lang/es_ES.txt rename to data/lang/es_ES.txt diff --git a/media/music/intro.ogg b/data/music/intro.ogg similarity index 100% rename from media/music/intro.ogg rename to data/music/intro.ogg diff --git a/media/music/playing.ogg b/data/music/playing.ogg similarity index 100% rename from media/music/playing.ogg rename to data/music/playing.ogg diff --git a/media/music/title.ogg b/data/music/title.ogg similarity index 100% rename from media/music/title.ogg rename to data/music/title.ogg diff --git a/media/sound/balloon.wav b/data/sound/balloon.wav similarity index 100% rename from media/sound/balloon.wav rename to data/sound/balloon.wav diff --git a/media/sound/bubble1.wav b/data/sound/bubble1.wav similarity index 100% rename from media/sound/bubble1.wav rename to data/sound/bubble1.wav diff --git a/media/sound/bubble2.wav b/data/sound/bubble2.wav similarity index 100% rename from media/sound/bubble2.wav rename to data/sound/bubble2.wav diff --git a/media/sound/bubble3.wav b/data/sound/bubble3.wav similarity index 100% rename from media/sound/bubble3.wav rename to data/sound/bubble3.wav diff --git a/media/sound/bubble4.wav b/data/sound/bubble4.wav similarity index 100% rename from media/sound/bubble4.wav rename to data/sound/bubble4.wav diff --git a/media/sound/bullet.wav b/data/sound/bullet.wav similarity index 100% rename from media/sound/bullet.wav rename to data/sound/bullet.wav diff --git a/media/sound/clock.wav b/data/sound/clock.wav similarity index 100% rename from media/sound/clock.wav rename to data/sound/clock.wav diff --git a/media/sound/coffeeout.wav b/data/sound/coffeeout.wav similarity index 100% rename from media/sound/coffeeout.wav rename to data/sound/coffeeout.wav diff --git a/media/sound/hiscore.wav b/data/sound/hiscore.wav similarity index 100% rename from media/sound/hiscore.wav rename to data/sound/hiscore.wav diff --git a/media/sound/itemdrop.wav b/data/sound/itemdrop.wav similarity index 100% rename from media/sound/itemdrop.wav rename to data/sound/itemdrop.wav diff --git a/media/sound/itempickup.wav b/data/sound/itempickup.wav similarity index 100% rename from media/sound/itempickup.wav rename to data/sound/itempickup.wav diff --git a/media/sound/menu_cancel.wav b/data/sound/menu_cancel.wav similarity index 100% rename from media/sound/menu_cancel.wav rename to data/sound/menu_cancel.wav diff --git a/media/sound/menu_move.wav b/data/sound/menu_move.wav similarity index 100% rename from media/sound/menu_move.wav rename to data/sound/menu_move.wav diff --git a/media/sound/menu_select.wav b/data/sound/menu_select.wav similarity index 100% rename from media/sound/menu_select.wav rename to data/sound/menu_select.wav diff --git a/media/sound/player_collision.wav b/data/sound/player_collision.wav similarity index 100% rename from media/sound/player_collision.wav rename to data/sound/player_collision.wav diff --git a/media/sound/powerball.wav b/data/sound/powerball.wav similarity index 100% rename from media/sound/powerball.wav rename to data/sound/powerball.wav diff --git a/media/sound/stage_change.wav b/data/sound/stage_change.wav similarity index 100% rename from media/sound/stage_change.wav rename to data/sound/stage_change.wav diff --git a/media/sound/title.wav b/data/sound/title.wav similarity index 100% rename from media/sound/title.wav rename to data/sound/title.wav diff --git a/media/sound/tnt.wav b/data/sound/tnt.wav similarity index 100% rename from media/sound/tnt.wav rename to data/sound/tnt.wav diff --git a/source/balloon.cpp b/source/balloon.cpp index b00564a..f8c76a5 100644 --- a/source/balloon.cpp +++ b/source/balloon.cpp @@ -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) { diff --git a/source/balloon.h b/source/balloon.h index d46fb8e..30246cb 100644 --- a/source/balloon.h +++ b/source/balloon.h @@ -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); diff --git a/source/director.cpp b/source/director.cpp index d90f9c0..ec1d032 100644 --- a/source/director.cpp +++ b/source/director.cpp @@ -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(); } diff --git a/source/game.cpp b/source/game.cpp index f5fb2f3..72eff4c 100644 --- a/source/game.cpp +++ b/source/game.cpp @@ -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,7 +288,9 @@ 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' @@ -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,62 +2171,67 @@ 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 (mItem[i]->isEnabled()) - { - if (checkCollision(mPlayer[index]->getCollider(), mItem[i]->getCollider())) - { - switch (mItem[i]->getClass()) - { - case ITEM_POINTS_1_DISK: - mPlayer[index]->addScore(1000); - updateHiScore(); - createItemScoreSprite(mItem[i]->getPosX() + (mItem[i]->getWidth() / 2) - (m1000Bitmap->getWidth() / 2), mPlayer[index]->getPosY(), m1000Bitmap); - JA_PlaySound(mSoundItemPickup); - break; - case ITEM_POINTS_2_GAVINA: - mPlayer[index]->addScore(2500); - updateHiScore(); - createItemScoreSprite(mItem[i]->getPosX() + (mItem[i]->getWidth() / 2) - (m2500Bitmap->getWidth() / 2), mPlayer[index]->getPosY(), m2500Bitmap); - JA_PlaySound(mSoundItemPickup); - break; - case ITEM_POINTS_3_PACMAR: - mPlayer[index]->addScore(5000); - updateHiScore(); - createItemScoreSprite(mItem[i]->getPosX() + (mItem[i]->getWidth() / 2) - (m5000Bitmap->getWidth() / 2), mPlayer[index]->getPosY(), m5000Bitmap); - JA_PlaySound(mSoundItemPickup); - break; - case ITEM_CLOCK: - enableTimeStopItem(); - JA_PlaySound(mSoundItemPickup); - break; - case ITEM_COFFEE: - if (mPlayer[index]->getCoffees() == 2) - { - mPlayer[index]->addScore(5000); - updateHiScore(); - createItemScoreSprite(mItem[i]->getPosX() + (mItem[i]->getWidth() / 2) - (m5000Bitmap->getWidth() / 2), mPlayer[index]->getPosY(), m5000Bitmap); - } - mPlayer[index]->giveExtraHit(); - JA_PlaySound(mSoundItemPickup); - break; - case ITEM_COFFEE_MACHINE: - mPlayer[index]->setPowerUp(true); - JA_PlaySound(mSoundItemPickup); - mCoffeeMachineEnabled = false; - break; + if (!player->isAlive()) + { + return; + } - default: - break; + for (auto item : items) + // for (int i = 0; i < MAX_ITEMS; i++) + { + if (item->isEnabled()) + { + if (checkCollision(player->getCollider(), item->getCollider())) + { + switch (item->getClass()) + { + case ITEM_POINTS_1_DISK: + player->addScore(1000); + updateHiScore(); + createItemScoreSprite(item->getPosX() + (item->getWidth() / 2) - (m1000Bitmap->getWidth() / 2), player->getPosY(), m1000Bitmap); + JA_PlaySound(mSoundItemPickup); + break; + case ITEM_POINTS_2_GAVINA: + player->addScore(2500); + updateHiScore(); + createItemScoreSprite(item->getPosX() + (item->getWidth() / 2) - (m2500Bitmap->getWidth() / 2), player->getPosY(), m2500Bitmap); + JA_PlaySound(mSoundItemPickup); + break; + case ITEM_POINTS_3_PACMAR: + player->addScore(5000); + updateHiScore(); + createItemScoreSprite(item->getPosX() + (item->getWidth() / 2) - (m5000Bitmap->getWidth() / 2), player->getPosY(), m5000Bitmap); + JA_PlaySound(mSoundItemPickup); + break; + case ITEM_CLOCK: + enableTimeStopItem(); + JA_PlaySound(mSoundItemPickup); + break; + case ITEM_COFFEE: + if (player->getCoffees() == 2) + { + player->addScore(5000); + updateHiScore(); + createItemScoreSprite(item->getPosX() + (item->getWidth() / 2) - (m5000Bitmap->getWidth() / 2), player->getPosY(), m5000Bitmap); } - mItem[i]->erase(); + player->giveExtraHit(); + JA_PlaySound(mSoundItemPickup); + break; + case ITEM_COFFEE_MACHINE: + player->setPowerUp(true); + JA_PlaySound(mSoundItemPickup); + mCoffeeMachineEnabled = false; + break; + + default: + break; } + item->erase(); } } + } } // Comprueba y procesa la colisión entre las balas y los globos @@ -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()) { diff --git a/source/game.h b/source/game.h index 436ad6e..ec06ff6 100644 --- a/source/game.h +++ b/source/game.h @@ -132,29 +132,34 @@ 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 + Input *mInput; // Manejador de entrada - int mNumPlayers; // Numero de jugadores - Player *mPlayer[2]; // Vector con los jugadores jugador - Input *mInput; // Manejador de entrada + // 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 - 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 players; // Vector con los jugadores + std::vector balloons; // Vector con los globos + std::vector bullets; // Vector con las balas + std::vector items; // Vector con los items + std::vector smartSprites; // Vector con los smartsprites - LTexture *mTextureBalloon; // Textura para los enemigos - LTexture *mTextureBullet; // Textura para las balas - LTexture *mTextureGameBG; // Textura para el fondo del juego - LTexture *mTextureGameText; // Textura para los sprites con textos - LTexture *mTextureItems; // Textura para los items - LTexture *mTexturePlayer1Head; // Textura para la cabeza del jugador1 - LTexture *mTexturePlayer1Body; // Textura para el cuerpo del jugador1 - LTexture *mTexturePlayer1Death; // Textura para la animación de muerte del jugador1 - LTexture *mTexturePlayer1Legs; // Textura para las piernas del jugador - LTexture *mTexturePlayer2Head; // Textura para la cabeza del jugador2 - LTexture *mTexturePlayer2Body; // Textura para el cuerpo del jugador2 - LTexture *mTexturePlayer2Death; // Textura para la animación de muerte del jugador2 - LTexture *mTexturePlayer2Legs; // Textura para las piernas del jugador + LTexture *mTextureBalloon; // Textura para los enemigos + LTexture *mTextureBullet; // Textura para las balas + LTexture *mTextureGameBG; // Textura para el fondo del juego + LTexture *mTextureGameText; // Textura para los sprites con textos + LTexture *mTextureItems; // Textura para los items + LTexture *mTexturePlayer1Head; // Textura para la cabeza del jugador1 + LTexture *mTexturePlayer1Body; // Textura para el cuerpo del jugador1 + LTexture *mTexturePlayer1Death; // Textura para la animación de muerte del jugador1 + LTexture *mTexturePlayer1Legs; // Textura para las piernas del jugador + LTexture *mTexturePlayer2Head; // Textura para la cabeza del jugador2 + LTexture *mTexturePlayer2Body; // Textura para el cuerpo del jugador2 + LTexture *mTexturePlayer2Death; // Textura para la animación de muerte del jugador2 + LTexture *mTexturePlayer2Legs; // Textura para las piernas del jugador Text *mText; // Fuente para los textos del juego Text *mTextBig; // Fuente de texto grande @@ -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(); diff --git a/source/instructions.cpp b/source/instructions.cpp index 254b8b7..d7b848d 100644 --- a/source/instructions.cpp +++ b/source/instructions.cpp @@ -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; diff --git a/source/instructions.h b/source/instructions.h index 22116ae..d76942f 100644 --- a/source/instructions.h +++ b/source/instructions.h @@ -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(); diff --git a/source/intro.cpp b/source/intro.cpp index e2a333c..ece060c 100644 --- a/source/intro.cpp +++ b/source/intro.cpp @@ -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++) @@ -45,7 +45,7 @@ Intro::~Intro() delete mBitmap[i]; mBitmap[i] = nullptr; } - + for (int i = 0; i < INTRO_TOTAL_TEXTS; i++) { delete mWriter[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()); diff --git a/source/item.cpp b/source/item.cpp index f311c1f..173c598 100644 --- a/source/item.cpp +++ b/source/item.cpp @@ -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) { @@ -195,7 +199,7 @@ void Item::move() // Pone a cero todos los valores del objeto void Item::erase() { - //init(NO_KIND, 0, 0, nullptr, nullptr); + // init(NO_KIND, 0, 0, nullptr, nullptr); } // Actualiza el objeto a su posicion, animación y controla los contadores @@ -205,7 +209,7 @@ void Item::update() { move(); shiftColliders(); - mSprite->animate(0); + mSprite->animate(); updateTimeToLive(); checkTimeToLive(); } diff --git a/source/item.h b/source/item.h index 5c1e566..d7c9eaf 100644 --- a/source/item.h +++ b/source/item.h @@ -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); diff --git a/source/menu.cpp b/source/menu.cpp index a3e2420..535578b 100644 --- a/source/menu.cpp +++ b/source/menu.cpp @@ -906,4 +906,13 @@ void Menu::setPos(int x, int y) 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); + } } \ No newline at end of file diff --git a/source/menu.h b/source/menu.h index a90cfa4..08ded19 100644 --- a/source/menu.h +++ b/source/menu.h @@ -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 diff --git a/source/player.cpp b/source/player.cpp index ce6e65b..eb8f7bf 100644 --- a/source/player.cpp +++ b/source/player.cpp @@ -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); diff --git a/source/player.h b/source/player.h index 733c503..8a249af 100644 --- a/source/player.h +++ b/source/player.h @@ -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); diff --git a/source/smartsprite.cpp b/source/smartsprite.cpp index 28d253d..13f922f 100644 --- a/source/smartsprite.cpp +++ b/source/smartsprite.cpp @@ -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() { diff --git a/source/smartsprite.h b/source/smartsprite.h index 09a4b85..cf4d740 100644 --- a/source/smartsprite.h +++ b/source/smartsprite.h @@ -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(); diff --git a/source/title.cpp b/source/title.cpp index 2586087..eb6150f 100644 --- a/source/title.cpp +++ b/source/title.cpp @@ -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());