Actualizando el código

This commit is contained in:
2022-09-27 13:06:04 +02:00
parent c8bebfd2d9
commit 8d56912765
13 changed files with 291 additions and 451 deletions

View File

@@ -151,6 +151,12 @@ SDL_Rect AnimatedSprite::getAnimationClip(std::string name, Uint8 index)
return animation[getIndex(name)].frames[index]; return animation[getIndex(name)].frames[index];
} }
// Devuelve el rectangulo de una animación y frame concreto
SDL_Rect AnimatedSprite::getAnimationClip(int indexA, Uint8 indexF)
{
return animation[indexA].frames[indexF];
}
// Carga la animación desde un fichero // Carga la animación desde un fichero
bool AnimatedSprite::load(std::string filePath) bool AnimatedSprite::load(std::string filePath)
{ {

View File

@@ -60,6 +60,7 @@ public:
// Devuelve el rectangulo de una animación y frame concreto // Devuelve el rectangulo de una animación y frame concreto
SDL_Rect getAnimationClip(std::string name, Uint8 index); SDL_Rect getAnimationClip(std::string name, Uint8 index);
SDL_Rect getAnimationClip(int indexA, Uint8 indexF);
// Obtiene el indice de la animación a partir del nombre // Obtiene el indice de la animación a partir del nombre
int getIndex(std::string name); int getIndex(std::string name);

View File

@@ -2,22 +2,10 @@
#include "bullet.h" #include "bullet.h"
// Constructor // Constructor
Bullet::Bullet() Bullet::Bullet(int x, int y, int kind, bool poweredUp, int owner, LTexture *texture, SDL_Renderer *renderer)
{ {
mSprite = new Sprite(); mSprite = new Sprite({x,y,10,10},texture, renderer);
mKind = NO_KIND;
}
// Destructor
Bullet::~Bullet()
{
delete mSprite;
mSprite = nullptr;
}
// Iniciador
void Bullet::init(int x, int y, int kind, bool poweredUp, int owner, LTexture *texture, SDL_Renderer *renderer)
{
// Posición inicial del objeto // Posición inicial del objeto
mPosX = x; mPosX = x;
mPosY = y; mPosY = y;
@@ -35,20 +23,6 @@ void Bullet::init(int x, int y, int kind, bool poweredUp, int owner, LTexture *t
// Identificador del dueño del objeto // Identificador del dueño del objeto
mOwner = owner; mOwner = owner;
// Textura con los gráficos del objeto
mSprite->setTexture(texture);
// Renderizador
mSprite->setRenderer(renderer);
// Alto y ancho del sprite
mSprite->setWidth(mWidth);
mSprite->setHeight(mHeight);
// Posición inicial del sprite
mSprite->setPosX(mPosX);
mSprite->setPosY(mPosY);
// Valores especificos según el tipo // Valores especificos según el tipo
switch (kind) switch (kind)
{ {
@@ -96,6 +70,13 @@ void Bullet::init(int x, int y, int kind, bool poweredUp, int owner, LTexture *t
shiftColliders(); shiftColliders();
} }
// Destructor
Bullet::~Bullet()
{
delete mSprite;
mSprite = nullptr;
}
// Pinta el objeto en pantalla // Pinta el objeto en pantalla
void Bullet::render() void Bullet::render()
{ {
@@ -144,12 +125,6 @@ Uint8 Bullet::move()
return msg; return msg;
} }
// Deshabilita el objeto
void Bullet::erase()
{
init(0, 0, 0, false, -1, nullptr, nullptr);
}
// Comprueba si el objeto está activo // Comprueba si el objeto está activo
bool Bullet::isActive() bool Bullet::isActive()
{ {

View File

@@ -36,23 +36,17 @@ private:
public: public:
// Constructor // Constructor
Bullet(); Bullet(int x, int y, int kind, bool poweredUp, int owner, LTexture *texture, SDL_Renderer *renderer);
// Destructor // Destructor
~Bullet(); ~Bullet();
// Iniciador
void init(int x, int y, int kind, bool poweredUp, int owner, LTexture *texture, SDL_Renderer *renderer);
// Pinta el objeto en pantalla // Pinta el objeto en pantalla
void render(); void render();
// Actualiza la posición y estado del objeto // Actualiza la posición y estado del objeto
Uint8 move(); Uint8 move();
// Deshabilita el objeto
void erase();
// Comprueba si el objeto está activo // Comprueba si el objeto está activo
bool isActive(); bool isActive();

View File

@@ -38,30 +38,6 @@ Game::Game(int numPlayers, int currentStage, SDL_Renderer *renderer, Screen *scr
players.push_back(player1); players.push_back(player1);
players.push_back(player2); players.push_back(player2);
} }
/*for (int i = 0; i < mNumPlayers; i++)
{
mPlayer[i] = new Player();
}
for (int i = 0; i < MAX_BALLOONS; i++)
{
mBalloon[i] = new Balloon();
}
for (int i = 0; i < MAX_BULLETS; i++)
{
mBullet[i] = new Bullet();
}
for (int i = 0; i < MAX_ITEMS; i++)
{
mItem[i] = new Item(mTextureItems, mRenderer);
}
for (int i = 0; i < MAX_SMART_SPRITES; i++)
{
mSmartSprite[i] = new SmartSprite(nullptr, mRenderer);
}*/
mTextureBalloon = new LTexture(mRenderer, mAsset->get("balloon.png")); mTextureBalloon = new LTexture(mRenderer, mAsset->get("balloon.png"));
mTextureBullet = new LTexture(mRenderer, mAsset->get("bullet.png")); mTextureBullet = new LTexture(mRenderer, mAsset->get("bullet.png"));
@@ -126,7 +102,7 @@ Game::~Game()
delete player; delete player;
}; };
for (auto ballon : ballons) for (auto ballon : balloons)
{ {
delete ballon; delete ballon;
}; };
@@ -441,26 +417,13 @@ void Game::init()
mSpriteScoreBoard->setSpriteClip(0, 160, 256, 32); mSpriteScoreBoard->setSpriteClip(0, 160, 256, 32);
mSpritePowerMeter->setSpriteClip(256, 192 - 8, 40, 8); mSpritePowerMeter->setSpriteClip(256, 192 - 8, 40, 8);
// Establece a cero todos los valores del vector de objetos globo
resetBalloons();
// Con los globos creados, calcula el nivel de amenaza // Con los globos creados, calcula el nivel de amenaza
evaluateAndSetMenace(); evaluateAndSetMenace();
// Establece a cero todos los valores del vector de objetos bala
resetBullets();
// Establece a cero todos los valores del vector de objetos item
resetItems();
// Establece a cero todos los valores del vector de objetos SmafrtSprite
resetSmartSprites();
// Inicializa el bitmap de GetReady! // Inicializa el bitmap de GetReady!
mSpriteGetReady->setSpriteClip(0, 0, 109, 20); mSpriteGetReady->setSpriteClip(0, 0, 109, 20);
// Inicializa el bitmap de 1000 puntos // Inicializa el bitmap de 1000 puntos
m1000Bitmap->init();
m1000Bitmap->setPosX(0); m1000Bitmap->setPosX(0);
m1000Bitmap->setPosY(0); m1000Bitmap->setPosY(0);
m1000Bitmap->setWidth(26); m1000Bitmap->setWidth(26);
@@ -476,7 +439,6 @@ void Game::init()
m1000Bitmap->setDestY(0); m1000Bitmap->setDestY(0);
// Inicializa el bitmap de 2500 puntos // Inicializa el bitmap de 2500 puntos
m2500Bitmap->init();
m2500Bitmap->setPosX(0); m2500Bitmap->setPosX(0);
m2500Bitmap->setPosY(0); m2500Bitmap->setPosY(0);
m2500Bitmap->setWidth(28); m2500Bitmap->setWidth(28);
@@ -492,7 +454,6 @@ void Game::init()
m2500Bitmap->setDestY(0); m2500Bitmap->setDestY(0);
// Inicializa el bitmap de 5000 puntos // Inicializa el bitmap de 5000 puntos
m5000Bitmap->init();
m5000Bitmap->setPosX(0); m5000Bitmap->setPosX(0);
m5000Bitmap->setPosY(0); m5000Bitmap->setPosY(0);
m5000Bitmap->setWidth(28); m5000Bitmap->setWidth(28);
@@ -1820,19 +1781,17 @@ void Game::renderDeathFade(int counter)
void Game::updateBalloons() void Game::updateBalloons()
{ {
for (auto balloon : balloons) for (auto balloon : balloons)
// for (int i = 0; i < MAX_BALLOONS; i++) {
balloon->update(); balloon->update();
} }
}
// Pinta en pantalla todos los globos activos // Pinta en pantalla todos los globos activos
void Game::renderBalloons() void Game::renderBalloons()
{ {
for (auto balloon : balloons) for (auto balloon : balloons)
// for (int i = 0; i < MAX_BALLOONS; i++)
{ {
balloon->render(); balloon->render();
if ((mDebug.enabled) && (balloon->isPopping() == false))
mText->writeCentered(balloon->getPosX() + (balloon->getWidth() / 2), balloon->getPosY() - 8, std::to_string(i));
} }
} }
@@ -1863,16 +1822,6 @@ void Game::createPowerBall()
mPowerBallCounter = POWERBALL_COUNTER; mPowerBallCounter = POWERBALL_COUNTER;
} }
// Establece a cero todos los valores del vector de objetos globo
void Game::resetBalloons()
{
for (auto balloon : balloons)
// for (int i = 0; i < MAX_BALLOONS; i++)
{
balloon->disable();
}
}
// Establece la velocidad de los globos // Establece la velocidad de los globos
void Game::setBalloonSpeed(float speed) void Game::setBalloonSpeed(float speed)
{ {
@@ -1969,17 +1918,17 @@ void Game::popBalloon(Balloon *balloon)
increaseStageCurrentPower(1); increaseStageCurrentPower(1);
mBalloonsPopped++; mBalloonsPopped++;
const Uint8 kind = mBalloon[index]->getKind(); const Uint8 kind = balloon->getKind();
Uint8 freeIndex = 0; Uint8 freeIndex = 0;
switch (kind) switch (kind)
{ {
// Si es del tipo más pequeño, simplemente elimina el globo // Si es del tipo más pequeño, simplemente elimina el globo
case BALLOON_1: case BALLOON_1:
mBalloon[index]->pop(); balloon->pop();
break; break;
case HEXAGON_1: case HEXAGON_1:
mBalloon[index]->pop(); balloon->pop();
break; break;
// Si es del tipo PowerBall, destruye todos los globos // Si es del tipo PowerBall, destruye todos los globos
@@ -1991,32 +1940,32 @@ void Game::popBalloon(Balloon *balloon)
// En cualquier otro caso, crea dos globos de un tipo inferior // En cualquier otro caso, crea dos globos de un tipo inferior
default: default:
freeIndex = getBalloonFreeIndex(); Balloon *b1 = new Balloon(0, balloon->getPosY(), balloon->getKind() - 1, BALLOON_VELX_NEGATIVE, mEnemySpeed, 0, mTextureBalloon, mRenderer);
mBalloon[freeIndex]->init(0, mBalloon[index]->getPosY(), mBalloon[index]->getKind() - 1, BALLOON_VELX_NEGATIVE, mEnemySpeed, 0, mTextureBalloon, mRenderer); balloons.push_back(b1);
mBalloon[freeIndex]->allignTo(mBalloon[index]->getPosX() + (mBalloon[index]->getWidth() / 2)); b1->allignTo(balloon->getPosX() + (balloon->getWidth() / 2));
if (mBalloon[freeIndex]->getClass() == BALLOON_CLASS) if (b1->getClass() == BALLOON_CLASS)
{ {
mBalloon[freeIndex]->setVelY(-2.50f); b1->setVelY(-2.50f);
} }
else if (mBalloon[freeIndex]->getClass() == HEXAGON_CLASS) else if (b1->getClass() == HEXAGON_CLASS)
{ {
mBalloon[freeIndex]->setVelY(BALLOON_VELX_NEGATIVE); b1->setVelY(BALLOON_VELX_NEGATIVE);
} }
freeIndex = getBalloonFreeIndex(); Balloon *b2 = new Balloon(0, balloon->getPosY(), balloon->getKind() - 1, BALLOON_VELX_POSITIVE, mEnemySpeed, 0, mTextureBalloon, mRenderer);
mBalloon[freeIndex]->init(0, mBalloon[index]->getPosY(), mBalloon[index]->getKind() - 1, BALLOON_VELX_POSITIVE, mEnemySpeed, 0, mTextureBalloon, mRenderer); balloons.push_back(b2);
mBalloon[freeIndex]->allignTo(mBalloon[index]->getPosX() + (mBalloon[index]->getWidth() / 2)); b2->allignTo(balloon->getPosX() + (balloon->getWidth() / 2));
if (mBalloon[freeIndex]->getClass() == BALLOON_CLASS) if (b2->getClass() == BALLOON_CLASS)
{ {
mBalloon[freeIndex]->setVelY(-2.50f); b2->setVelY(-2.50f);
} }
else if (mBalloon[freeIndex]->getClass() == HEXAGON_CLASS) else if (b2->getClass() == HEXAGON_CLASS)
{ {
mBalloon[freeIndex]->setVelY(BALLOON_VELX_NEGATIVE); b2->setVelY(BALLOON_VELX_NEGATIVE);
} }
// Elimina el globo // Elimina el globo
mBalloon[index]->pop(); balloon->pop();
break; break;
} }
@@ -2025,13 +1974,13 @@ void Game::popBalloon(Balloon *balloon)
} }
// Explosiona un globo. Lo destruye // Explosiona un globo. Lo destruye
void Game::destroyBalloon(Uint8 index) void Game::destroyBalloon(Balloon *balloon)
{ {
int score = 0; int score = 0;
Uint8 power = 0; Uint8 power = 0;
// Calcula la puntuación y el poder que generaria el globo en caso de romperlo a él y a sus hijos // Calcula la puntuación y el poder que generaria el globo en caso de romperlo a él y a sus hijos
switch (mBalloon[index]->getSize()) switch (balloon->getSize())
{ {
case BALLOON_SIZE_4: case BALLOON_SIZE_4:
score = BALLOON_SCORE_4 + (2 * BALLOON_SCORE_3) + (4 * BALLOON_SCORE_2) + (8 * BALLOON_SCORE_1); score = BALLOON_SCORE_4 + (2 * BALLOON_SCORE_3) + (4 * BALLOON_SCORE_2) + (8 * BALLOON_SCORE_1);
@@ -2060,9 +2009,9 @@ void Game::destroyBalloon(Uint8 index)
} }
// Otorga los puntos correspondientes al globo // Otorga los puntos correspondientes al globo
for (int i = 0; i < mNumPlayers; i++) for (auto player : players)
{ {
mPlayer[i]->addScore(Uint32(score * mPlayer[i]->getScoreMultiplier() * mDifficultyScoreMultiplier)); player->addScore(Uint32(score * player->getScoreMultiplier() * mDifficultyScoreMultiplier));
} }
updateHiScore(); updateHiScore();
@@ -2071,7 +2020,7 @@ void Game::destroyBalloon(Uint8 index)
mBalloonsPopped += power; mBalloonsPopped += power;
// Destruye el globo // Destruye el globo
mBalloon[index]->pop(); balloon->pop();
// Recalcula el nivel de amenaza // Recalcula el nivel de amenaza
evaluateAndSetMenace(); evaluateAndSetMenace();
@@ -2080,11 +2029,11 @@ void Game::destroyBalloon(Uint8 index)
// Explosiona todos los globos // Explosiona todos los globos
void Game::popAllBalloons() void Game::popAllBalloons()
{ {
for (int i = 0; i < MAX_BALLOONS; i++) for (auto balloon : balloons)
{ {
if ((mBalloon[i]->isEnabled()) && (!mBalloon[i]->isPopping()) && (!mBalloon[i]->isBeingCreated())) if ((balloon->isEnabled()) && (!balloon->isPopping()) && (!balloon->isBeingCreated()))
{ {
popBalloon(i); popBalloon(balloon);
} }
} }
@@ -2094,11 +2043,11 @@ void Game::popAllBalloons()
// Destruye todos los globos // Destruye todos los globos
void Game::destroyAllBalloons() void Game::destroyAllBalloons()
{ {
for (int i = 0; i < MAX_BALLOONS; i++) for (auto balloon : balloons)
{ {
if ((mBalloon[i]->isEnabled()) && (!mBalloon[i]->isPopping())) if ((balloon->isEnabled()) && (!balloon->isPopping()))
{ {
destroyBalloon(i); destroyBalloon(balloon);
} }
} }
@@ -2111,12 +2060,12 @@ void Game::destroyAllBalloons()
// Detiene todos los globos // Detiene todos los globos
void Game::stopAllBalloons(Uint16 time) void Game::stopAllBalloons(Uint16 time)
{ {
for (int i = 0; i < MAX_BALLOONS; i++) for (auto balloon : balloons)
{ {
if (mBalloon[i]->isEnabled()) if (balloon->isEnabled())
{ {
mBalloon[i]->setStop(true); balloon->setStop(true);
mBalloon[i]->setStoppedTimer(time); balloon->setStoppedTimer(time);
} }
} }
} }
@@ -2124,12 +2073,12 @@ void Game::stopAllBalloons(Uint16 time)
// Pone en marcha todos los globos // Pone en marcha todos los globos
void Game::startAllBalloons() void Game::startAllBalloons()
{ {
for (int i = 0; i < MAX_BALLOONS; i++) for (auto balloon : balloons)
{ {
if ((mBalloon[i]->isEnabled()) && (!mBalloon[i]->isBeingCreated())) if ((balloon->isEnabled()) && (!balloon->isBeingCreated()))
{ {
mBalloon[i]->setStop(false); balloon->setStop(false);
mBalloon[i]->setStoppedTimer(0); balloon->setStoppedTimer(0);
} }
} }
} }
@@ -2139,11 +2088,11 @@ Uint8 Game::countBalloons()
{ {
Uint8 num = 0; Uint8 num = 0;
for (int i = 0; i < MAX_BALLOONS; i++) for (auto balloon : balloons)
{ {
if (mBalloon[i]->isEnabled()) if (balloon->isEnabled())
{ {
if (!mBalloon[i]->isPopping()) if (!balloon->isPopping())
{ {
num++; num++;
} }
@@ -2154,13 +2103,13 @@ Uint8 Game::countBalloons()
} }
// Comprueba la colisión entre el jugador y los globos activos // Comprueba la colisión entre el jugador y los globos activos
bool Game::checkPlayerBalloonCollision(int index) bool Game::checkPlayerBalloonCollision(Player *player)
{ {
for (int i = 0; i < MAX_BALLOONS; i++) for (auto balloon : balloons)
{ {
if ((mBalloon[i]->isEnabled()) && !(mBalloon[i]->isStopped()) && !(mBalloon[i]->isInvulnerable())) if ((balloon->isEnabled()) && !(balloon->isStopped()) && !(balloon->isInvulnerable()))
{ {
if (checkCollision(mPlayer[index]->getCollider(), mBalloon[i]->getCollider())) if (checkCollision(player->getCollider(), balloon->getCollider()))
{ {
return true; return true;
} }
@@ -2237,22 +2186,22 @@ void Game::checkPlayerItemCollision(Player *player)
// Comprueba y procesa la colisión entre las balas y los globos // Comprueba y procesa la colisión entre las balas y los globos
void Game::checkBulletBalloonCollision() void Game::checkBulletBalloonCollision()
{ {
for (int i = 0; i < MAX_BALLOONS; i++) for (auto balloon : balloons)
{ {
for (int j = 0; j < MAX_BULLETS; j++) for (auto bullet : bullets)
{ {
if (mBalloon[i]->isEnabled() && (!mBalloon[i]->isInvulnerable()) && mBullet[j]->isActive()) if (balloon->isEnabled() && (!balloon->isInvulnerable()) && bullet->isActive())
{ {
if (checkCollision(mBalloon[i]->getCollider(), mBullet[j]->getCollider())) if (checkCollision(balloon->getCollider(), bullet->getCollider()))
{ {
// Otorga los puntos correspondientes al globo al jugador que disparó la bala // Otorga los puntos correspondientes al globo al jugador que disparó la bala
int index = mBullet[j]->getOwner(); int index = bullet->getOwner();
mPlayer[index]->incScoreMultiplier(); players[index]->incScoreMultiplier();
mPlayer[index]->addScore(Uint32(mBalloon[i]->getScore() * mPlayer[index]->getScoreMultiplier() * mDifficultyScoreMultiplier)); players[index]->addScore(Uint32(balloon->getScore() * players[index]->getScoreMultiplier() * mDifficultyScoreMultiplier));
updateHiScore(); updateHiScore();
// Explota el globo // Explota el globo
popBalloon(i); popBalloon(balloon);
// Si no es el modo demo, genera un sonido // Si no es el modo demo, genera un sonido
if (!mDemo.enabled) if (!mDemo.enabled)
@@ -2261,7 +2210,7 @@ void Game::checkBulletBalloonCollision()
} }
// Destruye la bala // Destruye la bala
mBullet[j]->erase(); delete bullet;
// Suelta el item en caso de que salga uno // Suelta el item en caso de que salga uno
const Uint8 droppeditem = dropItem(); const Uint8 droppeditem = dropItem();
@@ -2269,12 +2218,12 @@ void Game::checkBulletBalloonCollision()
{ {
if (droppeditem != ITEM_COFFEE_MACHINE) if (droppeditem != ITEM_COFFEE_MACHINE)
{ {
createItem(mBalloon[i]->getPosX(), mBalloon[i]->getPosY(), droppeditem); createItem(mTextureItems, mRenderer, balloon->getPosX(), balloon->getPosY(), droppeditem);
JA_PlaySound(mSoundItemDrop); JA_PlaySound(mSoundItemDrop);
} }
else else
{ {
createItem(mPlayer[index]->getPosX(), 0, droppeditem); createItem(mTextureItems, mRenderer, players[index]->getPosX(), 0, droppeditem);
mCoffeeMachineEnabled = true; mCoffeeMachineEnabled = true;
} }
} }
@@ -2288,13 +2237,13 @@ void Game::checkBulletBalloonCollision()
// Mueve las balas activas // Mueve las balas activas
void Game::moveBullets() void Game::moveBullets()
{ {
for (int i = 0; i < MAX_BULLETS; i++) for (auto bullet : bullets)
{ {
if (mBullet[i]->isActive()) if (bullet->isActive())
{ {
if (mBullet[i]->move() == BULLET_MOVE_OUT) if (bullet->move() == BULLET_MOVE_OUT)
{ {
mPlayer[mBullet[i]->getOwner()]->decScoreMultiplier(); players[bullet->getOwner()]->decScoreMultiplier();
} }
} }
} }
@@ -2303,51 +2252,28 @@ void Game::moveBullets()
// Pinta las balas activas // Pinta las balas activas
void Game::renderBullets() void Game::renderBullets()
{ {
for (int i = 0; i < MAX_BULLETS; i++) for (auto bullet : bullets)
{ {
if (mBullet[i]->isActive()) if (bullet->isActive())
{ {
mBullet[i]->render(); bullet->render();
} }
} }
} }
// Devuelve el primer indice no activo del vector de balas
Uint8 Game::getBulletFreeIndex()
{
for (int i = 0; i < MAX_BULLETS; i++)
{
if (mBullet[i]->isActive() == false)
{
return i;
}
}
return 0;
}
// Establece a cero todos los valores del vector de objetos bala
void Game::resetBullets()
{
for (int i = 0; i < MAX_BULLETS; i++)
{
mBullet[i]->erase();
}
}
// Crea un objeto bala // Crea un objeto bala
void Game::createBullet(int x, int y, Uint8 kind, bool poweredUp, int owner) void Game::createBullet(int x, int y, Uint8 kind, bool poweredUp, int owner)
{ {
mBullet[getBulletFreeIndex()]->init(x, y, kind, poweredUp, owner, mTextureBullet, mRenderer); Bullet *b = new Bullet(x, y, kind, poweredUp, owner, mTextureBullet, mRenderer);
} }
// Actualiza los items // Actualiza los items
void Game::updateItems() void Game::updateItems()
{ {
for (int i = 0; i < MAX_ITEMS; i++) for (auto item : items)
{ {
mItem[i]->update(); item->update();
if (mItem[i]->floorCollision()) if (item->floorCollision())
{ {
JA_PlaySound(mSoundCollision); JA_PlaySound(mSoundCollision);
mEffect.shake = true; mEffect.shake = true;
@@ -2358,32 +2284,9 @@ void Game::updateItems()
// Pinta los items activos // Pinta los items activos
void Game::renderItems() void Game::renderItems()
{ {
for (int i = 0; i < MAX_ITEMS; i++) for (auto item : items)
{ {
mItem[i]->render(); item->render();
}
}
// Devuelve el primer indice no activo del vector de items
Uint8 Game::getItemFreeIndex()
{
for (int i = 0; i < MAX_ITEMS; i++)
{
if (mItem[i]->getClass() == NO_KIND)
{
return i;
}
}
return 0;
}
// Establece a cero todos los valores del vector de objetos item
void Game::resetItems()
{
for (int i = 0; i < MAX_ITEMS; i++)
{
mItem[i]->erase();
} }
} }
@@ -2456,24 +2359,26 @@ Uint8 Game::dropItem()
} }
// Crea un objeto item // Crea un objeto item
void Game::createItem(int x, int y, Uint8 kind) void Game::createItem(LTexture *texture, SDL_Renderer *renderer, Uint8 type, float x, float y)
{ {
mItem[getItemFreeIndex()]->init(kind, x, y); Item *i = new Item(texture, renderer, type, x, y);
items.push_back(i);
} }
// Crea un objeto SmartSprite para mostrar la puntuación al coger un objeto // Crea un objeto SmartSprite para mostrar la puntuación al coger un objeto
void Game::createItemScoreSprite(int x, int y, SmartSprite *sprite) void Game::createItemScoreSprite(int x, int y, SmartSprite *sprite)
{ {
const Uint8 index = getSmartSpriteFreeIndex(); SmartSprite *ss = new SmartSprite(nullptr, mRenderer);
smartSprites.push_back(ss);
// Crea una copia del objeto // Crea una copia del objeto
*mSmartSprite[index] = *sprite; *ss = *sprite;
mSmartSprite[index]->setPosX(x); ss->setPosX(x);
mSmartSprite[index]->setPosY(y); ss->setPosY(y);
mSmartSprite[index]->setDestX(x); ss->setDestX(x);
mSmartSprite[index]->setDestY(y - 15); ss->setDestY(y - 15);
mSmartSprite[index]->setEnabled(true); ss->setEnabled(true);
mSmartSprite[index]->setEnabledTimer(100); ss->setEnabledTimer(100);
} }
// Dibuja el efecto de flash // Dibuja el efecto de flash
@@ -2509,100 +2414,80 @@ void Game::updateShakeEffect()
// Crea un SmartSprite para arrojar el item café al recibir un impacto // Crea un SmartSprite para arrojar el item café al recibir un impacto
void Game::throwCoffee(int x, int y) void Game::throwCoffee(int x, int y)
{ {
const Uint8 index = getSmartSpriteFreeIndex(); SmartSprite *ss = new SmartSprite(nullptr, mRenderer);
smartSprites.push_back(ss);
mSmartSprite[index]->init(); ss->setPosX(x - 8);
mSmartSprite[index]->setPosX(x - 8); ss->setPosY(y - 8);
mSmartSprite[index]->setPosY(y - 8); ss->setWidth(16);
mSmartSprite[index]->setWidth(16); ss->setHeight(16);
mSmartSprite[index]->setHeight(16); ss->setVelX(-1.0f + ((rand() % 5) * 0.5f));
mSmartSprite[index]->setVelX(-1.0f + ((rand() % 5) * 0.5f)); ss->setVelY(-4.0f);
mSmartSprite[index]->setVelY(-4.0f); ss->setAccelX(0.0f);
mSmartSprite[index]->setAccelX(0.0f); ss->setAccelY(0.2f);
mSmartSprite[index]->setAccelY(0.2f); ss->setDestX(x + (ss->getVelX() * 50));
mSmartSprite[index]->setDestX(x + (mSmartSprite[index]->getVelX() * 50)); ss->setDestY(GAME_HEIGHT + 1);
mSmartSprite[index]->setDestY(GAME_HEIGHT + 1); ss->setEnabled(true);
mSmartSprite[index]->setEnabled(true); ss->setEnabledTimer(1);
mSmartSprite[index]->setEnabledTimer(1); ss->setSpriteClip(80, 16, 16, 16);
mSmartSprite[index]->setSpriteClip(80, 16, 16, 16); ss->setRotate(true);
mSmartSprite[index]->setRotate(true); ss->setRotateSpeed(10);
mSmartSprite[index]->setRotateSpeed(10); ss->setRotateAmount(90.0);
mSmartSprite[index]->setRotateAmount(90.0);
} }
// Crea un SmartSprite para arrojar al jugador al morir // Crea un SmartSprite para arrojar al jugador al morir
void Game::throwPlayer(int x, int y, int index) void Game::throwPlayer(int x, int y, Player *player)
{ {
const int sentit = ((rand() % 2) ? 1 : -1); const int sentit = ((rand() % 2) ? 1 : -1);
mPlayer[index]->mDeathIndex = getSmartSpriteFreeIndex(); //player->mDeathIndex = getSmartSpriteFreeIndex();
// mSmartSprite[mPlayer[index]->mDeathIndex]->init(mPlayer[index]->getDeadTexture(), mRenderer);
mSmartSprite[mPlayer[index]->mDeathIndex]->setTexture(mPlayer[index]->getDeadTexture()); SmartSprite *ss = new SmartSprite(nullptr, mRenderer);
mSmartSprite[mPlayer[index]->mDeathIndex]->setPosX(x); smartSprites.push_back(ss);
mSmartSprite[mPlayer[index]->mDeathIndex]->setPosY(y);
mSmartSprite[mPlayer[index]->mDeathIndex]->setWidth(24); ss->setTexture(player->getDeadTexture());
mSmartSprite[mPlayer[index]->mDeathIndex]->setHeight(24); ss->setPosX(x);
mSmartSprite[mPlayer[index]->mDeathIndex]->setVelX(2.0f * sentit); ss->setPosY(y);
mSmartSprite[mPlayer[index]->mDeathIndex]->setVelY(-5.0f); ss->setWidth(24);
mSmartSprite[mPlayer[index]->mDeathIndex]->setAccelX(0.0f); ss->setHeight(24);
mSmartSprite[mPlayer[index]->mDeathIndex]->setAccelY(0.2f); ss->setVelX(2.0f * sentit);
mSmartSprite[mPlayer[index]->mDeathIndex]->setDestX(GAME_WIDTH * sentit); ss->setVelY(-5.0f);
mSmartSprite[mPlayer[index]->mDeathIndex]->setDestY(GAME_HEIGHT + 1); ss->setAccelX(0.0f);
mSmartSprite[mPlayer[index]->mDeathIndex]->setEnabled(true); ss->setAccelY(0.2f);
mSmartSprite[mPlayer[index]->mDeathIndex]->setEnabledTimer(1); ss->setDestX(GAME_WIDTH * sentit);
mSmartSprite[mPlayer[index]->mDeathIndex]->setSpriteClip(0, 0, 24, 24); ss->setDestY(GAME_HEIGHT + 1);
ss->setEnabled(true);
ss->setEnabledTimer(1);
ss->setSpriteClip(0, 0, 24, 24);
} }
// Actualiza los SmartSprites // Actualiza los SmartSprites
void Game::updateSmartSprites() void Game::updateSmartSprites()
{ {
for (int i = 0; i < MAX_SMART_SPRITES; i++) for (auto ss:smartSprites)
{ {
mSmartSprite[i]->update(); ss->update();
} }
} }
// Pinta los SmartSprites activos // Pinta los SmartSprites activos
void Game::renderSmartSprites() void Game::renderSmartSprites()
{ {
for (int i = 0; i < MAX_SMART_SPRITES; i++) for (auto ss:smartSprites)
{ {
mSmartSprite[i]->render(); ss->render();
}
}
// Devuelve el primer indice no activo del vector de SmartSprites
Uint8 Game::getSmartSpriteFreeIndex()
{
for (int i = 0; i < MAX_SMART_SPRITES; i++)
{
if (!mSmartSprite[i]->isEnabled())
{
return i;
}
}
return 0;
}
// Establece a cero todos los valores del vector de objetos SmafrtSprite
void Game::resetSmartSprites()
{
for (int i = 0; i < MAX_SMART_SPRITES; i++)
{
mSmartSprite[i]->init();
} }
} }
// Acciones a realizar cuando el jugador muere // Acciones a realizar cuando el jugador muere
void Game::killPlayer(Player *player) void Game::killPlayer(Player *player)
{ {
if (!mPlayer[index]->isInvulnerable()) if (!player->isInvulnerable())
{ {
if (mPlayer[index]->hasExtraHit()) if (player->hasExtraHit())
{ {
mPlayer[index]->removeExtraHit(); player->removeExtraHit();
throwCoffee(mPlayer[index]->getPosX() + (mPlayer[index]->getWidth() / 2), mPlayer[index]->getPosY() + (mPlayer[index]->getHeight() / 2)); throwCoffee(player->getPosX() + (player->getWidth() / 2), player->getPosY() + (player->getHeight() / 2));
JA_PlaySound(mSoundCoffeeOut); JA_PlaySound(mSoundCoffeeOut);
} }
else else
@@ -2613,8 +2498,8 @@ void Game::killPlayer(Player *player)
shakeScreen(); shakeScreen();
SDL_Delay(500); SDL_Delay(500);
JA_PlaySound(mSoundCoffeeOut); JA_PlaySound(mSoundCoffeeOut);
throwPlayer(mPlayer[index]->getPosX(), mPlayer[index]->getPosY(), index); throwPlayer(player->getPosX(), player->getPosY(), player);
mPlayer[index]->setAlive(false); player->setAlive(false);
if (allPlayersAreDead()) if (allPlayersAreDead())
{ {
JA_StopMusic(); JA_StopMusic();
@@ -2631,11 +2516,11 @@ void Game::killPlayer(Player *player)
void Game::evaluateAndSetMenace() void Game::evaluateAndSetMenace()
{ {
mMenaceCurrent = 0; mMenaceCurrent = 0;
for (int i = 0; i < MAX_BALLOONS; i++) for (auto balloon:balloons)
{ {
if (mBalloon[i]->isEnabled()) if (balloon->isEnabled())
{ {
mMenaceCurrent += mBalloon[i]->getMenace(); mMenaceCurrent += balloon->getMenace();
} }
} }
} }
@@ -2828,12 +2713,12 @@ void Game::renderPlayField()
renderSmartSprites(); renderSmartSprites();
renderScoreBoard(); renderScoreBoard();
for (int i = 0; i < mNumPlayers; i++) for (auto player:players)
{ {
mPlayer[i]->render(); player->render();
} }
if ((mDeathCounter <= 150) && !mPlayer[0]->isAlive()) if ((mDeathCounter <= 150) && !players[0]->isAlive())
{ {
renderDeathFade(150 - mDeathCounter); renderDeathFade(150 - mDeathCounter);
} }
@@ -2882,45 +2767,45 @@ void Game::checkGameInput()
const int index = 0; const int index = 0;
if (mDemo.dataFile[mDemo.counter].left == 1) if (mDemo.dataFile[mDemo.counter].left == 1)
{ {
mPlayer[index]->setInput(INPUT_LEFT); players[index]->setInput(INPUT_LEFT);
} }
if (mDemo.dataFile[mDemo.counter].right == 1) if (mDemo.dataFile[mDemo.counter].right == 1)
{ {
mPlayer[index]->setInput(INPUT_RIGHT); players[index]->setInput(INPUT_RIGHT);
} }
if (mDemo.dataFile[mDemo.counter].noInput == 1) if (mDemo.dataFile[mDemo.counter].noInput == 1)
{ {
mPlayer[index]->setInput(INPUT_NULL); players[index]->setInput(INPUT_NULL);
} }
if (mDemo.dataFile[mDemo.counter].fire == 1) if (mDemo.dataFile[mDemo.counter].fire == 1)
{ {
if (mPlayer[index]->canFire()) if (players[index]->canFire())
{ {
mPlayer[index]->setInput(INPUT_BUTTON_2); players[index]->setInput(INPUT_BUTTON_2);
createBullet(mPlayer[index]->getPosX() + (mPlayer[index]->getWidth() / 2) - 4, mPlayer[index]->getPosY() + (mPlayer[index]->getHeight() / 2), BULLET_UP, mPlayer[index]->isPowerUp(), index); createBullet(players[index]->getPosX() + (players[index]->getWidth() / 2) - 4, players[index]->getPosY() + (players[index]->getHeight() / 2), BULLET_UP, players[index]->isPowerUp(), index);
mPlayer[index]->setFireCooldown(10); players[index]->setFireCooldown(10);
} }
} }
if (mDemo.dataFile[mDemo.counter].fireLeft == 1) if (mDemo.dataFile[mDemo.counter].fireLeft == 1)
{ {
if (mPlayer[index]->canFire()) if (players[index]->canFire())
{ {
mPlayer[index]->setInput(INPUT_BUTTON_1); players[index]->setInput(INPUT_BUTTON_1);
createBullet(mPlayer[index]->getPosX() + (mPlayer[index]->getWidth() / 2) - 4, mPlayer[index]->getPosY() + (mPlayer[index]->getHeight() / 2), BULLET_UP, mPlayer[index]->isPowerUp(), index); createBullet(players[index]->getPosX() + (players[index]->getWidth() / 2) - 4, players[index]->getPosY() + (players[index]->getHeight() / 2), BULLET_UP, players[index]->isPowerUp(), index);
mPlayer[index]->setFireCooldown(10); players[index]->setFireCooldown(10);
} }
} }
if (mDemo.dataFile[mDemo.counter].fireRight == 1) if (mDemo.dataFile[mDemo.counter].fireRight == 1)
{ {
if (mPlayer[index]->canFire()) if (players[index]->canFire())
{ {
mPlayer[index]->setInput(INPUT_BUTTON_3); players[index]->setInput(INPUT_BUTTON_3);
createBullet(mPlayer[index]->getPosX() + (mPlayer[index]->getWidth() / 2) - 4, mPlayer[index]->getPosY() + (mPlayer[index]->getHeight() / 2), BULLET_UP, mPlayer[index]->isPowerUp(), index); createBullet(players[index]->getPosX() + (players[index]->getWidth() / 2) - 4, players[index]->getPosY() + (players[index]->getHeight() / 2), BULLET_UP, players[index]->isPowerUp(), index);
mPlayer[index]->setFireCooldown(10); players[index]->setFireCooldown(10);
} }
} }
@@ -2943,14 +2828,15 @@ void Game::checkGameInput()
// Modo Demo no activo // Modo Demo no activo
else else
{ {
for (int i = 0; i < mNumPlayers; i++) int i = 0;
for (auto player:players)
{ {
if (mPlayer[i]->isAlive()) if (player->isAlive())
{ {
// Input a la izquierda // Input a la izquierda
if (mInput->checkInput(INPUT_LEFT, REPEAT_TRUE, mOptions->input[i].deviceType, mOptions->input[i].id)) if (mInput->checkInput(INPUT_LEFT, REPEAT_TRUE, mOptions->input[i].deviceType, mOptions->input[i].id))
{ {
mPlayer[i]->setInput(INPUT_LEFT); player->setInput(INPUT_LEFT);
mDemo.keys.left = 1; mDemo.keys.left = 1;
} }
else else
@@ -2958,24 +2844,24 @@ void Game::checkGameInput()
// Input a la derecha // Input a la derecha
if (mInput->checkInput(INPUT_RIGHT, REPEAT_TRUE, mOptions->input[i].deviceType, mOptions->input[i].id)) if (mInput->checkInput(INPUT_RIGHT, REPEAT_TRUE, mOptions->input[i].deviceType, mOptions->input[i].id))
{ {
mPlayer[i]->setInput(INPUT_RIGHT); player->setInput(INPUT_RIGHT);
mDemo.keys.right = 1; mDemo.keys.right = 1;
} }
else else
{ {
// Ninguno de los dos inputs anteriores // Ninguno de los dos inputs anteriores
mPlayer[i]->setInput(INPUT_NULL); player->setInput(INPUT_NULL);
mDemo.keys.noInput = 1; mDemo.keys.noInput = 1;
} }
} }
// Comprueba el input de disparar al centro // Comprueba el input de disparar al centro
if (mInput->checkInput(INPUT_BUTTON_2, REPEAT_TRUE, mOptions->input[i].deviceType, mOptions->input[i].id)) if (mInput->checkInput(INPUT_BUTTON_2, REPEAT_TRUE, mOptions->input[i].deviceType, mOptions->input[i].id))
{ {
if (mPlayer[i]->canFire()) if (player->canFire())
{ {
mPlayer[i]->setInput(INPUT_BUTTON_2); player->setInput(INPUT_BUTTON_2);
createBullet(mPlayer[i]->getPosX() + (mPlayer[i]->getWidth() / 2) - 4, mPlayer[i]->getPosY() + (mPlayer[i]->getHeight() / 2), BULLET_UP, mPlayer[i]->isPowerUp(), i); createBullet(player->getPosX() + (player->getWidth() / 2) - 4, player->getPosY() + (player->getHeight() / 2), BULLET_UP, player->isPowerUp(), i);
mPlayer[i]->setFireCooldown(10); player->setFireCooldown(10);
// Reproduce el sonido de disparo // Reproduce el sonido de disparo
JA_PlaySound(mSoundBullet); JA_PlaySound(mSoundBullet);
@@ -2987,11 +2873,11 @@ void Game::checkGameInput()
// Comprueba el input de disparar a la izquierda // Comprueba el input de disparar a la izquierda
if (mInput->checkInput(INPUT_BUTTON_1, REPEAT_TRUE, mOptions->input[i].deviceType, mOptions->input[i].id)) if (mInput->checkInput(INPUT_BUTTON_1, REPEAT_TRUE, mOptions->input[i].deviceType, mOptions->input[i].id))
{ {
if (mPlayer[i]->canFire()) if (player->canFire())
{ {
mPlayer[i]->setInput(INPUT_BUTTON_1); player->setInput(INPUT_BUTTON_1);
createBullet(mPlayer[i]->getPosX() + (mPlayer[i]->getWidth() / 2) - 4, mPlayer[i]->getPosY() + (mPlayer[i]->getHeight() / 2), BULLET_LEFT, mPlayer[i]->isPowerUp(), i); createBullet(player->getPosX() + (player->getWidth() / 2) - 4, player->getPosY() + (player->getHeight() / 2), BULLET_LEFT, player->isPowerUp(), i);
mPlayer[i]->setFireCooldown(10); player->setFireCooldown(10);
// Reproduce el sonido de disparo // Reproduce el sonido de disparo
JA_PlaySound(mSoundBullet); JA_PlaySound(mSoundBullet);
@@ -3003,11 +2889,11 @@ void Game::checkGameInput()
// Comprueba el input de disparar a la derecha // Comprueba el input de disparar a la derecha
if (mInput->checkInput(INPUT_BUTTON_3, REPEAT_TRUE, mOptions->input[i].deviceType, mOptions->input[i].id)) if (mInput->checkInput(INPUT_BUTTON_3, REPEAT_TRUE, mOptions->input[i].deviceType, mOptions->input[i].id))
{ {
if (mPlayer[i]->canFire()) if (player->canFire())
{ {
mPlayer[i]->setInput(INPUT_BUTTON_3); player->setInput(INPUT_BUTTON_3);
createBullet(mPlayer[i]->getPosX() + (mPlayer[i]->getWidth() / 2) - 4, mPlayer[i]->getPosY() + (mPlayer[i]->getHeight() / 2), BULLET_RIGHT, mPlayer[i]->isPowerUp(), i); createBullet(player->getPosX() + (player->getWidth() / 2) - 4, player->getPosY() + (player->getHeight() / 2), BULLET_RIGHT, player->isPowerUp(), i);
mPlayer[i]->setFireCooldown(10); player->setFireCooldown(10);
// Reproduce el sonido de disparo // Reproduce el sonido de disparo
JA_PlaySound(mSoundBullet); JA_PlaySound(mSoundBullet);
@@ -3039,6 +2925,8 @@ void Game::checkGameInput()
{ {
mSection.name = PROG_SECTION_QUIT; mSection.name = PROG_SECTION_QUIT;
} }
i++;
} }
} }
} }
@@ -3170,9 +3058,9 @@ void Game::shakeScreen()
renderBalloons(); renderBalloons();
renderBullets(); renderBullets();
renderItems(); renderItems();
for (int i = 0; i < mNumPlayers; i++) for (auto player:players)
{ {
mPlayer[i]->render(); player->render();
} }
renderScoreBoard(); renderScoreBoard();
@@ -3210,7 +3098,7 @@ section_t Game::run()
// Reproduce la música // Reproduce la música
if (!mGameCompleted) if (!mGameCompleted)
{ {
if (mPlayer[0]->isAlive()) if (players[0]->isAlive())
{ {
JA_PlayMusic(mMusicPlaying); JA_PlayMusic(mMusicPlaying);
} }
@@ -3420,13 +3308,13 @@ void Game::runGameOverScreen()
if (mNumPlayers == 1) if (mNumPlayers == 1)
{ {
mTextBig->writeCentered(PLAY_AREA_CENTER_X, PLAY_AREA_CENTER_Y - (BLOCK * 4), mLang->getText(43)); mTextBig->writeCentered(PLAY_AREA_CENTER_X, PLAY_AREA_CENTER_Y - (BLOCK * 4), mLang->getText(43));
mText->writeCentered(PLAY_AREA_CENTER_X, PLAY_AREA_CENTER_Y - (BLOCK * 1), mLang->getText(44) + std::to_string(mPlayer[0]->getScore())); mText->writeCentered(PLAY_AREA_CENTER_X, PLAY_AREA_CENTER_Y - (BLOCK * 1), mLang->getText(44) + std::to_string(players[0]->getScore()));
} }
else else
{ {
mTextBig->writeCentered(PLAY_AREA_CENTER_X, PLAY_AREA_CENTER_Y - 36, mLang->getText(43)); mTextBig->writeCentered(PLAY_AREA_CENTER_X, PLAY_AREA_CENTER_Y - 36, mLang->getText(43));
mText->writeCentered(PLAY_AREA_CENTER_X, PLAY_AREA_CENTER_Y - 12, mLang->getText(77) + std::to_string(mPlayer[0]->getScore())); mText->writeCentered(PLAY_AREA_CENTER_X, PLAY_AREA_CENTER_Y - 12, mLang->getText(77) + std::to_string(players[0]->getScore()));
mText->writeCentered(PLAY_AREA_CENTER_X, PLAY_AREA_CENTER_Y, mLang->getText(78) + std::to_string(mPlayer[1]->getScore())); mText->writeCentered(PLAY_AREA_CENTER_X, PLAY_AREA_CENTER_Y, mLang->getText(78) + std::to_string(players[1]->getScore()));
} }
mText->writeCentered(PLAY_AREA_CENTER_X, PLAY_AREA_CENTER_Y + BLOCK * 2, mLang->getText(45)); mText->writeCentered(PLAY_AREA_CENTER_X, PLAY_AREA_CENTER_Y + BLOCK * 2, mLang->getText(45));
mMenuGameOver->render(); mMenuGameOver->render();
@@ -3470,7 +3358,7 @@ void Game::renderDebugInfo()
mText->writeShadowed(2, 2 + 3 * BLOCK, "mCounter: " + std::to_string(mCounter), color); mText->writeShadowed(2, 2 + 3 * BLOCK, "mCounter: " + std::to_string(mCounter), color);
mText->writeShadowed(2, 2 + 4 * BLOCK, "(R)enemyset: " + std::to_string(mDebug.enemySet), color); mText->writeShadowed(2, 2 + 4 * BLOCK, "(R)enemyset: " + std::to_string(mDebug.enemySet), color);
mText->writeShadowed(2, 2 + 5 * BLOCK, "RGB: " + std::to_string(mDebug.gradR) + "," + std::to_string(mDebug.gradG) + "," + std::to_string(mDebug.gradB), color); mText->writeShadowed(2, 2 + 5 * BLOCK, "RGB: " + std::to_string(mDebug.gradR) + "," + std::to_string(mDebug.gradG) + "," + std::to_string(mDebug.gradB), color);
mText->writeShadowed(2, 2 + 6 * BLOCK, "(I)invuln: " + std::to_string(mPlayer[0]->getInvulnerableCounter()), color); mText->writeShadowed(2, 2 + 6 * BLOCK, "(I)invuln: " + std::to_string(players[0]->getInvulnerableCounter()), color);
mText->writeShadowed(2, 2 + 7 * BLOCK, "balloons: " + std::to_string(countBalloons()), color); mText->writeShadowed(2, 2 + 7 * BLOCK, "balloons: " + std::to_string(countBalloons()), color);
mText->writeShadowed(2, 2 + 8 * BLOCK, "balloonsPop: " + std::to_string(mBalloonsPopped), color); mText->writeShadowed(2, 2 + 8 * BLOCK, "balloonsPop: " + std::to_string(mBalloonsPopped), color);
mText->writeShadowed(2, 2 + 9 * BLOCK, "(Z-X)ballSped:" + std::to_string(mEnemySpeed), color); mText->writeShadowed(2, 2 + 9 * BLOCK, "(Z-X)ballSped:" + std::to_string(mEnemySpeed), color);
@@ -3494,11 +3382,11 @@ int Game::calculateScreenPower()
{ {
int power = 0; int power = 0;
for (int i = 0; i < MAX_BALLOONS; i++) for (auto balloon:balloons)
{ {
if (mBalloon[i]->isEnabled()) if (balloon->isEnabled())
{ {
power += mBalloon[i]->getPower(); power += balloon->getPower();
} }
} }
@@ -3585,9 +3473,9 @@ void Game::updateHelper()
// Solo ofrece ayuda cuando la amenaza es elevada // Solo ofrece ayuda cuando la amenaza es elevada
if (mMenaceCurrent > 15) if (mMenaceCurrent > 15)
{ {
for (int i = 0; i < mNumPlayers; i++) for (auto player:players)
{ {
if (mPlayer[i]->getCoffees() == 0) if (player->getCoffees() == 0)
{ {
mHelper.needCoffee = true; mHelper.needCoffee = true;
} }
@@ -3596,7 +3484,7 @@ void Game::updateHelper()
mHelper.needCoffee = false; mHelper.needCoffee = false;
} }
if (!mPlayer[i]->isPowerUp()) if (!player->isPowerUp())
{ {
mHelper.needCoffeeMachine = true; mHelper.needCoffeeMachine = true;
} }
@@ -3617,9 +3505,9 @@ void Game::updateHelper()
bool Game::allPlayersAreDead() bool Game::allPlayersAreDead()
{ {
bool success = true; bool success = true;
for (int i = 0; i < mNumPlayers; i++) for (auto player:players)
{ {
success &= (!mPlayer[i]->isAlive()); success &= (!player->isAlive());
} }
return success; return success;

View File

@@ -134,12 +134,6 @@ private:
Lang *mLang; // Objeto para gestionar los textos en diferentes idiomas Lang *mLang; // Objeto para gestionar los textos en diferentes idiomas
Input *mInput; // Manejador de entrada 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
int mNumPlayers; // Numero de jugadores int mNumPlayers; // Numero de jugadores
std::vector<Player *> players; // Vector con los jugadores std::vector<Player *> players; // Vector con los jugadores
std::vector<Balloon *> balloons; // Vector con los globos std::vector<Balloon *> balloons; // Vector con los globos
@@ -322,9 +316,6 @@ private:
// Crea una PowerBall // Crea una PowerBall
void createPowerBall(); void createPowerBall();
// Establece a cero todos los valores del vector de objetos globo
void resetBalloons();
// Establece la velocidad de los globos // Establece la velocidad de los globos
void setBalloonSpeed(float speed); void setBalloonSpeed(float speed);
@@ -373,9 +364,6 @@ private:
// Pinta las balas activas // Pinta las balas activas
void renderBullets(); void renderBullets();
// Establece a cero todos los valores del vector de objetos bala
void resetBullets();
// Crea un objeto bala // Crea un objeto bala
void createBullet(int x, int y, Uint8 kind, bool poweredUp, int owner); void createBullet(int x, int y, Uint8 kind, bool poweredUp, int owner);
@@ -385,14 +373,11 @@ private:
// Pinta los items activos // Pinta los items activos
void renderItems(); void renderItems();
// Establece a cero todos los valores del vector de objetos item
void resetItems();
// Devuelve un item en función del azar // Devuelve un item en función del azar
Uint8 dropItem(); Uint8 dropItem();
// Crea un objeto item // Crea un objeto item
void createItem(int x, int y, Uint8 kind); void createItem(LTexture *texture, SDL_Renderer *renderer, Uint8 type, float x, float y);
// Crea un objeto SmartSprite // Crea un objeto SmartSprite
void createItemScoreSprite(int x, int y, SmartSprite *sprite); void createItemScoreSprite(int x, int y, SmartSprite *sprite);
@@ -407,7 +392,7 @@ private:
void throwCoffee(int x, int y); void throwCoffee(int x, int y);
// Crea un SmartSprite para arrojar al jugador al morir // Crea un SmartSprite para arrojar al jugador al morir
void throwPlayer(int x, int y, int index); void throwPlayer(int x, int y, Player *player);
// Actualiza los SmartSprites // Actualiza los SmartSprites
void updateSmartSprites(); void updateSmartSprites();
@@ -415,9 +400,6 @@ private:
// Pinta los SmartSprites activos // Pinta los SmartSprites activos
void renderSmartSprites(); void renderSmartSprites();
// Establece a cero todos los valores del vector de objetos SmafrtSprite
void resetSmartSprites();
// Acciones a realizar cuando el jugador muere // Acciones a realizar cuando el jugador muere
void killPlayer(Player *player); void killPlayer(Player *player);

View File

@@ -74,7 +74,6 @@ void Intro::init()
// Inicializa los bitmaps de la intro // Inicializa los bitmaps de la intro
for (int i = 0; i < INTRO_TOTAL_BITMAPS; i++) for (int i = 0; i < INTRO_TOTAL_BITMAPS; i++)
{ {
mBitmap[i]->init();
mBitmap[i]->setId(i); mBitmap[i]->setId(i);
mBitmap[i]->setIntroEvents(&mEvents[0]); mBitmap[i]->setIntroEvents(&mEvents[0]);
mBitmap[i]->setWidth(128); mBitmap[i]->setWidth(128);

View File

@@ -2,22 +2,10 @@
#include "item.h" #include "item.h"
// Constructor // Constructor
Item::Item(LTexture *texture, SDL_Renderer *renderer) Item::Item(LTexture *texture, SDL_Renderer *renderer, Uint8 type, float x, float y)
{ {
mSprite = new AnimatedSprite(texture, renderer); mSprite = new AnimatedSprite(texture, renderer);
init(NO_KIND, 0.0f, 0.0f);
}
// Destructor
Item::~Item()
{
delete mSprite;
mSprite = nullptr;
}
// Inicializador
void Item::init(Uint8 type, float x, float y)
{
mClass = type; mClass = type;
mEnabled = true; mEnabled = true;
mTimeToLive = 600; mTimeToLive = 600;
@@ -104,6 +92,13 @@ void Item::init(Uint8 type, float x, float y)
} }
} }
// Destructor
Item::~Item()
{
delete mSprite;
mSprite = nullptr;
}
// Centra el objeto en la posición X // Centra el objeto en la posición X
void Item::allignTo(int x) void Item::allignTo(int x)
{ {

View File

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

View File

@@ -75,11 +75,6 @@ void Player::init()
// Inicia el contador para la cadencia de disparo // Inicia el contador para la cadencia de disparo
mCooldown = 10; mCooldown = 10;
// Inicia el sprite
mSpriteLegs->init();
mSpriteBody->init();
mSpriteHead->init();
// Establece el alto y ancho del sprite // Establece el alto y ancho del sprite
mSpriteLegs->setWidth(mWidth); mSpriteLegs->setWidth(mWidth);
mSpriteLegs->setHeight(mHeight); mSpriteLegs->setHeight(mHeight);
@@ -110,25 +105,6 @@ void Player::init()
mSpriteHead->setCurrentFrame(0); mSpriteHead->setCurrentFrame(0);
mSpriteHead->setAnimationCounter(0); mSpriteHead->setAnimationCounter(0);
// Establece el numero de frames de cada animacion
mSpriteLegs->setAnimationNumFrames(PLAYER_ANIMATION_LEGS_WALKING_STOP, 4);
mSpriteLegs->setAnimationNumFrames(PLAYER_ANIMATION_LEGS_WALKING_LEFT, 4);
mSpriteLegs->setAnimationNumFrames(PLAYER_ANIMATION_LEGS_WALKING_RIGHT, 4);
mSpriteBody->setAnimationNumFrames(PLAYER_ANIMATION_BODY_WALKING_LEFT, 4);
mSpriteBody->setAnimationNumFrames(PLAYER_ANIMATION_BODY_FIRING_LEFT, 4);
mSpriteBody->setAnimationNumFrames(PLAYER_ANIMATION_BODY_WALKING_RIGHT, 4);
mSpriteBody->setAnimationNumFrames(PLAYER_ANIMATION_BODY_FIRING_RIGHT, 4);
mSpriteBody->setAnimationNumFrames(PLAYER_ANIMATION_BODY_WALKING_STOP, 4);
mSpriteBody->setAnimationNumFrames(PLAYER_ANIMATION_BODY_FIRING_UP, 4);
mSpriteHead->setAnimationNumFrames(PLAYER_ANIMATION_HEAD_WALKING_LEFT, 4);
mSpriteHead->setAnimationNumFrames(PLAYER_ANIMATION_HEAD_FIRING_LEFT, 4);
mSpriteHead->setAnimationNumFrames(PLAYER_ANIMATION_HEAD_WALKING_RIGHT, 4);
mSpriteHead->setAnimationNumFrames(PLAYER_ANIMATION_HEAD_FIRING_RIGHT, 4);
mSpriteHead->setAnimationNumFrames(PLAYER_ANIMATION_HEAD_WALKING_STOP, 4);
mSpriteHead->setAnimationNumFrames(PLAYER_ANIMATION_HEAD_FIRING_UP, 4);
// Establece la velocidad de cada animación // Establece la velocidad de cada animación
mSpriteLegs->setAnimationSpeed(PLAYER_ANIMATION_LEGS_WALKING_STOP, 10); mSpriteLegs->setAnimationSpeed(PLAYER_ANIMATION_LEGS_WALKING_STOP, 10);
mSpriteLegs->setAnimationSpeed(PLAYER_ANIMATION_LEGS_WALKING_LEFT, 5); mSpriteLegs->setAnimationSpeed(PLAYER_ANIMATION_LEGS_WALKING_LEFT, 5);
@@ -381,100 +357,134 @@ void Player::setAnimation()
switch (mStatusWalking) switch (mStatusWalking)
{ {
case PLAYER_STATUS_WALKING_LEFT: case PLAYER_STATUS_WALKING_LEFT:
mSpriteLegs->animate(PLAYER_ANIMATION_LEGS_WALKING_LEFT); mSpriteLegs->setCurrentAnimation(PLAYER_ANIMATION_LEGS_WALKING_LEFT);
mSpriteLegs->animate();
switch (mStatusFiring) switch (mStatusFiring)
{ {
case PLAYER_STATUS_FIRING_UP: case PLAYER_STATUS_FIRING_UP:
mSpriteBody->animate(PLAYER_ANIMATION_BODY_FIRING_UP); mSpriteBody->setCurrentAnimation(PLAYER_ANIMATION_BODY_FIRING_UP);
mSpriteHead->animate(PLAYER_ANIMATION_HEAD_FIRING_UP); mSpriteBody->animate();
mSpriteHead->setCurrentAnimation(PLAYER_ANIMATION_HEAD_FIRING_UP);
mSpriteHead->animate();
break; break;
case PLAYER_STATUS_FIRING_LEFT: case PLAYER_STATUS_FIRING_LEFT:
mSpriteBody->animate(PLAYER_ANIMATION_BODY_FIRING_LEFT); mSpriteBody->setCurrentAnimation(PLAYER_ANIMATION_BODY_FIRING_LEFT);
mSpriteHead->animate(PLAYER_ANIMATION_HEAD_FIRING_LEFT); mSpriteBody->animate();
mSpriteHead->setCurrentAnimation(PLAYER_ANIMATION_HEAD_FIRING_LEFT);
mSpriteHead->animate();
break; break;
case PLAYER_STATUS_FIRING_RIGHT: case PLAYER_STATUS_FIRING_RIGHT:
mSpriteBody->animate(PLAYER_ANIMATION_BODY_FIRING_RIGHT); mSpriteBody->setCurrentAnimation(PLAYER_ANIMATION_BODY_FIRING_RIGHT);
mSpriteHead->animate(PLAYER_ANIMATION_HEAD_FIRING_RIGHT); mSpriteBody->animate();
mSpriteHead->setCurrentAnimation(PLAYER_ANIMATION_HEAD_FIRING_RIGHT);
mSpriteHead->animate();
break; break;
case PLAYER_STATUS_FIRING_NO: case PLAYER_STATUS_FIRING_NO:
mSpriteBody->animate(PLAYER_ANIMATION_BODY_WALKING_LEFT); mSpriteBody->setCurrentAnimation(PLAYER_ANIMATION_BODY_WALKING_LEFT);
mSpriteHead->animate(PLAYER_ANIMATION_HEAD_WALKING_LEFT); mSpriteBody->animate();
mSpriteHead->setCurrentAnimation(PLAYER_ANIMATION_HEAD_WALKING_LEFT);
mSpriteHead->animate();
break; break;
default: default:
mSpriteBody->animate(PLAYER_ANIMATION_BODY_WALKING_STOP); mSpriteBody->setCurrentAnimation(PLAYER_ANIMATION_BODY_WALKING_STOP);
mSpriteHead->animate(PLAYER_ANIMATION_HEAD_WALKING_STOP); mSpriteBody->animate();
mSpriteHead->setCurrentAnimation(PLAYER_ANIMATION_HEAD_WALKING_STOP);
mSpriteHead->animate();
break; break;
} }
break; break;
case PLAYER_STATUS_WALKING_RIGHT: case PLAYER_STATUS_WALKING_RIGHT:
mSpriteLegs->animate(PLAYER_ANIMATION_LEGS_WALKING_RIGHT); mSpriteLegs->setCurrentAnimation(PLAYER_ANIMATION_LEGS_WALKING_RIGHT);
mSpriteLegs->animate();
switch (mStatusFiring) switch (mStatusFiring)
{ {
case PLAYER_STATUS_FIRING_UP: case PLAYER_STATUS_FIRING_UP:
mSpriteBody->animate(PLAYER_ANIMATION_BODY_FIRING_UP); mSpriteBody->setCurrentAnimation(PLAYER_ANIMATION_BODY_FIRING_UP);
mSpriteHead->animate(PLAYER_ANIMATION_HEAD_FIRING_UP); mSpriteBody->animate();
mSpriteHead->setCurrentAnimation(PLAYER_ANIMATION_HEAD_FIRING_UP);
mSpriteHead->animate();
break; break;
case PLAYER_STATUS_FIRING_LEFT: case PLAYER_STATUS_FIRING_LEFT:
mSpriteBody->animate(PLAYER_ANIMATION_BODY_FIRING_LEFT); mSpriteBody->setCurrentAnimation(PLAYER_ANIMATION_BODY_FIRING_LEFT);
mSpriteHead->animate(PLAYER_ANIMATION_HEAD_FIRING_LEFT); mSpriteBody->animate();
mSpriteHead->setCurrentAnimation(PLAYER_ANIMATION_HEAD_FIRING_LEFT);
mSpriteHead->animate();
break; break;
case PLAYER_STATUS_FIRING_RIGHT: case PLAYER_STATUS_FIRING_RIGHT:
mSpriteBody->animate(PLAYER_ANIMATION_BODY_FIRING_RIGHT); mSpriteBody->setCurrentAnimation(PLAYER_ANIMATION_BODY_FIRING_RIGHT);
mSpriteHead->animate(PLAYER_ANIMATION_HEAD_FIRING_RIGHT); mSpriteBody->animate();
mSpriteHead->setCurrentAnimation(PLAYER_ANIMATION_HEAD_FIRING_RIGHT);
mSpriteHead->animate();
break; break;
case PLAYER_STATUS_FIRING_NO: case PLAYER_STATUS_FIRING_NO:
mSpriteBody->animate(PLAYER_ANIMATION_BODY_WALKING_RIGHT); mSpriteBody->setCurrentAnimation(PLAYER_ANIMATION_BODY_WALKING_RIGHT);
mSpriteHead->animate(PLAYER_ANIMATION_HEAD_WALKING_RIGHT); mSpriteBody->animate();
mSpriteHead->setCurrentAnimation(PLAYER_ANIMATION_HEAD_WALKING_RIGHT);
mSpriteHead->animate();
break; break;
default: default:
mSpriteBody->animate(PLAYER_ANIMATION_BODY_WALKING_STOP); mSpriteBody->setCurrentAnimation(PLAYER_ANIMATION_BODY_WALKING_STOP);
mSpriteHead->animate(PLAYER_ANIMATION_HEAD_WALKING_STOP); mSpriteBody->animate();
mSpriteHead->setCurrentAnimation(PLAYER_ANIMATION_HEAD_WALKING_STOP);
mSpriteHead->animate();
break; break;
} }
break; break;
case PLAYER_STATUS_WALKING_STOP: case PLAYER_STATUS_WALKING_STOP:
mSpriteLegs->animate(PLAYER_ANIMATION_LEGS_WALKING_STOP); mSpriteLegs->setCurrentAnimation(PLAYER_ANIMATION_LEGS_WALKING_STOP);
mSpriteLegs->animate();
switch (mStatusFiring) switch (mStatusFiring)
{ {
case PLAYER_STATUS_FIRING_UP: case PLAYER_STATUS_FIRING_UP:
mSpriteBody->animate(PLAYER_ANIMATION_BODY_FIRING_UP); mSpriteBody->setCurrentAnimation(PLAYER_ANIMATION_BODY_FIRING_UP);
mSpriteHead->animate(PLAYER_ANIMATION_HEAD_FIRING_UP); mSpriteBody->animate();
mSpriteHead->setCurrentAnimation(PLAYER_ANIMATION_HEAD_FIRING_UP);
mSpriteHead->animate();
break; break;
case PLAYER_STATUS_FIRING_LEFT: case PLAYER_STATUS_FIRING_LEFT:
mSpriteBody->animate(PLAYER_ANIMATION_BODY_FIRING_LEFT); mSpriteBody->setCurrentAnimation(PLAYER_ANIMATION_BODY_FIRING_LEFT);
mSpriteHead->animate(PLAYER_ANIMATION_HEAD_FIRING_LEFT); mSpriteBody->animate();
mSpriteHead->setCurrentAnimation(PLAYER_ANIMATION_HEAD_FIRING_LEFT);
mSpriteHead->animate();
break; break;
case PLAYER_STATUS_FIRING_RIGHT: case PLAYER_STATUS_FIRING_RIGHT:
mSpriteBody->animate(PLAYER_ANIMATION_BODY_FIRING_RIGHT); mSpriteBody->setCurrentAnimation(PLAYER_ANIMATION_BODY_FIRING_RIGHT);
mSpriteHead->animate(PLAYER_ANIMATION_HEAD_FIRING_RIGHT); mSpriteBody->animate();
mSpriteHead->setCurrentAnimation(PLAYER_ANIMATION_HEAD_FIRING_RIGHT);
mSpriteHead->animate();
break; break;
case PLAYER_STATUS_FIRING_NO: case PLAYER_STATUS_FIRING_NO:
mSpriteBody->animate(PLAYER_ANIMATION_BODY_WALKING_STOP); mSpriteBody->setCurrentAnimation(PLAYER_ANIMATION_BODY_WALKING_STOP);
mSpriteHead->animate(PLAYER_ANIMATION_HEAD_WALKING_STOP); mSpriteBody->animate();
mSpriteHead->setCurrentAnimation(PLAYER_ANIMATION_HEAD_WALKING_STOP);
mSpriteHead->animate();
break; break;
default: default:
mSpriteBody->animate(PLAYER_ANIMATION_BODY_WALKING_STOP); mSpriteBody->setCurrentAnimation(PLAYER_ANIMATION_BODY_WALKING_STOP);
mSpriteHead->animate(PLAYER_ANIMATION_HEAD_WALKING_STOP); mSpriteBody->animate();
mSpriteHead->setCurrentAnimation(PLAYER_ANIMATION_HEAD_WALKING_STOP);
mSpriteHead->animate();
break; break;
} }
break; break;
default: default:
mSpriteLegs->animate(PLAYER_ANIMATION_LEGS_WALKING_STOP); mSpriteLegs->setCurrentAnimation(PLAYER_ANIMATION_LEGS_WALKING_STOP);
mSpriteLegs->animate();
break; break;
} }
} }

View File

@@ -6,16 +6,7 @@ SmartSprite::SmartSprite(LTexture *texture, SDL_Renderer *renderer)
{ {
setTexture(texture); setTexture(texture);
setRenderer(renderer); setRenderer(renderer);
}
// Destructor
SmartSprite::~SmartSprite()
{
}
// Inicializador
void SmartSprite::init()
{
setPosX(0); setPosX(0);
setPosY(0); setPosY(0);
setWidth(0); setWidth(0);
@@ -47,6 +38,11 @@ void SmartSprite::init()
introEvents = nullptr; introEvents = nullptr;
} }
// Destructor
SmartSprite::~SmartSprite()
{
}
// Obtiene el valor de la variable // Obtiene el valor de la variable
bool SmartSprite::isEnabled() bool SmartSprite::isEnabled()
{ {

View File

@@ -26,9 +26,6 @@ public:
// Destructor // Destructor
~SmartSprite(); ~SmartSprite();
// Inicializador
void init();
// Obtiene el valor de la variable // Obtiene el valor de la variable
bool isEnabled(); bool isEnabled();

View File

@@ -28,7 +28,7 @@ Title::Title(SDL_Window *window, SDL_Renderer *renderer, Screen *screen, Input *
mGradient = new Sprite(); mGradient = new Sprite();
mText = new Text(mAsset->get("smb2.png"), mAsset->get("smb2.txt"), mRenderer); mText = new Text(mAsset->get("smb2.png"), mAsset->get("smb2.txt"), mRenderer);
mText2 = new Text(mAsset->get("8bithud.png"), mAsset->get("8bithud.txt"), mRenderer); mText2 = new Text(mAsset->get("8bithud.png"), mAsset->get("8bithud.txt"), mRenderer);
mMenu.title = new Menu(mRenderer, mInput, mAsset); mMenu.title = new Menu(this->mRenderer, this->mInput, this->mAsset);
mMenu.options = new Menu(mRenderer, mInput, mAsset); mMenu.options = new Menu(mRenderer, mInput, mAsset);
// Crea la textura para el mosaico de fondo // Crea la textura para el mosaico de fondo