diff --git a/assets/music/Spow.ogg b/assets/music/Spow.ogg new file mode 100644 index 0000000..fe5a7c5 Binary files /dev/null and b/assets/music/Spow.ogg differ diff --git a/assets/music/TheCyberGrind.ogg b/assets/music/TheCyberGrind.ogg new file mode 100644 index 0000000..6b4798e Binary files /dev/null and b/assets/music/TheCyberGrind.ogg differ diff --git a/assets/music/Votely.ogg b/assets/music/Votely.ogg new file mode 100644 index 0000000..18a1aee Binary files /dev/null and b/assets/music/Votely.ogg differ diff --git a/assets/sfx/levelup.ogg b/assets/sfx/levelup.ogg new file mode 100644 index 0000000..e064387 Binary files /dev/null and b/assets/sfx/levelup.ogg differ diff --git a/assets/sfx/paused.ogg b/assets/sfx/paused.ogg new file mode 100644 index 0000000..c4bb207 Binary files /dev/null and b/assets/sfx/paused.ogg differ diff --git a/assets/sfx/shoot.wav b/assets/sfx/shoot.wav deleted file mode 100644 index 68f14d3..0000000 Binary files a/assets/sfx/shoot.wav and /dev/null differ diff --git a/attribution.md b/attribution.md index d0f6e8a..d714511 100644 --- a/attribution.md +++ b/attribution.md @@ -9,7 +9,12 @@ - Used [2D Pixel Dungeon Asset Pack v2.0](https://pixel-poem.itch.io/dungeon-assetpuck) by [Pixel-Poem](https://pixel-poem.itch.io/) on itch.io, licensed under the clause `This asset pack can be used in free and commercial projects. You can modify it to suit your own needs. Credit is not necessary, but appreciated. You may not redistribute it or resell it.` - Used [Space Shooter (Redux, plus fonts and sounds)](https://kenney.nl/assets/space-shooter-redux), Licensed Under [Creative Commons CC0](https://creativecommons.org/share-your-work/public-domain/cc0/) by [Kenney Vleugels](https://kenney.nl/) +- Used [Bebas Neue v2](http://bebasneue.com/), licensed under [SIL Open Font License, Version 1.1](https://github.com/dharmatype/Bebas-Neue/blob/master/OFL.txt) + +# Audio +- Sound effects using [sfxr.me](sfxr.me) - Used [ambient buttons » btn121.wav ](https://freesound.org/people/junggle/sounds/29301/), Licensed under [CC BY 4.0](https://creativecommons.org/licenses/by/4.0/), by [junggle](https://freesound.org/people/junggle/) - Used [Clicks and switches » Click.wav](https://freesound.org/people/kwahmah_02/sounds/256116/), Licensed Under [CC0 1.0](https://creativecommons.org/publicdomain/zero/1.0/), by [kwahmah_02](https://freesound.org/people/kwahmah_02/) -- Sound effects using [sfxr.me](sfxr.me) -- Used [Bebas Neue v2](http://bebasneue.com/), licensed under [SIL Open Font License, Version 1.1](https://github.com/dharmatype/Bebas-Neue/blob/master/OFL.txt) \ No newline at end of file +- [Meganeko](https://soundcloud.com/meganeko) - [The Cyber Grind (Ultrakill Soundtrack)](https://soundcloud.com/meganeko/ultrakill) +- [coal bones](https://www.youtube.com/@CoalBones) - [Votely](https://www.youtube.com/watch?v=U9uUf4PnHyY) +- [Cheesy Hfj](https://www.youtube.com/@CheesyHfj) - [Spow](https://www.youtube.com/watch?v=3re7zdPidbU) \ No newline at end of file diff --git a/source/Collision/Collision.cpp b/source/Collision/Collision.cpp index c14f6b7..1272fb1 100644 --- a/source/Collision/Collision.cpp +++ b/source/Collision/Collision.cpp @@ -2,6 +2,7 @@ * File: collision.cpp * Author: Nick (original version), ahnonay (SFML2 compatibility), Paweł Syska (C++17 refactor + naming convention) */ + #include #include #include diff --git a/source/Holders/MusicHolder.cpp b/source/Holders/MusicHolder.cpp new file mode 100644 index 0000000..681d010 --- /dev/null +++ b/source/Holders/MusicHolder.cpp @@ -0,0 +1,47 @@ +#pragma once +#include +#include "MusicHolder.hpp" + +MusicHolder* MusicHolder::m_s_Instance = nullptr; + +MusicHolder::MusicHolder() { + // if m_s_Instance != nullptr; game will exit + assert(m_s_Instance == nullptr); + m_s_Instance = this; +} + +Music& MusicHolder::GetMusic(const std::string &filename) { + // get a reference to m_Font via m_s_instance + auto& m = m_s_Instance -> m_Music; + // auto equivalent to map + // create an iterator to hold a key-value pair (kvp) and search for a required kvp using the passed in filename + auto keyValuePair = m.find(filename); + // auto equivalent to map::iterator + + // match? + if (keyValuePair != m.end()) { + // match. + // return the font; second part of kvp + return keyValuePair -> second; + } + else { + // no match. + // create a new key value pair using the filename + auto& music = m[filename]; + // load texture from a file + music.openFromFile(filename); + return music; + } +} + +void MusicHolder::StopAll() { + for (auto &itr : m_s_Instance -> m_Music) { + itr.second.stop(); + } +} + +void MusicHolder::PauseAll() { + for (auto &itr : m_s_Instance -> m_Music) { + itr.second.pause(); + } +} \ No newline at end of file diff --git a/source/Holders/MusicHolder.hpp b/source/Holders/MusicHolder.hpp new file mode 100644 index 0000000..c99c796 --- /dev/null +++ b/source/Holders/MusicHolder.hpp @@ -0,0 +1,20 @@ +#pragma once + +#include +#include + +using namespace sf; + +class MusicHolder { +private: + // map container from STL, holds string-Font key-pair + std::map m_Music; + // pointer of the same type as the class - one and only instance + static MusicHolder* m_s_Instance; + +public: + MusicHolder(); + static Music& GetMusic(std::string const& filename); + static void StopAll(); + static void PauseAll(); +}; diff --git a/source/Main.cpp b/source/Main.cpp index 1f1b7e2..c550710 100644 --- a/source/Main.cpp +++ b/source/Main.cpp @@ -2,6 +2,7 @@ #include "Holders/TextureHolder.cpp" #include "Holders/FontHolder.cpp" #include "Holders/SoundHolder.cpp" +#include "Holders/MusicHolder.hpp" #include "Scenes/Scenes.hpp" #include "Scenes/Menu.cpp" @@ -17,6 +18,7 @@ int main() { TextureHolder textureHolder; FontHolder fontHolder; SoundHolder soundHolder; + MusicHolder musicHolder; // Applications variables std::vector Scenes; @@ -55,6 +57,7 @@ int main() { // Main loop while (currentScene.getNextScreen() >= 0) { Scenes[currentScene.getNextScreen()]->setScreenShot(currentScene.getScreenShot()); + MusicHolder::PauseAll(); currentScene = Scenes[currentScene.getNextScreen()]->run(window); } diff --git a/source/Scenes/Game.cpp b/source/Scenes/Game.cpp index 3973bd6..624a890 100644 --- a/source/Scenes/Game.cpp +++ b/source/Scenes/Game.cpp @@ -107,6 +107,13 @@ Game::Game(Vector2f screenResolution, Vector2f levelSize) { m_SoundPickupLow.setBuffer(SoundHolder::GetSound("assets/sfx/pickup1.ogg")); m_SoundPickupHigh.setBuffer(SoundHolder::GetSound("assets/sfx/pickup2.ogg")); + m_SoundLoaded.setVolume(50); + m_SoundHit.setVolume(50); + m_SoundKilled.setVolume(50); + m_SoundShoot.setVolume(50); + m_SoundPickupLow.setVolume(50); + m_SoundPickupHigh.setVolume(50); + regenerate(); } @@ -158,6 +165,11 @@ SceneChange Game::run(RenderWindow &window) { m_SoundLoaded.play(); + Music* musicPtr = &MusicHolder::GetMusic("assets/music/TheCyberGrind.ogg"); + musicPtr->setLoop(true); + musicPtr->setVolume(5); + musicPtr->play(); + while (!paused) { // HANDLE INPUTS Event event; diff --git a/source/Scenes/GameOver.cpp b/source/Scenes/GameOver.cpp index 35a72e0..59869c8 100644 --- a/source/Scenes/GameOver.cpp +++ b/source/Scenes/GameOver.cpp @@ -61,6 +61,12 @@ SceneChange GameOver::run(RenderWindow &window) { saveButton.setPosition(saveText.getPosition() + Vector2f(0, 15)); std::vector scores = readScore(); + + Music* musicPtr = &MusicHolder::GetMusic("assets/music/Votely.ogg"); + musicPtr->stop(); + musicPtr->setLoop(true); + musicPtr->setVolume(5); + musicPtr->play(); while (window.isOpen()) { // Update frame diff --git a/source/Scenes/Info.cpp b/source/Scenes/Info.cpp index a0bd9da..7df2901 100644 --- a/source/Scenes/Info.cpp +++ b/source/Scenes/Info.cpp @@ -71,6 +71,9 @@ SceneChange Info::run(RenderWindow &window) { downloadText.setPosition(attributionText.getPosition() + Vector2f((attributionText.getLocalBounds().width / 2) + (downloadText.getLocalBounds().width / 2) + BUTTON_PADDING + 50, 0)); downloadButton.setPosition(downloadText.getPosition() + Vector2f(0, BUTTON_PADDING / 2)); + Music* musicPtr = &MusicHolder::GetMusic("assets/music/Spow.ogg"); + musicPtr->play(); + while (window.isOpen()) { // Update frame Event event; diff --git a/source/Scenes/Leaderboard.cpp b/source/Scenes/Leaderboard.cpp index eb51db1..5cb75b0 100644 --- a/source/Scenes/Leaderboard.cpp +++ b/source/Scenes/Leaderboard.cpp @@ -60,6 +60,11 @@ SceneChange Leaderboard::run(RenderWindow &window) { Text scoresText[SCORES_COUNT]; Text namesText[SCORES_COUNT]; + Music* musicPtr = &MusicHolder::GetMusic("assets/music/Votely.ogg"); + musicPtr->setLoop(true); + musicPtr->setVolume(20); + musicPtr->play(); + for (int i = 0; i < SCORES_COUNT; i++) { if (scores.empty()) { break; diff --git a/source/Scenes/LevelUp.cpp b/source/Scenes/LevelUp.cpp index d7e1e8e..509bb97 100644 --- a/source/Scenes/LevelUp.cpp +++ b/source/Scenes/LevelUp.cpp @@ -69,7 +69,7 @@ SceneChange LevelUp::run(RenderWindow &window) { // Make buttons for selecting upgrades from this list const int UPGRADE_BUTTON_FONT_SIZE = 36; - const int NUM_UPGRADES = 6; + const int NUM_UPGRADES = 5; const std::string UPGRADE_TEXT[NUM_UPGRADES] = { "Increased rate of fire", "Increased clip size (next reload)", @@ -99,6 +99,13 @@ SceneChange LevelUp::run(RenderWindow &window) { Sound soundClick(SoundHolder::GetSound("assets/sfx/click.ogg")); Sound soundHover(SoundHolder::GetSound("assets/sfx/hover.ogg")); + Sound soundLevelUp(SoundHolder::GetSound("assets/sfx/levelup.ogg")); + + soundLevelUp.play(); + + Music* musicPtr = &MusicHolder::GetMusic("assets/music/TheCyberGrind.ogg"); + musicPtr->play(); + while (window.isOpen()) { // Update frame diff --git a/source/Scenes/Menu.cpp b/source/Scenes/Menu.cpp index 116b34d..78e2e01 100644 --- a/source/Scenes/Menu.cpp +++ b/source/Scenes/Menu.cpp @@ -5,8 +5,9 @@ #include "Game.hpp" #include "../CommonEnum.hpp" #include "../Holders/TextureHolder.hpp" -#include "../Holders/FontHolder.cpp" +#include "../Holders/FontHolder.hpp" #include "../Holders/SoundHolder.hpp" +#include "../Holders/MusicHolder.cpp" #include "../Tools/SetOriginCenter.cpp" #include "../Tools/SetRectangleShapeOnMouseHover.cpp" @@ -28,41 +29,48 @@ SceneChange Menu::run(RenderWindow &window) { playText.setFillColor(Color::Black); playText.setCharacterSize(60); RectangleShape playButton(Vector2f(playText.getLocalBounds().width + BUTTON_PADDING, playText.getLocalBounds().height + BUTTON_PADDING)); + playButton.setFillColor(Color(0x4DB6ACFF)); textSetOriginCenter(playText); shapeSetOriginCenter(playButton); playText.setPosition(logo.getPosition() + Vector2f(0, 400)); playButton.setPosition(playText.getPosition() + Vector2f(0, BUTTON_PADDING / 2)); - Text infoText("Info", fontBebas); - infoText.setFillColor(Color::Black); - infoText.setCharacterSize(60); - RectangleShape infoButton(Vector2f(infoText.getLocalBounds().width + BUTTON_PADDING, infoText.getLocalBounds().height + BUTTON_PADDING)); - textSetOriginCenter(infoText); - shapeSetOriginCenter(infoButton); - infoText.setPosition(playText.getPosition() + Vector2f(0, 100)); - infoButton.setPosition(infoText.getPosition() + Vector2f(0, BUTTON_PADDING / 2)); - Text leaderboardText("Leaderboard", fontBebas); leaderboardText.setFillColor(Color::Black); leaderboardText.setCharacterSize(60); RectangleShape leaderboardButton(Vector2f(leaderboardText.getLocalBounds().width + BUTTON_PADDING, leaderboardText.getLocalBounds().height + BUTTON_PADDING)); textSetOriginCenter(leaderboardText); shapeSetOriginCenter(leaderboardButton); - leaderboardText.setPosition(infoText.getPosition() + Vector2f(0, 100)); + leaderboardText.setPosition(playText.getPosition() + Vector2f(0, 100)); leaderboardButton.setPosition(leaderboardText.getPosition() + Vector2f(0, BUTTON_PADDING / 2)); + Text infoText("Info", fontBebas); + infoText.setFillColor(Color::Black); + infoText.setCharacterSize(60); + RectangleShape infoButton(Vector2f(infoText.getLocalBounds().width + BUTTON_PADDING, infoText.getLocalBounds().height + BUTTON_PADDING)); + textSetOriginCenter(infoText); + shapeSetOriginCenter(infoButton); + infoText.setPosition(leaderboardText.getPosition() + Vector2f(0, 100)); + infoButton.setPosition(infoText.getPosition() + Vector2f(0, BUTTON_PADDING / 2)); + Text exitText("Exit", fontBebas); exitText.setFillColor(Color::Black); exitText.setCharacterSize(60); RectangleShape exitButton(Vector2f(exitText.getLocalBounds().width + BUTTON_PADDING, exitText.getLocalBounds().height + BUTTON_PADDING)); + exitButton.setFillColor(Color(0xE57373FF)); textSetOriginCenter(exitText); shapeSetOriginCenter(exitButton); - exitText.setPosition(leaderboardText.getPosition() + Vector2f(0, 100)); + exitText.setPosition(infoText.getPosition() + Vector2f(0, 100)); exitButton.setPosition(exitText.getPosition() + Vector2f(0, BUTTON_PADDING / 2)); // Sound soundClick(SoundHolder::GetSound("assets/sfx/click.ogg")); // Sound soundHover(SoundHolder::GetSound("assets/sfx/hover.ogg")); + Music* musicPtr = &MusicHolder::GetMusic("assets/music/Spow.ogg"); + musicPtr->setLoop(true); + musicPtr->setVolume(10); + musicPtr->play(); + while (window.isOpen()) { // Update frame Event event; @@ -70,10 +78,10 @@ SceneChange Menu::run(RenderWindow &window) { if (event.type == Event::MouseMoved) { Vector2f mouseScreenPosition = Vector2f(Mouse::getPosition(window)); - setRectangleShapeColorOnMouseHover(playButton, mouseScreenPosition, Color(189, 189, 189), Color::White); + setRectangleShapeColorOnMouseHover(playButton, mouseScreenPosition, Color(0x26A69AFF), Color(0x4DB6ACFF)); setRectangleShapeColorOnMouseHover(infoButton, mouseScreenPosition, Color(189, 189, 189), Color::White); setRectangleShapeColorOnMouseHover(leaderboardButton, mouseScreenPosition, Color(189, 189, 189), Color::White); - setRectangleShapeColorOnMouseHover(exitButton, mouseScreenPosition, Color(189, 189, 189), Color::White); + setRectangleShapeColorOnMouseHover(exitButton, mouseScreenPosition, Color(0xEF5350FF), Color(0xE57373FF)); } if (event.type == Event::MouseButtonPressed) { diff --git a/source/Scenes/Paused.cpp b/source/Scenes/Paused.cpp index dcc6636..f3c5395 100644 --- a/source/Scenes/Paused.cpp +++ b/source/Scenes/Paused.cpp @@ -65,6 +65,9 @@ SceneChange Paused::run(RenderWindow &window) { exitText.setPosition(continueText.getPosition() + Vector2f(0, 100)); exitButton.setPosition(exitText.getPosition() + Vector2f(-BUTTON_PADDING / 2, BUTTON_PADDING / 2)); + Sound soundPaused(SoundHolder::GetSound("assets/sfx/paused.ogg")); + soundPaused.play(); + while (window.isOpen()) { // Update frame Event event;