void PlayState::updateEnemies() { EnemyIterator itr = enemies.begin(); Enemy* curEnemy; while ((curEnemy = itr.next()) != 0) { curEnemy->update(); if (curEnemy->X() < (-1*curEnemy->width()) || curEnemy->X() > MAX_ENEMY_X || curEnemy->Y() < MIN_ENEMY_Y || curEnemy->Y() > MAX_ENEMY_Y) { curEnemy->setVisible(false); itr.dealloc(); } else { if(player.hitBox.checkCollision(curEnemy->hitBox)) { //assert2(false, "The player crashed into an enemy. If found, comment this out on line 854 in PlayState.cpp"); if (!player.isInvincible()) { if(!player.getIsShielded()) { player.setPos(PLAYER_ORIGIN); player.setInvincibility(90); } player.killPlayer(); int lifeCount = player.getLifeCount(); lives[lifeCount-1].setVisible(false); // If you're out of lives, the game is over. if(lifeCount == 0) { gameStateMan->changeState(g_gameOverState); return; } } g_playerScore += 200; curEnemy->setVisible(false); g_audioMan->playOneShot(enemyDiedNoise, enemyDiedNoiseSize, 32); itr.dealloc(); } } } }
void PlayState::updateBullets() { PlayerBulletIterator playerBulletItr = playerBullets.begin(); // Update each player bullet Bullet* toUpdate; bool bulletDestroyed; while ((toUpdate = playerBulletItr.next()) != 0) { bulletDestroyed = false; toUpdate->update(); // Check if the bullet has gone off-screen. If it is, we hide it and dealloc. // Otherwise, we check for enemy collisions if(toUpdate->X() > (SCREEN_WIDTH + toUpdate->width()) || toUpdate->X() < (-1*toUpdate->width()) || toUpdate->Y() < (-1*toUpdate->height()) || toUpdate->Y() > SCREEN_HEIGHT) { toUpdate->setVisible(false); playerBulletItr.dealloc(); } else { // Check if a bullet has collided with an enemy. EnemyIterator enemyItr = enemies.begin(); Enemy* curEnemy; while ((curEnemy = enemyItr.next()) != 0) { if(toUpdate->hitBox.checkCollision(curEnemy->hitBox)) { if(!bulletDestroyed) { g_playerStageBulletsHit++; toUpdate->setVisible(false); playerBulletItr.dealloc(); bulletDestroyed = true; } if (curEnemy->damage(toUpdate->getDamage())) { curEnemy->setVisible(false); g_audioMan->playOneShot(enemyDiedNoise, enemyDiedNoiseSize, 32); enemyItr.dealloc(); g_playerScore += 200; } } } } } EnemyBulletIterator enemyBulletItr = enemyBullets.begin(); // Update each enemy bullet while ((toUpdate = enemyBulletItr.next()) != 0) { bulletDestroyed = false; toUpdate->update(); // Check if a bullet has collided with the player. if(player.hitBox.checkCollision(toUpdate->hitBox)) { if (!player.isInvincible()) { // Decrement life count if(!player.getIsShielded()) { player.setPos(PLAYER_ORIGIN); // Give temporary immunity to damage player.setInvincibility(90); } player.killPlayer(); int lifeCount = player.getLifeCount(); lives[lifeCount - 1].setVisible(false); // If you're out of lives, the game is over if(lifeCount == 0) { gameStateMan->changeState(g_gameOverState); return; } } toUpdate->setVisible(false); if (!bulletDestroyed) { enemyBulletItr.dealloc(); bulletDestroyed = true; } } // Check if the bullet has gone off-screen. If it is, we hide it and dealloc, // which effectively steps to the next iterator value. Otherwise, we'll step // forward ourselves.. if (toUpdate->X() > (SCREEN_WIDTH + toUpdate->width()) || toUpdate->X() < (-1*toUpdate->width()) || toUpdate->Y() < (-1*toUpdate->height()) || toUpdate->Y() > SCREEN_HEIGHT) { toUpdate->setVisible(false); if (!bulletDestroyed) { enemyBulletItr.dealloc(); bulletDestroyed = true; } } } }
void PlayState::checkInput() { // Start = pause game if (key_hit(KEY_START)) { gameStateMan->pushState(g_pauseState); } // R-Button = swap weapon modes if (key_hit(KEY_R)) { R_triggered = !R_triggered; R_triggered_indicator.setTileIndex(R_triggered ? g_bullet_selection2TilesPos : g_bullet_selection1TilesPos); } // Check for A button press // First block checks for an immediate button press. // Second block allows constant fire by holding a button. This is forced to a specific frequency. if (key_is_down(KEY_A)) { if (R_triggered) { player.shootLightWide(); } else { player.shootLightFocus(); } } else { player.idleLight(); } // secondary fire if (key_is_down(KEY_B)) { player.shootHeavy(); } else { player.idleHeavy(); } // L-Button = bomb the screen, destroying all enemies and bullets if (key_hit(KEY_L) && player.hasBomb()) { player.subtractBomb(); // play the bomb sound g_audioMan->playOneShot(bombNoise, bombNoiseSize); // Destroy enemies EnemyIterator itr = enemies.begin(); Enemy* curEnemy; while ((curEnemy = itr.next()) != 0) { curEnemy->setVisible(false); itr.dealloc(); g_playerScore = g_playerScore + 200; } bombAnimation = true; // Destroy enemy bullets EnemyBulletIterator enemyBulletItr = enemyBullets.begin(); Bullet* toUpdate; while ((toUpdate = enemyBulletItr.next()) != 0) { toUpdate->setVisible(false); enemyBulletItr.dealloc(); } // Destroy player bullets PlayerBulletIterator bulletItr = playerBullets.begin(); Bullet* playerToUpdate; while ((playerToUpdate = bulletItr.next()) != 0) { playerToUpdate->setVisible(false); bulletItr.dealloc(); } powerUp.setVisible(false); powerUpExists = false; } }
void PlayState::destroy() { // deinit display sprites at bottom lifeIndic.setVisible(false); lifeIndic.unuseImg(); bombIndic.setVisible(false); bombIndic.unuseImg(); starsBG_Pos = Vec2(0, 0); REG_BG0VOFS = starsBG_Pos.y; REG_BG0HOFS = starsBG_Pos.x; player.setVisible(false); player.unuseImg(); PlayerBulletIterator playerBulletItr = playerBullets.begin(); Bullet* curBullet; while((curBullet = playerBulletItr.next()) != 0) { curBullet->setVisible(false); playerBulletItr.dealloc(); } EnemyBulletIterator enemyBulletItr = enemyBullets.begin(); while((curBullet = enemyBulletItr.next()) != 0) { curBullet->setVisible(false); enemyBulletItr.dealloc(); } EnemyIterator enemyItr = enemies.begin(); Enemy* curEnemy; while((curEnemy = enemyItr.next()) != 0) { curEnemy->setVisible(false); enemyItr.dealloc(); } playerBullets.spriteDestroy(); enemyBullets.spriteDestroy(); enemies.spriteDestroy(); R_triggered_indicator.setVisible(false); R_triggered_indicator.unuseImg(); int lifeCount = player.getLifeCount(); for(int i = 0; i < lifeCount - 1; ++i) { lives[i].setVisible(false); lives[i].unuseImg(); } powerUp.setVisible(false); powerUp.unuseImg(); if (poweredUp) { powerUp.powerDown(&player); } clearText(); g_oamMan->deallocSprites(sprites, NUM_SPRITES); }