diff --git a/source/bullet.cpp b/source/bullet.cpp index 6822e61..7e1ee36 100644 --- a/source/bullet.cpp +++ b/source/bullet.cpp @@ -17,7 +17,7 @@ Bullet::~Bullet() } // Iniciador -void Bullet::init(int x, int y, int kind, bool poweredUp, LTexture *texture, SDL_Renderer *renderer) +void Bullet::init(int x, int y, int kind, bool poweredUp, int owner, LTexture *texture, SDL_Renderer *renderer) { // Posición inicial del objeto mPosX = x; @@ -33,6 +33,9 @@ void Bullet::init(int x, int y, int kind, bool poweredUp, LTexture *texture, SDL // Tipo de bala mKind = kind; + // Identificador del dueño del objeto + mOwner = -1; + // Textura con los gráficos del objeto mSprite->setTexture(texture); @@ -157,7 +160,7 @@ void Bullet::testMove() // Deshabilita el objeto void Bullet::erase() { - init(0, 0, 0, false, nullptr, nullptr); + init(0, 0, 0, false, -1, nullptr, nullptr); } // Comprueba si el objeto está activo @@ -209,6 +212,12 @@ int Bullet::getKind() return mKind; } +// Obtiene el valor de la variable +int Bullet::getOwner() +{ + return mOwner; +} + // Obtiene el circulo de colisión circle_t &Bullet::getCollider() { diff --git a/source/bullet.h b/source/bullet.h index 0f775c8..a48f3d3 100644 --- a/source/bullet.h +++ b/source/bullet.h @@ -16,6 +16,7 @@ private: int mVelX; // Velocidad en el eje X int mVelY; // Velocidad en el eje Y int mKind; // Tipo de objeto + int mOwner; // Identificador del dueño del objeto Sprite *mSprite; // Sprite con los graficos y métodos de pintado circle_t mCollider; // Circulo de colisión del objeto @@ -30,7 +31,7 @@ public: ~Bullet(); // Iniciador - void init(int x, int y, int kind, bool poweredUp, LTexture *texture, SDL_Renderer *renderer); + void init(int x, int y, int kind, bool poweredUp, int owner, LTexture *texture, SDL_Renderer *renderer); // Pinta el objeto en pantalla void render(); @@ -62,6 +63,9 @@ public: // Obtiene el valor de la variable int getKind(); + // Obtiene el valor de la variable + int getOwner(); + // Obtiene el circulo de colisión circle_t &getCollider(); }; diff --git a/source/game.cpp b/source/game.cpp index 573c7c7..b7e6c7c 100644 --- a/source/game.cpp +++ b/source/game.cpp @@ -1552,35 +1552,32 @@ void Game::renderScoreBoard() if (mPlayer[0]->isAlive()) mSpriteScoreBoard->render(); - //if (!mDemo.enabled) - { - // SCORE - mText->writeCentered(PLAY_AREA_CENTER_FIRST_QUARTER_X, SCORE_WORD_Y - 6, mTextStrings[39], 0); - mText->writeCentered(PLAY_AREA_CENTER_FIRST_QUARTER_X, SCORE_NUMBER_Y - 6, updateScoreText(mScore), 0); + // SCORE + mText->writeCentered(PLAY_AREA_CENTER_FIRST_QUARTER_X, SCORE_WORD_Y - 6, mTextStrings[39], 0); + mText->writeCentered(PLAY_AREA_CENTER_FIRST_QUARTER_X, SCORE_NUMBER_Y - 6, updateScoreText(mScore), 0); - // HI-SCORE - mText->writeCentered(PLAY_AREA_CENTER_THIRD_QUARTER_X, HISCORE_WORD_Y - 6, mTextStrings[40], 0); - mText->writeCentered(PLAY_AREA_CENTER_THIRD_QUARTER_X, HISCORE_NUMBER_Y - 6, updateScoreText(mHiScore), 0); + // HI-SCORE + mText->writeCentered(PLAY_AREA_CENTER_THIRD_QUARTER_X, HISCORE_WORD_Y - 6, mTextStrings[40], 0); + mText->writeCentered(PLAY_AREA_CENTER_THIRD_QUARTER_X, HISCORE_NUMBER_Y - 6, updateScoreText(mHiScore), 0); - // MULT - color.g = 255; - mText->writeColored(MULTIPLIER_WORD_X, MULTIPLIER_WORD_Y - 6, mTextStrings[41], color); + // MULT + color.g = 255; + mText->writeColored(MULTIPLIER_WORD_X, MULTIPLIER_WORD_Y - 6, mTextStrings[41], color); - color.g = 192; - mTextX2->writeShadowed(PLAY_AREA_CENTER_X - 16, SCORE_WORD_Y + 5, std::to_string(mPlayer[0]->getScoreMultiplier()).substr(0, 1), color, 1); - mText->writeShadowed(PLAY_AREA_CENTER_X - 2, SCORE_WORD_Y + 12, ".", color); - mText->writeShadowed(PLAY_AREA_CENTER_X + 4, SCORE_WORD_Y + 12, std::to_string(mPlayer[0]->getScoreMultiplier()).substr(2, 1), color); + color.g = 192; + mTextX2->writeShadowed(PLAY_AREA_CENTER_X - 16, SCORE_WORD_Y + 5, std::to_string(mPlayer[0]->getScoreMultiplier()).substr(0, 1), color, 1); + mText->writeShadowed(PLAY_AREA_CENTER_X - 2, SCORE_WORD_Y + 12, ".", color); + mText->writeShadowed(PLAY_AREA_CENTER_X + 4, SCORE_WORD_Y + 12, std::to_string(mPlayer[0]->getScoreMultiplier()).substr(2, 1), color); - // STAGE - mText->writeCentered(PLAY_AREA_CENTER_FIRST_QUARTER_X, SCORE_NUMBER_Y + 4, mTextStrings[42] + std::to_string(mStage[mCurrentStage].number), 0); + // STAGE + mText->writeCentered(PLAY_AREA_CENTER_FIRST_QUARTER_X, SCORE_NUMBER_Y + 4, mTextStrings[42] + std::to_string(mStage[mCurrentStage].number), 0); - // POWER - mSpritePowerMeter->setSpriteClip(256, 184, 40, 8); - mSpritePowerMeter->render(); - const float percent = (mStage[mCurrentStage].currentPower * 40.0f) / mStage[mCurrentStage].powerToComplete; - mSpritePowerMeter->setSpriteClip(296, 184, (int)percent, 8); - mSpritePowerMeter->render(); - } + // POWER + mSpritePowerMeter->setSpriteClip(256, 184, 40, 8); + mSpritePowerMeter->render(); + const float percent = (mStage[mCurrentStage].currentPower * 40.0f) / mStage[mCurrentStage].powerToComplete; + mSpritePowerMeter->setSpriteClip(296, 184, (int)percent, 8); + mSpritePowerMeter->render(); } // Actualiza las variables del jugador @@ -2102,19 +2099,20 @@ void Game::checkBulletBalloonCollision() if (mBalloon[i]->isEnabled() && (!mBalloon[i]->isInvulnerable()) && mBullet[j]->isActive()) if (checkCollision(mBalloon[i]->getCollider(), mBullet[j]->getCollider())) { - // Otorga los puntos correspondientes al globo - mPlayer[0]->incScoreMultiplier(); - mPlayer[0]->addScore(Uint32(mBalloon[i]->getScore() * mPlayer[0]->getScoreMultiplier())); - setScore(mPlayer[0]->getScore()); + // Otorga los puntos correspondientes al globo al jugador que disparó la bala + const int index = mBullet[j]->getOwner(); + mPlayer[index]->incScoreMultiplier(); + mPlayer[index]->addScore(Uint32(mBalloon[i]->getScore() * mPlayer[index]->getScoreMultiplier())); + setScore(mPlayer[index]->getScore()); updateHiScore(); - + // Explota el globo popBalloon(i); // Si no es el modo demo, genera un sonido if (!mDemo.enabled) JA_PlaySound(mSoundBalloon); - + // Destruye la bala mBullet[j]->erase(); @@ -2167,9 +2165,9 @@ void Game::resetBullets() } // Crea un objeto bala -void Game::createBullet(int x, int y, Uint8 kind, bool poweredUp) +void Game::createBullet(int x, int y, Uint8 kind, bool poweredUp, int owner) { - mBullet[getBulletFreeIndex()]->init(x, y, kind, poweredUp, mTextureBullet, mRenderer); + mBullet[getBulletFreeIndex()]->init(x, y, kind, poweredUp, owner, mTextureBullet, mRenderer); } // Actualiza los items @@ -2688,37 +2686,38 @@ void Game::checkGameInput() // Modo Demo activo if (mDemo.enabled) { + const int index = 0; if (mDemo.dataFile[mDemo.counter].left == 1) - mPlayer[0]->setInput(INPUT_LEFT); + mPlayer[index]->setInput(INPUT_LEFT); if (mDemo.dataFile[mDemo.counter].right == 1) - mPlayer[0]->setInput(INPUT_RIGHT); + mPlayer[index]->setInput(INPUT_RIGHT); if (mDemo.dataFile[mDemo.counter].noInput == 1) - mPlayer[0]->setInput(NO_INPUT); + mPlayer[index]->setInput(NO_INPUT); if (mDemo.dataFile[mDemo.counter].fire == 1) - if (mPlayer[0]->canFire()) + if (mPlayer[index]->canFire()) { - mPlayer[0]->setInput(INPUT_FIRE_UP); - createBullet(mPlayer[0]->getPosX() + (mPlayer[0]->getWidth() / 2) - 4, mPlayer[0]->getPosY() + (mPlayer[0]->getHeight() / 2), BULLET_UP, mPlayer[0]->isPowerUp()); - mPlayer[0]->setFireCooldown(10); + mPlayer[index]->setInput(INPUT_FIRE_UP); + createBullet(mPlayer[index]->getPosX() + (mPlayer[index]->getWidth() / 2) - 4, mPlayer[index]->getPosY() + (mPlayer[index]->getHeight() / 2), BULLET_UP, mPlayer[index]->isPowerUp(), index); + mPlayer[index]->setFireCooldown(10); } if (mDemo.dataFile[mDemo.counter].fireLeft == 1) - if (mPlayer[0]->canFire()) + if (mPlayer[index]->canFire()) { - mPlayer[0]->setInput(INPUT_FIRE_LEFT); - createBullet(mPlayer[0]->getPosX() + (mPlayer[0]->getWidth() / 2) - 4, mPlayer[0]->getPosY() + (mPlayer[0]->getHeight() / 2), BULLET_UP, mPlayer[0]->isPowerUp()); - mPlayer[0]->setFireCooldown(10); + mPlayer[index]->setInput(INPUT_FIRE_LEFT); + createBullet(mPlayer[index]->getPosX() + (mPlayer[index]->getWidth() / 2) - 4, mPlayer[index]->getPosY() + (mPlayer[index]->getHeight() / 2), BULLET_UP, mPlayer[index]->isPowerUp(), index); + mPlayer[index]->setFireCooldown(10); } if (mDemo.dataFile[mDemo.counter].fireRight == 1) - if (mPlayer[0]->canFire()) + if (mPlayer[index]->canFire()) { - mPlayer[0]->setInput(INPUT_FIRE_RIGHT); - createBullet(mPlayer[0]->getPosX() + (mPlayer[0]->getWidth() / 2) - 4, mPlayer[0]->getPosY() + (mPlayer[0]->getHeight() / 2), BULLET_UP, mPlayer[0]->isPowerUp()); - mPlayer[0]->setFireCooldown(10); + mPlayer[index]->setInput(INPUT_FIRE_RIGHT); + createBullet(mPlayer[index]->getPosX() + (mPlayer[index]->getWidth() / 2) - 4, mPlayer[index]->getPosY() + (mPlayer[index]->getHeight() / 2), BULLET_UP, mPlayer[index]->isPowerUp(), index); + mPlayer[index]->setFireCooldown(10); } // Comprueba el input de pausa @@ -2763,7 +2762,7 @@ void Game::checkGameInput() if (mPlayer[i]->canFire()) { mPlayer[i]->setInput(INPUT_FIRE_UP); - createBullet(mPlayer[i]->getPosX() + (mPlayer[i]->getWidth() / 2) - 4, mPlayer[i]->getPosY() + (mPlayer[i]->getHeight() / 2), BULLET_UP, mPlayer[i]->isPowerUp()); + createBullet(mPlayer[i]->getPosX() + (mPlayer[i]->getWidth() / 2) - 4, mPlayer[i]->getPosY() + (mPlayer[i]->getHeight() / 2), BULLET_UP, mPlayer[i]->isPowerUp(), i); mPlayer[i]->setFireCooldown(10); // Reproduce el sonido de disparo @@ -2779,7 +2778,7 @@ void Game::checkGameInput() if (mPlayer[i]->canFire()) { mPlayer[i]->setInput(INPUT_FIRE_LEFT); - createBullet(mPlayer[i]->getPosX() + (mPlayer[i]->getWidth() / 2) - 4, mPlayer[i]->getPosY() + (mPlayer[i]->getHeight() / 2), BULLET_LEFT, mPlayer[i]->isPowerUp()); + createBullet(mPlayer[i]->getPosX() + (mPlayer[i]->getWidth() / 2) - 4, mPlayer[i]->getPosY() + (mPlayer[i]->getHeight() / 2), BULLET_LEFT, mPlayer[i]->isPowerUp(), i); mPlayer[i]->setFireCooldown(10); // Reproduce el sonido de disparo @@ -2795,7 +2794,7 @@ void Game::checkGameInput() if (mPlayer[i]->canFire()) { mPlayer[i]->setInput(INPUT_FIRE_RIGHT); - createBullet(mPlayer[i]->getPosX() + (mPlayer[i]->getWidth() / 2) - 4, mPlayer[i]->getPosY() + (mPlayer[i]->getHeight() / 2), BULLET_RIGHT, mPlayer[i]->isPowerUp()); + createBullet(mPlayer[i]->getPosX() + (mPlayer[i]->getWidth() / 2) - 4, mPlayer[i]->getPosY() + (mPlayer[i]->getHeight() / 2), BULLET_RIGHT, mPlayer[i]->isPowerUp(), i); mPlayer[i]->setFireCooldown(10); // Reproduce el sonido de disparo diff --git a/source/game.h b/source/game.h index a2bc814..1385324 100644 --- a/source/game.h +++ b/source/game.h @@ -348,7 +348,7 @@ public: void resetBullets(); // Crea un objeto bala - void createBullet(int x, int y, Uint8 kind, bool poweredUp); + void createBullet(int x, int y, Uint8 kind, bool poweredUp, int owner); // Actualiza los items void updateItems(); diff --git a/source/main.cpp b/source/main.cpp index e5d15fd..f9a6dee 100644 --- a/source/main.cpp +++ b/source/main.cpp @@ -37,13 +37,12 @@ un tipo asociado diferente a NO_KIND #include "director.h" #include #include -#include int main(int argc, char *args[]) { // Inicia el generador de numeros aleatorios //srand(time(nullptr)); - std::srand(static_cast(std::time(nullptr))); + std::srand(static_cast(SDL_GetTicks())); // Crea el objeto mDirector Director *mDirector = new Director(args[0]);