diff --git a/Game.h b/Game.h index fbb90bb..3dc11a9 100644 --- a/Game.h +++ b/Game.h @@ -1,3 +1,5 @@ +#include + class Game { public: int result, loop; @@ -105,6 +107,10 @@ private: monkirta.loadFromFile("data\\Fonts\\Monkirta Pursuit NC.ttf"); updateLoader(window, "Loading fonts..."); + sf::Font skME; + skME.loadFromFile("data/Fonts/SKoME.ttf"); + updateLoader(window, "Loading fonts..."); + //******************************************** // GRAPHICS //******************************************** @@ -180,6 +186,18 @@ private: turret.loadFromFile("data\\Gui\\turret.png"); updateLoader(window, "Loading textures..."); + Texture redFilter; + redFilter.loadFromFile("data\\Gui\\redFilter.png"); + updateLoader(window, "Loading textures..."); + + Texture scoreBar; + scoreBar.loadFromFile("data\\Gui\\score_bar.png"); + updateLoader(window, "Loading textures..."); + + Texture highBar; + highBar.loadFromFile("data\\Gui\\high_bar.png"); + updateLoader(window, "Loading textures..."); + vector < Texture > largeAsteroids; for (int i = 1; i <= 7; i++) { largeAsteroids.emplace_back(); @@ -269,9 +287,8 @@ private: Text score; score.setFillColor(Color::White); - score.setPosition(10, 10); + score.setPosition(12, 8); score.setFont(oxan); - score.setString("Score: 0"); score.setCharacterSize(20); Text destroyed; @@ -280,7 +297,7 @@ private: destroyed.setCharacterSize(70); destroyed.setString("Destroyed"); destroyed.setOrigin(destroyed.getGlobalBounds().width/2.0, destroyed.getGlobalBounds().height/2.0); - destroyed.setPosition(window.getSize().x/2.0, window.getSize().y/3.0); + destroyed.setPosition(window.getSize().x/2.0, window.getSize().y/3); Text pressEnter; pressEnter.setFillColor(Color::White); @@ -288,7 +305,31 @@ private: pressEnter.setCharacterSize(20); pressEnter.setString("Press ENTER to return to the menu..."); pressEnter.setOrigin(pressEnter.getGlobalBounds().width/2.0, pressEnter.getGlobalBounds().height/2.0); - pressEnter.setPosition(window.getSize().x/2.0, window.getSize().y/2.25); + pressEnter.setPosition(window.getSize().x/2.0, window.getSize().y/2.4); + + Text highScoreLable; + highScoreLable.setFillColor(Color(0, 0, 0, 0)); + highScoreLable.setOutlineColor(Color::White); + highScoreLable.setOutlineThickness(1); + highScoreLable.setFont(skME); + highScoreLable.setCharacterSize(30); + highScoreLable.setString("High Scores"); + highScoreLable.setOrigin(highScoreLable.getGlobalBounds().width/2.0, highScoreLable.getGlobalBounds().height/2.0); + highScoreLable.setPosition(window.getSize().x/2.0, window.getSize().y/2.0); + + Text highScoreEntriesDates[10]; + Text highScoreEntries[10]; + for (int i = 0; i < 10; i++) { + highScoreEntriesDates[i].setFillColor(Color::White); + highScoreEntriesDates[i].setFont(monkirta); + highScoreEntriesDates[i].setCharacterSize(20); + highScoreEntriesDates[i].setOrigin(0, highScoreEntriesDates[i].getGlobalBounds().height/2.0); + + highScoreEntries[i].setFillColor(Color::White); + highScoreEntries[i].setFont(oxan); + highScoreEntries[i].setCharacterSize(20); + highScoreEntries[i].setOrigin(0, highScoreEntries[i].getGlobalBounds().height/2.0); + } auto stop = std::chrono::high_resolution_clock::now(); auto duration = std::chrono::duration_cast(stop - start); @@ -310,6 +351,9 @@ private: lost.push_back(&destroyed); lost.push_back(&pressEnter); + lost.push_back(&highScoreLable); + + int lostEnd = lost.size() - 1; MySprite backSprite(background, 100, window.getSize().x / 2, window.getSize().y / 2, 0, 0); @@ -321,10 +365,59 @@ private: player.setShield(true, &shield, 12, &shieldTimer); MySprite fighter(wingmanShip, 10, -20, -20, 0, 0); - fighter.setMaxVelocity(18); - fighter.setMinVelocity(0); + fighter.setMaxVelocity(10); + fighter.setMinVelocity(-2); + + Mount rapidFireIcon(rapidFire, 20, window.getSize().x/2.0 - 25 - 150, 30, 0, 0); + Mount damageIcon(damage, 20, window.getSize().x/2.0 - 25 - 100, 30, 0, 0); + Mount sprayFireIcon(spray, 20, window.getSize().x/2.0 - 25 - 50, 30, 0, 0); + Mount backwardsFireIcon(backwards, 20, window.getSize().x/2.0 - 25, 30, 0, 0); + Mount shieldIcon(shieldUp, 20, window.getSize().x/2.0 + 25, 30, 0, 0); + Mount timeIcon(slowTime, 20, window.getSize().x/2.0 + 25 + 50, 30, 0, 0); + Mount turretIcon(turret, 20, window.getSize().x/2.0 + 25 + 100, 30, 0, 0); + Mount fighterIcon(wingman, 20, window.getSize().x/2.0 + 25 + 150, 30, 0, 0); + + Rider redFilterTemp(redFilter, 100); + redFilterTemp.setColor(Color(redFilterTemp.getColor().r, redFilterTemp.getColor().g, redFilterTemp.getColor().b, 155)); + auto filterRect = redFilterTemp.getLocalBounds(); + + rapidFireIcon.addRider(redFilterTemp); + damageIcon.addRider(redFilterTemp); + sprayFireIcon.addRider(redFilterTemp); + backwardsFireIcon.addRider(redFilterTemp); + shieldIcon.addRider(redFilterTemp); + timeIcon.addRider(redFilterTemp); + turretIcon.addRider(redFilterTemp); + fighterIcon.addRider(redFilterTemp); + + vector highScores; + vector highScoresDates; + ifstream fin("scores"); + + if (fin.is_open()) { + string name; + int scoreHold; + while (!fin.eof()) { + fin >> name; + fin >> scoreHold; + highScores.push_back(scoreHold); + highScoresDates.push_back(name); + } + } else { + highScores.push_back(0); + highScoresDates.push_back("0"); + } + + fin.close(); + + score.setString("0"); + + MySprite scoreBox(scoreBar, 40); + scoreBox.setOrigin(0, 0); + scoreBox.setPosition(8, 8); gui.push_back(&backSprite); + gui.push_back(&scoreBox); gui.push_back(&score); for (int i = 0; i < player.getLives(); i++) @@ -336,26 +429,65 @@ private: window.clear(Color::Black); // clear the contents of the old frame // by setting the window to black - if (shieldTimer.getElapsedTime().asSeconds() > 5) player.setShield(false); - if (poweredUpRapid && rapidFireClock.getElapsedTime().asSeconds() > 12) poweredUpRapid = false; - if (poweredUpDamage && damageClock.getElapsedTime().asSeconds() > 12) poweredUpDamage = false; - if (poweredUpSpray && sprayFireClock.getElapsedTime().asSeconds() > 12) poweredUpSpray = false; - if (poweredUpbackwards && backwardsClock.getElapsedTime().asSeconds() > 12) poweredUpbackwards = false; - if (poweredUpFighter && fighterClock.getElapsedTime().asSeconds() > 12) { + int shortTime = 5, longTime = 12; + + if (shieldTimer.getElapsedTime().asSeconds() > shortTime) player.setShield(false); + else if (player.hasShield()) { + double secs = shieldTimer.getElapsedTime().asSeconds(); + shieldIcon.getRidersForEdit()->at(0).setTextureRect(IntRect(filterRect.left, filterRect.top * secs/shortTime, filterRect.width, filterRect.height * secs/shortTime)); + } + + if (poweredUpRapid && rapidFireClock.getElapsedTime().asSeconds() > longTime) poweredUpRapid = false; + else if (poweredUpRapid) { + double secs = rapidFireClock.getElapsedTime().asSeconds(); + rapidFireIcon.getRidersForEdit()->at(0).setTextureRect(IntRect(filterRect.left, filterRect.top * secs/longTime, filterRect.width, filterRect.height * secs/longTime)); + } + + if (poweredUpDamage && damageClock.getElapsedTime().asSeconds() > longTime) poweredUpDamage = false; + else if (poweredUpDamage) { + double secs = damageClock.getElapsedTime().asSeconds(); + damageIcon.getRidersForEdit()->at(0).setTextureRect(IntRect(filterRect.left, filterRect.top * secs/longTime, filterRect.width, filterRect.height * secs/longTime)); + } + + if (poweredUpSpray && sprayFireClock.getElapsedTime().asSeconds() > longTime) poweredUpSpray = false; + else if (poweredUpSpray) { + double secs = sprayFireClock.getElapsedTime().asSeconds(); + sprayFireIcon.getRidersForEdit()->at(0).setTextureRect(IntRect(filterRect.left, filterRect.top * secs/longTime, filterRect.width, filterRect.height * secs/longTime)); + } + + if (poweredUpbackwards && backwardsClock.getElapsedTime().asSeconds() > longTime) poweredUpbackwards = false; + else if (poweredUpbackwards) { + double secs = backwardsClock.getElapsedTime().asSeconds(); + backwardsFireIcon.getRidersForEdit()->at(0).setTextureRect(IntRect(filterRect.left, filterRect.top * secs/longTime, filterRect.width, filterRect.height * secs/longTime)); + } + + if (poweredUpFighter && fighterClock.getElapsedTime().asSeconds() > longTime) { poweredUpFighter = false; fighter.setPosition(-20, -20); fighter.setVelocity(0); fighter.setDirection(0); + } else if (poweredUpFighter) { + double secs = fighterClock.getElapsedTime().asSeconds(); + fighterIcon.getRidersForEdit()->at(0).setTextureRect(IntRect(filterRect.left, filterRect.top * secs/longTime, filterRect.width, filterRect.height * secs/longTime)); } - if (poweredUpTurret && turretClock.getElapsedTime().asSeconds() > 12) { + + if (poweredUpTurret && turretClock.getElapsedTime().asSeconds() > longTime) { poweredUpTurret = false; player.removeRider(0); - } if (poweredUpTime && timeClock.getElapsedTime().asSeconds() > 5) { + } else if (poweredUpTurret) { + double secs = turretClock.getElapsedTime().asSeconds(); + turretIcon.getRidersForEdit()->at(0).setTextureRect(IntRect(filterRect.left, filterRect.top * secs/longTime, filterRect.width, filterRect.height * secs/longTime)); + } + + if (poweredUpTime && timeClock.getElapsedTime().asSeconds() > shortTime) { for (auto e : enemies) { e->setVelocity(e->getVelocity() * 8); } poweredUpTime = false; + } else if (poweredUpTime) { + double secs = timeClock.getElapsedTime().asSeconds(); + timeIcon.getRidersForEdit()->at(0).setTextureRect(IntRect(filterRect.left, filterRect.top * secs/shortTime, filterRect.width, filterRect.height * secs/shortTime)); } //**************************************** @@ -440,7 +572,7 @@ private: // Spawn cycle below here //**************************************** - uniform_int_distribution stroidChance(1, 32), powerUpChance(1, 50), + uniform_int_distribution stroidChance(1, 32), powerUpChance(1, 35), powerUp(1, 8), stroidSize(1, 3), smallTexture(0, smallAsteroids.size() - 1), mediumTexture(0, mediumAsteroids.size() - 1), @@ -735,7 +867,7 @@ private: timeClock.restart(); } else if (enemies[i]->getRiders()[0].getType() == "Shield") { shieldTimer.restart(); - player.setShield(true, &shield, 12, &shieldTimer); + if (!player.hasShield()) player.setShield(true, &shield, 12, &shieldTimer); } } @@ -765,11 +897,75 @@ private: enemies.erase(enemies.begin() + i); } } else if (!ended && Collision::CircleTest(*enemies[i], player)) { - if (player.hit(window, animations, explosion, gen, shield, 12, shieldTimer)) { + if (player.hit(window, animations, explosion, gen)) { ended = true; + player.setShield(false); playerLost.play(); - } else playerBoom.play(); + if (highScores[0] == 0) { + time_t now = time(0); + tm *ltm = localtime(&now); + + highScores[0] = player.getScore(); + highScoresDates[0] = to_string(ltm->tm_mday) + "/" + to_string(1 + ltm->tm_mon) + "/" + to_string(1900 + ltm->tm_year); + } + else { + bool inserted = false; + for (int j = 0; j < highScores.size(); j++) { + if (player.getScore() > highScores[j]) { + inserted = true; + + highScores.insert(highScores.begin() + j, player.getScore()); + + time_t now = time(0); + tm *ltm = localtime(&now); + + highScoresDates.insert(highScoresDates.begin() + j, to_string(ltm->tm_mday) + "/" + to_string(1 + ltm->tm_mon) + "/" + to_string(1900 + ltm->tm_year)); + + if (highScores.size() > 10) { + highScores.pop_back(); + highScoresDates.pop_back(); + } + break; + } + } + + if (!inserted && highScores.size() < 10) { + highScores.push_back(player.getScore()); + + time_t now = time(0); + tm *ltm = localtime(&now); + highScoresDates.push_back(to_string(ltm->tm_mday) + "/" + to_string(1 + ltm->tm_mon) + "/" + to_string(1900 + ltm->tm_year)); + } + } + + ofstream fout("scores"); + for (int j = 0; j < highScores.size(); j++) { + fout << highScoresDates[j] << " " << highScores[j]; + if (j != highScores.size() - 1) fout << endl; + + highScoreEntries[j].setString(to_string(highScores[j])); + highScoreEntriesDates[j].setString(highScoresDates[j]); + + int widthEntry = highScoreEntries[0].getGlobalBounds().width; + int widthEntryDate = highScoreEntriesDates[0].getGlobalBounds().width; + int spaceBetween = 150 - widthEntryDate; + int dateLoc = (window.getSize().x - (widthEntry + widthEntryDate + spaceBetween))/2; + + cout << widthEntryDate << " " << widthEntry << " " << spaceBetween << endl; + + highScoreEntriesDates[j].setPosition(dateLoc, window.getSize().y/1.8 + (25 * j)); + highScoreEntries[j].setPosition(dateLoc + 150, window.getSize().y/1.8 + (25 * j)); + } + + fout.close(); + } else { + playerBoom.play(); + player.setShield(true, &shield, 12, &shieldTimer); + } + + poweredUpDamage = false; + poweredUpSpray = false; poweredUpRapid = false; poweredUpbackwards = false; @@ -778,13 +974,19 @@ private: fighter.setVelocity(0); fighter.setDirection(0); + if (poweredUpTurret) player.removeRider(0); poweredUpTurret = false; - player.removeRider(0); - for (auto e : enemies) - e->setVelocity(e->getVelocity() * 8); + if (poweredUpTime) { + for (auto e : enemies) + e->setVelocity(e->getVelocity() * 8); + } poweredUpTime = false; + for (int j = 0; j < projectiles.size(); j++) { + projectiles.erase(projectiles.begin() + j); + } + lives.erase(lives.begin() + player.getLives()); //remove player icon from top corner } } @@ -796,7 +998,7 @@ private: } } - score.setString("Score: " + to_string(player.getScore())); + score.setString(to_string(player.getScore())); if (player.getScore() - (player.getNewLifeScore() * player.getNumLivesAdded()) >= player.getNewLifeScore()) { @@ -841,6 +1043,11 @@ private: } } else { for (auto & i : lost) window.draw(*i); + + for (int i = 0; i < highScores.size(); i++) { + window.draw(highScoreEntriesDates[i]); + window.draw(highScoreEntries[i]); + } } for (int i = 1; i < gui.size(); i++) { @@ -850,6 +1057,39 @@ private: for (auto i: lives) { window.draw(i); } + + if (poweredUpRapid) { + window.draw(rapidFireIcon); + window.draw(rapidFireIcon.getRiders()[0]); + } + if (poweredUpDamage) { + window.draw(damageIcon); + window.draw(damageIcon.getRiders()[0]); + } + if (poweredUpbackwards) { + window.draw(backwardsFireIcon); + window.draw(backwardsFireIcon.getRiders()[0]); + } + if (poweredUpSpray) { + window.draw(sprayFireIcon); + window.draw(sprayFireIcon.getRiders()[0]); + } + if (player.hasShield()) { + window.draw(shieldIcon); + window.draw(shieldIcon.getRiders()[0]); + } + if (poweredUpTime) { + window.draw(timeIcon); + window.draw(timeIcon.getRiders()[0]); + } + if (poweredUpTurret) { + window.draw(turretIcon); + window.draw(turretIcon.getRiders()[0]); + } + if (poweredUpFighter) { + window.draw(fighterIcon); + window.draw(fighterIcon.getRiders()[0]); + } //**************************************** // ADD ALL OF OUR DRAWING ABOVE HERE //**************************************** diff --git a/Mount.h b/Mount.h index 4d986d2..446ab6e 100644 --- a/Mount.h +++ b/Mount.h @@ -25,8 +25,13 @@ public: } void addRider(Rider &sprite, int index = -1) { - if (index == -1) riders.push_back(sprite); - else riders.insert(riders.begin() + index, sprite); + if (index == -1) { + riders.push_back(sprite); + riders[riders.size() - 1].setPosition(getPosition()); + } else { + riders.insert(riders.begin() + index, sprite); + riders[index].setPosition(getPosition()); + } } void removeRider(int index = -1) { diff --git a/Ship.h b/Ship.h index 6cc0ffa..3da2b0a 100644 --- a/Ship.h +++ b/Ship.h @@ -15,7 +15,7 @@ public: sound.play(); } - bool hit(RenderWindow &window, vector &animations, Texture &explosionTexture, default_random_engine &gen, Texture &shieldTexture, int scale, Clock &timer) { + bool hit(RenderWindow &window, vector &animations, Texture &explosionTexture, default_random_engine &gen) { uniform_int_distribution angle(0, 359); animations.emplace_back(explosionTexture, 100, getXPos(), getYPos(), 0, angle(gen)); animations[animations.size() - 1].makeAnimated(5, 5, 0.01,23); @@ -24,7 +24,6 @@ public: setDirection(0); setVelocity(0); lives--; - setShield(true, &shieldTexture, scale, &timer); return lives <= 0; } diff --git a/data/Gui/money_bar.png b/data/Gui/high_bar.png similarity index 68% rename from data/Gui/money_bar.png rename to data/Gui/high_bar.png index 4b1fa3c..ec4a56b 100644 Binary files a/data/Gui/money_bar.png and b/data/Gui/high_bar.png differ diff --git a/data/Gui/redFilter.png b/data/Gui/redFilter.png new file mode 100644 index 0000000..9aea3d1 Binary files /dev/null and b/data/Gui/redFilter.png differ diff --git a/data/Gui/score_bar.png b/data/Gui/score_bar.png new file mode 100644 index 0000000..30eed03 Binary files /dev/null and b/data/Gui/score_bar.png differ diff --git a/scores b/scores new file mode 100644 index 0000000..57183ab --- /dev/null +++ b/scores @@ -0,0 +1,5 @@ +19/10/2020 107800 +19/10/2020 12100 +19/10/2020 8700 +19/10/2020 1300 +19/10/2020 100 \ No newline at end of file