From c85ded4f94abe09760cb4245c6d024876060dffb Mon Sep 17 00:00:00 2001 From: AaronCode2 Date: Mon, 17 Feb 2025 13:32:25 +0000 Subject: [PATCH 01/39] Update initial level value in LevelManager to 3 --- LevelManager/LevelManager.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/LevelManager/LevelManager.hpp b/LevelManager/LevelManager.hpp index 4289651..0646a3a 100644 --- a/LevelManager/LevelManager.hpp +++ b/LevelManager/LevelManager.hpp @@ -16,7 +16,7 @@ struct LevelManager { public: - int level = 1; + int level = 3; Vector2 playerResetPosition; From aa407015ab75e9fff659e8647eb1d9853e93579c Mon Sep 17 00:00:00 2001 From: AaronCode2 Date: Mon, 17 Feb 2025 13:45:04 +0000 Subject: [PATCH 02/39] Adjust player reset position and update level value; add README for compilation and gameplay instructions --- LevelManager/LevelManager.cpp | 2 +- LevelManager/LevelManager.hpp | 2 +- LevelManager/Levels/LevelDemo.txt | 16 ++++++++-------- README.md | 19 +++++++++++++++++++ 4 files changed, 29 insertions(+), 10 deletions(-) create mode 100644 README.md diff --git a/LevelManager/LevelManager.cpp b/LevelManager/LevelManager.cpp index 482d39e..7321daf 100644 --- a/LevelManager/LevelManager.cpp +++ b/LevelManager/LevelManager.cpp @@ -84,7 +84,7 @@ void LevelManager::update(Player *player, MusicManager *musicManager) { break; case 3: - playerResetPosition = {245, 502}; + playerResetPosition = {225, 502}; break; } diff --git a/LevelManager/LevelManager.hpp b/LevelManager/LevelManager.hpp index 0646a3a..5d04de1 100644 --- a/LevelManager/LevelManager.hpp +++ b/LevelManager/LevelManager.hpp @@ -16,7 +16,7 @@ struct LevelManager { public: - int level = 3; + int level = 2; Vector2 playerResetPosition; diff --git a/LevelManager/Levels/LevelDemo.txt b/LevelManager/Levels/LevelDemo.txt index f55217b..eec616e 100644 --- a/LevelManager/Levels/LevelDemo.txt +++ b/LevelManager/Levels/LevelDemo.txt @@ -34,17 +34,17 @@ P11 P21 /00 P01 S22 S20 /00 /00 /00 /00 /00 /00 /00 /00 S21 S21 /00 /00 /00 /00 #Level 3 ~[ for line 51 & col 128] -/00 /00 /00 /00 T84 /00 /00 /00 /00 /00 /00 C00 p00 -/00 /00 S40 S40 S40 S40 S40 S40 /00 /00 /00 P12 P22 /00 /00 S40 S40 S40 /00 /00 /00 /00 /00 /00 C00 +/00 /00 T48 /00 T84 /00 /00 /00 /00 /00 /00 C00 p00 /00 /00 /00 T76 +/00 /00 S40 S40 S40 S40 S40 S40 /00 /00 /00 P12 P22 /00 /00 S40 S40 S40 /00 /00 /00 /00 /00 T58 C00 /00 /00 /00 /00 S41 S50 S41 /00 /00 /00 /00 /00 /00 /00 /00 /00 S51 S41 S40 S40 /00 /00 P02 S40 P02 -/00 /00 /00 /00 /00 /00 /00 /00 /00 /00 /00 /00 /00 /00 /00 /00 /00 /00 /00 /00 /00 /00 /00 /00 /00 /00 /00 C00 +/00 /00 /00 /00 /00 /00 /00 /00 /00 /00 /00 /00 /00 /00 /00 /00 /00 /00 /00 /00 /00 /00 /00 /00 /00 /00 C00 T57 /00 /00 /00 F21 /00 /00 /00 /00 /00 /00 /00 /00 /00 /00 /00 /00 /00 /00 /00 /00 /00 /00 /00 /00 /00 /00 P02 S40 -/00 /00 /00 P02 /00 /00 /00 /00 /00 /00 /00 /00 /00 /00 /00 /00 /00 /00 /00 /00 /00 /00 /00 /00 C00 -/00 /00 /00 /00 C00 C00 /00 /00 /00 /00 /00 /00 /00 /00 /00 /00 /00 /00 /00 /00 /00 /00 /00 S40 P02 -/00 /00 /00 /00 P12 P22 /00 /00 /00 /00 /00 /00 /00 /00 /00 /00 /00 C00 C00 /00 /00 /00 /00 /00 /00 /00 /00 /00 C00 /00 F10 +/00 /00 /00 P02 /00 /00 /00 /00 /00 /00 /00 /00 /00 /00 /00 T53 /00 /00 /00 /00 /00 /00 /00 T56 C00 +/00 /00 /00 /00 C00 C00 /00 /00 /00 /00 /00 /00 /00 /00 /00 T54 /00 /00 /00 /00 /00 /00 /00 S40 P02 +/00 /00 /00 /00 P12 P22 /00 /00 /00 /00 /00 /00 /00 /00 /00 T55 /00 C00 C00 /00 /00 /00 /00 /00 /00 /00 /00 /00 C00 /00 F10 /00 /00 /00 /00 /00 /00 /00 /00 C00 C00 /00 /00 /00 /00 S40 S40 S40 T52 T52 P02 /00 /00 /00 /00 /00 /00 /00 /00 P02 S40 T52 -/00 /00 /00 /00 /00 /00 /00 C00 /00 /00 C00 /00 /00 S40 S50 S41 S41 /00 /00 /00 /00 /00 /00 C00 C00 -/00 /00 /00 /00 /00 /00 S40 P02 /00 /00 P02 S40 S40 S41 S41 /00 /00 /00 /00 /00 /00 /00 /00 P12 P22 S40 S40 +/00 /00 /00 /00 /00 /00 /00 C00 /00 /00 C00 /00 /00 S40 S50 S41 S41 /00 /00 /00 /00 /00 /00 C00 C00 /00 T17 +/00 /00 /00 /00 T86 /00 S40 P02 /00 /00 P02 S40 S40 S41 S41 /00 /00 /00 /00 /00 /00 /00 /00 P12 P22 S40 S40 /00 /00 /00 T52 S40 S40 S51 /00 /00 /00 /00 /00 S51 /00 /00 /00 /00 /00 /00 /00 /00 /00 /00 /00 /00 /00 /00 /00 /00 S40 P12 P22 S40 S40 /00 C00 C00 C00 /00 /00 /00 /00 /00 /00 /00 /00 /00 /00 /00 /00 /00 /00 /00 /00 /00 /00 S51 S40 P02 diff --git a/README.md b/README.md new file mode 100644 index 0000000..8f90f58 --- /dev/null +++ b/README.md @@ -0,0 +1,19 @@ +# How To Complie + +### Hopefully you have a **C++ Complier**, **CMake** and **VsCode** installed to work. + +1. Download as a Zip or use Git +2. Open the Project with Vscode and install the C/C++ Extension Pack +3. It should come with a option of what Complier to use, use the complier that fits you (a GCC is recommended) +4. Once done, open the Terminal in this directory or you could use the built-in one in Vscode. +5. Check if Cmake has created the build file or you have done it wrong ❌ +6. Type this command + + cmake --build build + +# How To Play + +- Use WASD or Arrow keys to move +- To Jump use the W, Up Arrow or even the Space Bar +- Try to reach the Sign and Hoepful not fall due to Gravity +- Most Important: Have Fun! 🎮😊 From 3513d7fe1183eae08b54f01eed955958acec917f Mon Sep 17 00:00:00 2001 From: AaronCode2 Date: Mon, 17 Feb 2025 13:53:22 +0000 Subject: [PATCH 03/39] Update initial level value in LevelManager to 1 and adjust LevelDemo.txt accordingly --- LevelManager/LevelManager.hpp | 2 +- LevelManager/Levels/LevelDemo.txt | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/LevelManager/LevelManager.hpp b/LevelManager/LevelManager.hpp index 5d04de1..4289651 100644 --- a/LevelManager/LevelManager.hpp +++ b/LevelManager/LevelManager.hpp @@ -16,7 +16,7 @@ struct LevelManager { public: - int level = 2; + int level = 1; Vector2 playerResetPosition; diff --git a/LevelManager/Levels/LevelDemo.txt b/LevelManager/Levels/LevelDemo.txt index eec616e..1cb767c 100644 --- a/LevelManager/Levels/LevelDemo.txt +++ b/LevelManager/Levels/LevelDemo.txt @@ -18,10 +18,10 @@ S00 P00 /00 /00 S73 S01 S00 C00 /00 /00 /00 /00 /00 /00 /00 /00 /00 /00 T38 #Level 2 ~[ for line 35 & col 128] /00 /00 /00 /00 /00 /00 /00 /00 /00 /00 /00 /00 /00 /00 /00 /00 /00 /00 /00 /00 /00 /00 /00 /00 /00 /00 /00 C00 -/00 /00 T75 /00 /00 /00 /00 /00 /00 /00 /00 /00 /00 /00 /00 /00 /00 /00 /00 /00 /00 /00 /00 /00 /00 /00 /00 P01 /00 /00 T83 -T23 S20 S20 S22 /00 /00 /00 /00 /00 /00 /00 /00 T23 S20 S20 P01 /00 T34 /00 /00 /00 C00 C00 /00 /00 /00 /00 /00 /00 /00 S22 +/00 /00 T75 /00 /00 /00 /00 /00 /00 /00 /00 /00 /00 /00 T18 /00 /00 /00 /00 /00 /00 /00 /00 /00 /00 /00 /00 P01 /00 /00 T83 +T23 S20 S20 S22 /00 /00 /00 /00 /00 /00 /00 /00 T23 S20 S20 P01 /00 T34 /00 /00 /00 C00 C00 T88 /00 /00 /00 /00 /00 /00 S22 /00 /00 S31 S21 /00 /00 /00 C00 /00 S20 S22 /00 /00 /00 /00 /00 T25 T35 T45 S20 S20 T23 T23 S20 S20 -/00 F01 S21 /00 /00 /00 /00 P01 S22 S21 /00 /00 /00 /00 /00 /00 /00 T36 /00 +/00 F01 S21 /00 /00 /00 /00 P01 S22 S21 /00 /00 /00 /00 /00 /00 /00 T36 /00 S20 /00 /00 /00 /00 /00 /00 /00 /00 /00 /00 /00 /00 /00 /00 /00 T37 /00 /00 /00 C00 C00 /00 /00 /00 /00 /00 /00 /00 /00 /00 /00 /00 /00 T28 /00 /00 /00 P11 P21 S20 S20 /00 /00 /00 /00 /00 /00 /00 /00 /00 /00 T28 /00 /00 /00 /00 /00 /00 /00 /00 /00 /00 C00 C00 From 50ba2fb46b83636020193fb3e4ec287603b8c377 Mon Sep 17 00:00:00 2001 From: AaronCode2 Date: Mon, 17 Feb 2025 14:09:23 +0000 Subject: [PATCH 04/39] Refactor LevelManager methods to simplify object creation and remove redundant parameters --- LevelManager/LevelManager.cpp | 139 ++++++++++------------------------ LevelManager/LevelManager.hpp | 10 +-- 2 files changed, 43 insertions(+), 106 deletions(-) diff --git a/LevelManager/LevelManager.cpp b/LevelManager/LevelManager.cpp index 7321daf..ef394fe 100644 --- a/LevelManager/LevelManager.cpp +++ b/LevelManager/LevelManager.cpp @@ -117,6 +117,7 @@ void LevelManager::readData() { std::cerr << "\033[31mCould Not Open Level File\n\033[0m"; std::string line; + float y = 0.0f; float tileCounter = 0.0f; @@ -140,6 +141,14 @@ void LevelManager::readData() { for(size_t x = 0; x < line.length(); x++) { + object = { + + tileCounter * utils::getSize().x, + y * utils::getSize().y, + utils::getSize().x, + utils::getSize().y + }; + switch(line[x]) { case '/': tileCounter++; @@ -149,19 +158,22 @@ void LevelManager::readData() { case 'P': case 'S': - createTiles(y, tileCounter, line, x); + createTiles( tileCounter, line, x); + tileCounter++; break; case 'p': case 'g': - createSlime(y, tileCounter, line, x); + createSlime( tileCounter, line, x); + tileCounter++; break; case 'C': case 'F': - createItem(y, tileCounter, line, x); + createItem( tileCounter, line, x); + tileCounter++; break; } } if(line.find('#') == std::string::npos) y++; @@ -204,123 +216,50 @@ void LevelManager::makeBackgroundTiles() { } void LevelManager::createItem( - float y, float &tileCounter, + float &tileCounter, std::string line, size_t x ) { - bool skip = false; - - Rectangle object = { - - tileCounter * utils::getSize().x, - y * utils::getSize().y, - utils::getSize().x, - utils::getSize().y - }; - if(line[x] == 'F') object.y -= 10; - for(auto &item : items) { - - if(item.object.x == object.x && item.object.y == object.y) { - - skip = true; - break; - } - } + items.push_back(Item( - if(!skip) { - items.push_back(Item( - - object, - { - (float) line[x + 1] - adjust, - (float) line[x + 2] - adjust - }, - (line[x] == 'F') ? Fruit : Coin - )); - } - - tileCounter++; + object, + { + (float) line[x + 1] - adjust, + (float) line[x + 2] - adjust + }, + (line[x] == 'F') ? Fruit : Coin + )); } void LevelManager::createSlime( - float y, float &tileCounter, + float &tileCounter, std::string line, size_t x ) { - bool skip = false; - - Rectangle object = { - - tileCounter * utils::getSize().x, - y * utils::getSize().y, - utils::getSize().x, - utils::getSize().y - }; - - for(auto &slime : slimes) { - - if(slime.object.x == object.x && slime.object.y == object.y) { - - skip = true; - break; - } - } + slimes.push_back(Slime( - if(!skip) { - - slimes.push_back(Slime( - - object, - (line[x] == 'g') ? Green : Purple - )); - } - - tileCounter++; + object, + (line[x] == 'g') ? Green : Purple + )); } void LevelManager::createTiles( - float y, float &tileCounter, + float &tileCounter, std::string line, size_t x ) { - bool skip = false; - - // Screen Width Default: 1600 Screen Height Default: 811 - - Rectangle object = { - - tileCounter * utils::getSize().x, - y * utils::getSize().y, - utils::getSize().x, - utils::getSize().y - }; - - for(auto &tile : tiles) { - - if(tile.object.x == object.x && tile.object.y == object.y) { - - skip = true; - break; - } - } - - if(!skip) { - - tiles.push_back(PlatFormTile( - object, - (line[x] == 'P') ? PlatForm : Tile, - { - (float) line[x + 1] - adjust, - (float) line[x + 2] - adjust, - }, - (line[x] != 'T') ? true : false - )); - } - - tileCounter++; + tiles.push_back(PlatFormTile( + object, + (line[x] == 'P') ? PlatForm : Tile, + { + (float) line[x + 1] - adjust, + (float) line[x + 2] - adjust, + }, + (line[x] != 'T') ? true : false + )); } \ No newline at end of file diff --git a/LevelManager/LevelManager.hpp b/LevelManager/LevelManager.hpp index 4289651..297dc4f 100644 --- a/LevelManager/LevelManager.hpp +++ b/LevelManager/LevelManager.hpp @@ -36,19 +36,17 @@ struct LevelManager { private: const int adjust = 48; + Rectangle object; - void createItem( - float y, float &tileCounter, + void createItem( float &tileCounter, std::string line, size_t x ); - void createSlime( - float y, float &tileCounter, + void createSlime( float &tileCounter, std::string line, size_t x ); - void createTiles( - float y, float &tileCounter, + void createTiles( float &tileCounter, std::string line, size_t x ); }; \ No newline at end of file From c415eeeda5758d2fa0541a3a4ceb2af6827ece6f Mon Sep 17 00:00:00 2001 From: AaronCode2 Date: Mon, 17 Feb 2025 14:29:44 +0000 Subject: [PATCH 05/39] Update LevelManager to set initial level to 4 and display "THANK YOU!" message in level 4 --- LevelManager/LevelManager.cpp | 8 ++++++++ LevelManager/LevelManager.hpp | 2 +- LevelManager/Levels/LevelDemo.txt | 18 +++++++++++++++++- 3 files changed, 26 insertions(+), 2 deletions(-) diff --git a/LevelManager/LevelManager.cpp b/LevelManager/LevelManager.cpp index ef394fe..3c73193 100644 --- a/LevelManager/LevelManager.cpp +++ b/LevelManager/LevelManager.cpp @@ -86,6 +86,14 @@ void LevelManager::update(Player *player, MusicManager *musicManager) { case 3: playerResetPosition = {225, 502}; break; + + case 4: + + DrawText("THANK YOU!", + GetScreenWidth() - 20, GetScreenHeight() - 20, + 20, BLACK + ); + break; } player->resetPosition = playerResetPosition; diff --git a/LevelManager/LevelManager.hpp b/LevelManager/LevelManager.hpp index 297dc4f..c537fd7 100644 --- a/LevelManager/LevelManager.hpp +++ b/LevelManager/LevelManager.hpp @@ -16,7 +16,7 @@ struct LevelManager { public: - int level = 1; + int level = 4; Vector2 playerResetPosition; diff --git a/LevelManager/Levels/LevelDemo.txt b/LevelManager/Levels/LevelDemo.txt index 1cb767c..7da16e8 100644 --- a/LevelManager/Levels/LevelDemo.txt +++ b/LevelManager/Levels/LevelDemo.txt @@ -48,4 +48,20 @@ P11 P21 /00 P01 S22 S20 /00 /00 /00 /00 /00 /00 /00 /00 S21 S21 /00 /00 /00 /00 /00 /00 /00 T52 S40 S40 S51 /00 /00 /00 /00 /00 S51 /00 /00 /00 /00 /00 /00 /00 /00 /00 /00 /00 /00 /00 /00 /00 /00 S40 P12 P22 S40 S40 /00 C00 C00 C00 /00 /00 /00 /00 /00 /00 /00 /00 /00 /00 /00 /00 /00 /00 /00 /00 /00 /00 S51 S40 P02 -P12 P22 \ No newline at end of file +P12 P22 +#Level 4 ~[ for 🔚] +/00 /00 /00 /00 /00 /00 C00 F21 F21 F21 F21 F21 F21 F21 F21 F21 F21 F21 F21 F21 F21 F21 F21 F21 F21 C00 +/00 /00 /00 /00 /00 /00 C00 F21 F21 F21 F21 F21 F21 F21 F21 F21 F21 F21 F21 F21 F21 F21 F21 F21 F21 C00 +/00 /00 /00 /00 /00 /00 C00 F21 F21 F21 F21 F21 F21 F21 F21 F21 F21 F21 F21 F21 F21 F21 F21 F21 F21 C00 +/00 /00 /00 /00 /00 /00 C00 F21 F21 F21 F21 F21 F21 F21 F21 F21 F21 F21 F21 F21 F21 F21 F21 F21 F21 C00 +/00 /00 /00 /00 /00 /00 C00 F21 F21 F21 F21 F21 F21 F21 F21 F21 F21 F21 F21 F21 F21 F21 F21 F21 F21 C00 +/00 /00 /00 /00 /00 /00 C00 F21 F21 F21 F21 F21 F21 F21 F21 F21 F21 F21 F21 F21 F21 F21 F21 F21 F21 C00 +/00 /00 /00 /00 /00 /00 C00 F21 F21 F21 F21 F21 F21 F21 F21 F21 F21 F21 F21 F21 F21 F21 F21 F21 F21 C00 +/00 /00 /00 /00 /00 /00 C00 F21 F21 F21 F21 F21 F21 F21 F21 F21 F21 F21 F21 F21 F21 F21 F21 F21 F21 C00 +/00 /00 /00 /00 /00 /00 C00 F21 F21 F21 F21 F21 F21 F21 F21 F21 F21 F21 F21 F21 F21 F21 F21 F21 F21 C00 +/00 /00 /00 /00 /00 /00 C00 F21 F21 F21 F21 F21 F21 F21 F21 F21 F21 F21 F21 F21 F21 F21 F21 F21 F21 C00 +/00 /00 /00 /00 /00 /00 C00 F21 F21 F21 F21 F21 F21 F21 F21 F21 F21 F21 F21 F21 F21 F21 F21 F21 F21 C00 +/00 /00 /00 /00 /00 /00 C00 F21 F21 F21 F21 F21 F21 F21 F21 F21 F21 F21 F21 F21 F21 F21 F21 F21 F21 C00 +/00 /00 /00 /00 /00 /00 C00 F21 F21 F21 F21 F21 F21 F21 F21 F21 F21 F21 F21 F21 F21 F21 F21 F21 F21 C00 +/00 /00 /00 /00 /00 /00 C00 F21 F21 F21 F21 F21 F21 F21 F21 F21 F21 F21 F21 F21 F21 F21 F21 F21 F21 C00 +/00 /00 /00 /00 /00 /00 P13 P23 P13 P23 P13 P23 P13 P23 P13 P23 P13 P23 P13 P23 P13 P23 P13 P23 P13 P23 \ No newline at end of file From 78b3a47cdb4fe5007387630bfea2bbd9304e190a Mon Sep 17 00:00:00 2001 From: AaronCode2 Date: Mon, 17 Feb 2025 15:01:38 +0000 Subject: [PATCH 06/39] Refactor Game and LevelManager to improve game loop logic and reset initial level to 1 --- Game.cpp | 29 +++++++++++------------------ Game.hpp | 2 +- LevelManager/LevelManager.cpp | 7 ++++--- LevelManager/LevelManager.hpp | 2 +- 4 files changed, 17 insertions(+), 23 deletions(-) diff --git a/Game.cpp b/Game.cpp index dc4204c..ade9842 100644 --- a/Game.cpp +++ b/Game.cpp @@ -16,8 +16,11 @@ void Game::GameLoop() { while(!WindowShouldClose()) { BeginDrawing(); - ClearBackground(GRAY); - updateGame(); + levelManager.clearBackground(); + + if(startMainGame) + updateGame(); + EndDrawing(); } @@ -27,15 +30,6 @@ void Game::GameLoop() { void Game::updateGame() { - levelManager.clearBackground(); - musicManager.playMusic(); - - if(IsKeyDown(KEY_Q)) { - - levelManager.readData(); - levelManager.makeBackgroundTiles(); - } - if(IsWindowResized()) { levelManager.tiles.clear(); @@ -44,17 +38,16 @@ void Game::updateGame() { levelManager.readData(); levelManager.makeBackgroundTiles(); } - - if(IsKeyDown(KEY_C)) { - - levelManager.tiles.clear(); - levelManager.items.clear(); - levelManager.slimes.clear(); - } + musicManager.playMusic(); levelManager.update(&player, &musicManager); } +bool Game::startMainGame() { + + +} + Game::~Game() { levelManager.destroy(); diff --git a/Game.hpp b/Game.hpp index 5896d8a..b999d15 100644 --- a/Game.hpp +++ b/Game.hpp @@ -17,7 +17,6 @@ class Game { LevelManager levelManager; MusicManager musicManager; - Player player = Player( { 325, @@ -32,4 +31,5 @@ class Game { void GameLoop(); void updateGame(); + bool startMainGame(); }; \ No newline at end of file diff --git a/LevelManager/LevelManager.cpp b/LevelManager/LevelManager.cpp index 3c73193..592afeb 100644 --- a/LevelManager/LevelManager.cpp +++ b/LevelManager/LevelManager.cpp @@ -89,9 +89,10 @@ void LevelManager::update(Player *player, MusicManager *musicManager) { case 4: - DrawText("THANK YOU!", - GetScreenWidth() - 20, GetScreenHeight() - 20, - 20, BLACK + DrawText( + "THANK YOU!", + (GetScreenWidth() / 2) - 300, (GetScreenHeight() / 2) - 100, + 100, BLACK ); break; } diff --git a/LevelManager/LevelManager.hpp b/LevelManager/LevelManager.hpp index c537fd7..297dc4f 100644 --- a/LevelManager/LevelManager.hpp +++ b/LevelManager/LevelManager.hpp @@ -16,7 +16,7 @@ struct LevelManager { public: - int level = 4; + int level = 1; Vector2 playerResetPosition; From c63925116e7e4959e593469251cf10d24c3101a1 Mon Sep 17 00:00:00 2001 From: AaronCode2 Date: Mon, 17 Feb 2025 15:36:57 +0000 Subject: [PATCH 07/39] Refactor Game loop and add floating text effect; implement mouseOver utility function --- Assets/sprites/Play.png | Bin 0 -> 971 bytes Game.cpp | 39 ++++++++++++++++++++++++++++++++++++--- Game.hpp | 5 +++++ utils.cpp | 5 ++++- utils.hpp | 2 ++ 5 files changed, 47 insertions(+), 4 deletions(-) create mode 100644 Assets/sprites/Play.png diff --git a/Assets/sprites/Play.png b/Assets/sprites/Play.png new file mode 100644 index 0000000000000000000000000000000000000000..6e5ac2701b47349d47a5b817f60ce65f0548dbaf GIT binary patch literal 971 zcmeAS@N?(olHy`uVBq!ia0vp^2Y}dtgAGXfWtsE*45L`*eNkI7~IwV)&KKL z!BWc!>#Qq&FDzL1@LcmA@#mKhU+r!V-*okLcK`Cp(+X9JCyKg0n14pv>BsGjJ<30= z{-^8_+Q4)>)a3p4IG^@eq9(#zz*F8D+`|lU- zmizm@#>`r?3P`_=i$Av8dgtn_cj*i}Ci49^1uETE{kPs#VdnXynW7ANf_1;I70=wh zDu{tYinU=uARg+jRzv*$pO+VGGdy0G$m(!GgQ0(e)fRo*<01@A(=;2jW}7Fp`MUi( zwPt5{`tnaNUKZbc^;MIp8|Wh-e_eaylsnN2R&Neo7bX_US%32x@0H+fCp9*ER+O1U z+E#ws@Hde4#qaI*pPt?QeTnzu=EWypJ$-##q#^Zsp~`&we`n6rznkqScq3itpJ~^D zb&Ec9PqC5AD>Hex(?o1$TYc}(?W;Z=sU;OJ*&%pYH{e$>l#wi!% z59t14wg8H3f5HDi;xFT!qD%4#g*8e_N{|2U^*X*>wf^3hIlkvYOYfLnlwTnG>M!FY zMjfu?xy7co`(8$v2-N*P_3ubbs_?5vKaTw9npHk^-QpLg}i|Y=kNV* z&r8eMb5_6FF+1qCuuK#~tQXq`jh@nTSHJvNmYmuAYFUMR_km|`XRTkwl5ZfD_s?{q zP5-s4d-%RCclsf;>C4)%q8L3phV5sMuU^kT$42bvaV3rFwc0g0OtZIVmsWgNQHwsB zST*nCzj>F}+ii`V7hh56Z6v{K-ssOBUtDv~UP8MiAnS9g>Iv>$WrbFejHjG(wLdJZ z=Z%`a_K|_Df01gzMx&MM8DcKJ7n9GMerw4tCV@KpDXq7{9(30od@8;5A4ALkw%6(o z<$t^4rk>iJX#J=1`)83G{{{c83A1BXIqYF@cI!?nfq&93E%S1Zt!BIbXHw#x)d#OQ)ibEx`pdWqt}cZAFQW(~9x9stF}wpZ4SzB3 jaIReS3j3^P6 #include #include "Classes/Sprite.hpp" #include "Classes/Player.hpp" @@ -13,10 +14,14 @@ class Game { ~Game(); private: + + Texture2D playBtn = LoadTexture("../Assets/sprites/Play.png"); LevelManager levelManager; MusicManager musicManager; + float time = 0; + Player player = Player( { 325, diff --git a/utils.cpp b/utils.cpp index 50eebba..09d9d04 100644 --- a/utils.cpp +++ b/utils.cpp @@ -10,4 +10,7 @@ Vector2 utils::getSize() { (GetScreenWidth() / 1600.0f) * defaultSize, (GetScreenHeight() / 811.0f) * defaultSize, }; -} \ No newline at end of file +} + +void utils::mouseOver(Rectangle object) { +} diff --git a/utils.hpp b/utils.hpp index c930417..77da140 100644 --- a/utils.hpp +++ b/utils.hpp @@ -6,4 +6,6 @@ namespace utils { extern Color testColor; Vector2 getSize(); + + void mouseOver(Rectangle object); } \ No newline at end of file From 199cc915f353dc23ce80453bfe602902f89883e5 Mon Sep 17 00:00:00 2001 From: AaronCode2 Date: Mon, 17 Feb 2025 15:58:47 +0000 Subject: [PATCH 08/39] Implement mouseOver utility function and integrate it into the game loop; adjust button rendering logic --- Game.cpp | 45 +++++++++++++++++++++++++++------------------ Game.hpp | 2 ++ utils.cpp | 7 ++++++- utils.hpp | 2 +- 4 files changed, 36 insertions(+), 20 deletions(-) diff --git a/Game.cpp b/Game.cpp index 33e3579..ec055bd 100644 --- a/Game.cpp +++ b/Game.cpp @@ -48,37 +48,46 @@ bool Game::startMainGame() { float yOffset = sin(time * 2.0) * 25; - DrawText( - "Floating Kingdom", - (GetScreenWidth() / 2) - 400, - ((GetScreenHeight() / 3) - 100) + yOffset, - 100, - GOLD - ); - Rectangle src = { 0, - src.height, + playBtn.height / 2.0f, (float) playBtn.width / 2, (float) playBtn.height / 2 }; - Rectangle dest = { + Rectangle object = { - 340, - 280, + (float) (GetScreenWidth() / 2) - 150, + (float) (GetScreenHeight() / 2), 300, 100 }; - DrawTexturePro( - playBtn, - src, dest, - {0, 0}, 0, WHITE - ); + if(utils::mouseOver(object)) { + src.x = src.width; + + if(IsMouseButtonDown(MOUSE_BUTTON_LEFT)) startGame = true; + } + + if(!startGame) { + + DrawTexturePro( + playBtn, + src, object, + {0, 0}, 0, WHITE + ); + + DrawText( + "Floating Kingdom", + (GetScreenWidth() / 2) - 400, + ((GetScreenHeight() / 3) - 100) + yOffset, + 100, + GOLD + ); + } - return false; + return startGame; } Game::~Game() { diff --git a/Game.hpp b/Game.hpp index 2b9feff..3278fa3 100644 --- a/Game.hpp +++ b/Game.hpp @@ -1,6 +1,7 @@ #pragma once #include #include +#include "utils.hpp" #include "Classes/Sprite.hpp" #include "Classes/Player.hpp" #include "MusicManager/MusicManager.hpp" @@ -21,6 +22,7 @@ class Game { MusicManager musicManager; float time = 0; + bool startGame = false; Player player = Player( { diff --git a/utils.cpp b/utils.cpp index 09d9d04..0ab93ab 100644 --- a/utils.cpp +++ b/utils.cpp @@ -12,5 +12,10 @@ Vector2 utils::getSize() { }; } -void utils::mouseOver(Rectangle object) { +bool utils::mouseOver(Rectangle object) { + + if(CheckCollisionPointRec(GetMousePosition(), object)) + return true; + + return false; } diff --git a/utils.hpp b/utils.hpp index 77da140..f71bfac 100644 --- a/utils.hpp +++ b/utils.hpp @@ -7,5 +7,5 @@ namespace utils { Vector2 getSize(); - void mouseOver(Rectangle object); + bool mouseOver(Rectangle object); } \ No newline at end of file From 2093c9d325f9914ea61beba33437bcd66d07d2a0 Mon Sep 17 00:00:00 2001 From: AaronCode2 Date: Mon, 17 Feb 2025 16:00:12 +0000 Subject: [PATCH 09/39] Refactor MusicManager methods for improved readability and consistency --- MusicManager/MusicManager.hpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/MusicManager/MusicManager.hpp b/MusicManager/MusicManager.hpp index 007ec80..89f887a 100644 --- a/MusicManager/MusicManager.hpp +++ b/MusicManager/MusicManager.hpp @@ -13,9 +13,9 @@ struct MusicManager { public: - void init() { PlayMusicStream(mainMusic); }; - void playMusic() { UpdateMusicStream(mainMusic); }; - void destroy() { UnloadMusicStream(mainMusic); }; + void init() { PlayMusicStream(mainMusic); }; + void playMusic() { UpdateMusicStream(mainMusic); }; + void destroy() { UnloadMusicStream(mainMusic); }; void playSoundEffect(SoundEffect soundEffect); From fac20517ea38b90281cb79a87554bd73eb0af2c2 Mon Sep 17 00:00:00 2001 From: AaronCode2 Date: Mon, 17 Feb 2025 16:02:12 +0000 Subject: [PATCH 10/39] Update README.md for clarity on compiler selection process --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 8f90f58..ec33f07 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ 1. Download as a Zip or use Git 2. Open the Project with Vscode and install the C/C++ Extension Pack -3. It should come with a option of what Complier to use, use the complier that fits you (a GCC is recommended) +3. It should come with a option of what Complier to use - you may have to reopen VsCode, use the complier that fits you (a GCC is recommended) 4. Once done, open the Terminal in this directory or you could use the built-in one in Vscode. 5. Check if Cmake has created the build file or you have done it wrong ❌ 6. Type this command From 002abd28a2df4199a2083923c80dc081d547eaf9 Mon Sep 17 00:00:00 2001 From: AaronCode2 Date: Mon, 17 Feb 2025 16:02:23 +0000 Subject: [PATCH 11/39] Update README.md to clarify compiler selection instructions --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index ec33f07..d62459f 100644 --- a/README.md +++ b/README.md @@ -5,6 +5,7 @@ 1. Download as a Zip or use Git 2. Open the Project with Vscode and install the C/C++ Extension Pack 3. It should come with a option of what Complier to use - you may have to reopen VsCode, use the complier that fits you (a GCC is recommended) + 4. Once done, open the Terminal in this directory or you could use the built-in one in Vscode. 5. Check if Cmake has created the build file or you have done it wrong ❌ 6. Type this command From 79103e9a94c7317a52de9a2329a9c464924be709 Mon Sep 17 00:00:00 2001 From: AaronCode2 Date: Mon, 17 Feb 2025 16:03:39 +0000 Subject: [PATCH 12/39] Update README.md for improved clarity on compiler selection instructions --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index d62459f..3d23bc5 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ 1. Download as a Zip or use Git 2. Open the Project with Vscode and install the C/C++ Extension Pack -3. It should come with a option of what Complier to use - you may have to reopen VsCode, use the complier that fits you (a GCC is recommended) +3. It should come with a option of what Complier to use - you may have to reopen VsCode - use the complier that fits you (a GCC is recommended) 4. Once done, open the Terminal in this directory or you could use the built-in one in Vscode. 5. Check if Cmake has created the build file or you have done it wrong ❌ From a80804f99c12e2b37f71bc4a8e103f41a096b046 Mon Sep 17 00:00:00 2001 From: AaronCode2 Date: Mon, 17 Feb 2025 16:10:23 +0000 Subject: [PATCH 13/39] Add initial workspace configuration with folder structure and editor settings --- .code-workspace.json | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 .code-workspace.json diff --git a/.code-workspace.json b/.code-workspace.json new file mode 100644 index 0000000..d0bee12 --- /dev/null +++ b/.code-workspace.json @@ -0,0 +1,15 @@ +{ + "folders": [ + { "path": "Assets" }, + { "path": "build" }, + { "path": "Classes" }, + { "path": "LevelManager" }, + { "path": "MusicManager" } + ], + "settings": { + "editor.fontSize": 14, + "files.exclude": { + "**/.git": true + } + } +} \ No newline at end of file From 8126b8260c54a18977739cf57d316cc3ff36fb03 Mon Sep 17 00:00:00 2001 From: AaronCode2 Date: Mon, 17 Feb 2025 16:14:16 +0000 Subject: [PATCH 14/39] Replace workspace configuration with a new structure and settings --- .code-workspace.json | 15 --------- Floating Kingdom.code-workspace | 59 +++++++++++++++++++++++++++++++++ 2 files changed, 59 insertions(+), 15 deletions(-) delete mode 100644 .code-workspace.json create mode 100644 Floating Kingdom.code-workspace diff --git a/.code-workspace.json b/.code-workspace.json deleted file mode 100644 index d0bee12..0000000 --- a/.code-workspace.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "folders": [ - { "path": "Assets" }, - { "path": "build" }, - { "path": "Classes" }, - { "path": "LevelManager" }, - { "path": "MusicManager" } - ], - "settings": { - "editor.fontSize": 14, - "files.exclude": { - "**/.git": true - } - } -} \ No newline at end of file diff --git a/Floating Kingdom.code-workspace b/Floating Kingdom.code-workspace new file mode 100644 index 0000000..b474dbe --- /dev/null +++ b/Floating Kingdom.code-workspace @@ -0,0 +1,59 @@ +{ + "folders": [ + { + "path": "." + } + ], + "settings": { + "files.associations": { + "*.tcc": "cpp", + "array": "cpp", + "atomic": "cpp", + "bit": "cpp", + "cctype": "cpp", + "clocale": "cpp", + "cmath": "cpp", + "compare": "cpp", + "concepts": "cpp", + "cstdarg": "cpp", + "cstddef": "cpp", + "cstdint": "cpp", + "cstdio": "cpp", + "cstdlib": "cpp", + "cwchar": "cpp", + "cwctype": "cpp", + "deque": "cpp", + "map": "cpp", + "string": "cpp", + "unordered_map": "cpp", + "vector": "cpp", + "exception": "cpp", + "algorithm": "cpp", + "functional": "cpp", + "iterator": "cpp", + "memory": "cpp", + "memory_resource": "cpp", + "numeric": "cpp", + "optional": "cpp", + "random": "cpp", + "string_view": "cpp", + "system_error": "cpp", + "tuple": "cpp", + "type_traits": "cpp", + "utility": "cpp", + "fstream": "cpp", + "initializer_list": "cpp", + "iosfwd": "cpp", + "iostream": "cpp", + "istream": "cpp", + "limits": "cpp", + "new": "cpp", + "numbers": "cpp", + "ostream": "cpp", + "stdexcept": "cpp", + "streambuf": "cpp", + "cinttypes": "cpp", + "typeinfo": "cpp" + } + } +} \ No newline at end of file From 188510ed309026da50073f89f2311ec5072f6620 Mon Sep 17 00:00:00 2001 From: AaronCode2 Date: Mon, 17 Feb 2025 16:16:50 +0000 Subject: [PATCH 15/39] Remove unnecessary blank lines in App.cpp for cleaner code --- App.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/App.cpp b/App.cpp index 99d36f5..a6aa099 100644 --- a/App.cpp +++ b/App.cpp @@ -7,11 +7,9 @@ void App::run() { InitWindow(1440, 750, "Floating Kingdom"); InitAudioDevice(); - MaximizeWindow(); SetTargetFPS(60); - Game 🎮; } \ No newline at end of file From df9a8da4bc177535cb8565374d2b69e60c04ad52 Mon Sep 17 00:00:00 2001 From: AaronCode2 Date: Mon, 17 Feb 2025 16:30:47 +0000 Subject: [PATCH 16/39] Fix typo in LevelDemo.txt by correcting T84 to T83 and ensure proper newline at end of file --- LevelManager/Levels/LevelDemo.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/LevelManager/Levels/LevelDemo.txt b/LevelManager/Levels/LevelDemo.txt index 7da16e8..9dc7999 100644 --- a/LevelManager/Levels/LevelDemo.txt +++ b/LevelManager/Levels/LevelDemo.txt @@ -34,7 +34,7 @@ P11 P21 /00 P01 S22 S20 /00 /00 /00 /00 /00 /00 /00 /00 S21 S21 /00 /00 /00 /00 #Level 3 ~[ for line 51 & col 128] -/00 /00 T48 /00 T84 /00 /00 /00 /00 /00 /00 C00 p00 /00 /00 /00 T76 +/00 /00 T48 /00 T83 /00 /00 /00 /00 /00 /00 C00 p00 /00 /00 /00 T76 /00 /00 S40 S40 S40 S40 S40 S40 /00 /00 /00 P12 P22 /00 /00 S40 S40 S40 /00 /00 /00 /00 /00 T58 C00 /00 /00 /00 /00 S41 S50 S41 /00 /00 /00 /00 /00 /00 /00 /00 /00 S51 S41 S40 S40 /00 /00 P02 S40 P02 /00 /00 /00 /00 /00 /00 /00 /00 /00 /00 /00 /00 /00 /00 /00 /00 /00 /00 /00 /00 /00 /00 /00 /00 /00 /00 C00 T57 @@ -64,4 +64,4 @@ P12 P22 /00 /00 /00 /00 /00 /00 C00 F21 F21 F21 F21 F21 F21 F21 F21 F21 F21 F21 F21 F21 F21 F21 F21 F21 F21 C00 /00 /00 /00 /00 /00 /00 C00 F21 F21 F21 F21 F21 F21 F21 F21 F21 F21 F21 F21 F21 F21 F21 F21 F21 F21 C00 /00 /00 /00 /00 /00 /00 C00 F21 F21 F21 F21 F21 F21 F21 F21 F21 F21 F21 F21 F21 F21 F21 F21 F21 F21 C00 -/00 /00 /00 /00 /00 /00 P13 P23 P13 P23 P13 P23 P13 P23 P13 P23 P13 P23 P13 P23 P13 P23 P13 P23 P13 P23 \ No newline at end of file +/00 /00 /00 /00 P13 P23 P13 P23 P13 P23 P13 P23 P13 P23 P13 P23 P13 P23 P13 P23 P13 P23 P13 P23 P13 P23 \ No newline at end of file From bf1d531f03ac46f1fb7e5d0d0f8f44d1c2ec4930 Mon Sep 17 00:00:00 2001 From: AaronCode2 Date: Mon, 17 Feb 2025 16:32:58 +0000 Subject: [PATCH 17/39] Fix typo in README.md by correcting "Hoepful" to "Hopeful" --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 3d23bc5..5544f32 100644 --- a/README.md +++ b/README.md @@ -16,5 +16,5 @@ - Use WASD or Arrow keys to move - To Jump use the W, Up Arrow or even the Space Bar -- Try to reach the Sign and Hoepful not fall due to Gravity +- Try to reach the Sign and Hopeful not fall due to Gravity - Most Important: Have Fun! 🎮😊 From 0f179fce47040f17c1892b7bbab955e183234fe8 Mon Sep 17 00:00:00 2001 From: AaronCode2 Date: Mon, 17 Feb 2025 16:56:01 +0000 Subject: [PATCH 18/39] Update README.md --- README.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/README.md b/README.md index 3d23bc5..e679e96 100644 --- a/README.md +++ b/README.md @@ -18,3 +18,9 @@ - To Jump use the W, Up Arrow or even the Space Bar - Try to reach the Sign and Hoepful not fall due to Gravity - Most Important: Have Fun! 🎮😊 + + # Info + + - The Assets are CC0 + - This is a Raylib C++ Project + - You can do anything with this project From 51fd9791f39c1f10d86df3ca5caf8fd7a02890ef Mon Sep 17 00:00:00 2001 From: AaronCode2 Date: Mon, 17 Feb 2025 16:57:50 +0000 Subject: [PATCH 19/39] Update README.md to add project information and clarify asset usage --- README.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/README.md b/README.md index 5544f32..5107def 100644 --- a/README.md +++ b/README.md @@ -18,3 +18,9 @@ - To Jump use the W, Up Arrow or even the Space Bar - Try to reach the Sign and Hopeful not fall due to Gravity - Most Important: Have Fun! 🎮😊 + + # Info + + - The Assets are CC0 + - This is a Raylib C++ Project + - You can do anything with this project \ No newline at end of file From 75ac0dfa8d5117e08afab6adb682d4ff08c304ce Mon Sep 17 00:00:00 2001 From: AaronCode2 Date: Mon, 17 Feb 2025 16:59:22 +0000 Subject: [PATCH 20/39] Remove duplicate information in README.md --- README.md | 6 ------ 1 file changed, 6 deletions(-) diff --git a/README.md b/README.md index 81b4244..5107def 100644 --- a/README.md +++ b/README.md @@ -21,12 +21,6 @@ # Info - - The Assets are CC0 - - This is a Raylib C++ Project - - You can do anything with this project - - # Info - - The Assets are CC0 - This is a Raylib C++ Project - You can do anything with this project \ No newline at end of file From 247ae33edd4b311502c178d7e9a8a1b0f6df7939 Mon Sep 17 00:00:00 2001 From: AaronCode2 Date: Tue, 18 Feb 2025 11:41:51 +0000 Subject: [PATCH 21/39] Add initialization function and logo loading to App --- App.cpp | 15 +++++++++++++-- App.hpp | 4 ++++ Assets/Logo/Logo.png | Bin 0 -> 34648 bytes Game.hpp | 2 +- 4 files changed, 18 insertions(+), 3 deletions(-) create mode 100644 Assets/Logo/Logo.png diff --git a/App.cpp b/App.cpp index a6aa099..70d2822 100644 --- a/App.cpp +++ b/App.cpp @@ -1,15 +1,26 @@ #include "App.hpp" -void App::run() { +void App::init() { SetConfigFlags(FLAG_WINDOW_ALWAYS_RUN); SetConfigFlags(FLAG_WINDOW_RESIZABLE); + + logo = LoadImage("../Assets/Logo/Logo.png"); InitWindow(1440, 750, "Floating Kingdom"); InitAudioDevice(); - + + SetWindowIcon(logo); + UnloadImage(logo); + MaximizeWindow(); SetTargetFPS(60); +} + +void App::run() { + + init(); + Game 🎮; } \ No newline at end of file diff --git a/App.hpp b/App.hpp index b828284..46d9b67 100644 --- a/App.hpp +++ b/App.hpp @@ -4,5 +4,9 @@ namespace App { + void init(); + void run(); + + Image logo; } \ No newline at end of file diff --git a/Assets/Logo/Logo.png b/Assets/Logo/Logo.png new file mode 100644 index 0000000000000000000000000000000000000000..915561e603f9acb4caacf27bf5521c2e3504a00e GIT binary patch literal 34648 zcmYhicT^MF6D^!Z=mDflLJ<@clqL{D3!;EZ6%|mLQi6gQAYf=Akt^s01JX1=Ac_

-1^@s= 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�isL}z(aEr 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 B=7#_P literal 0 HcmV?d00001 diff --git a/Game.hpp b/Game.hpp index 3278fa3..be90bbb 100644 --- a/Game.hpp +++ b/Game.hpp @@ -17,7 +17,7 @@ class Game { private: Texture2D playBtn = LoadTexture("../Assets/sprites/Play.png"); - + LevelManager levelManager; MusicManager musicManager; From fb04fa9067aa15d3367f3b2f17b972da216ed339 Mon Sep 17 00:00:00 2001 From: AaronCode2 Date: Tue, 18 Feb 2025 11:48:38 +0000 Subject: [PATCH 22/39] Refactor logo handling in App initialization --- App.cpp | 2 +- App.hpp | 2 -- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/App.cpp b/App.cpp index 70d2822..f9c0e89 100644 --- a/App.cpp +++ b/App.cpp @@ -5,7 +5,7 @@ void App::init() { SetConfigFlags(FLAG_WINDOW_ALWAYS_RUN); SetConfigFlags(FLAG_WINDOW_RESIZABLE); - logo = LoadImage("../Assets/Logo/Logo.png"); + Image logo = LoadImage("../Assets/Logo/Logo.png"); InitWindow(1440, 750, "Floating Kingdom"); InitAudioDevice(); diff --git a/App.hpp b/App.hpp index 46d9b67..d6340c2 100644 --- a/App.hpp +++ b/App.hpp @@ -7,6 +7,4 @@ namespace App { void init(); void run(); - - Image logo; } \ No newline at end of file From 5d2f2988a39013cd25df6ad4ffb76515397aea46 Mon Sep 17 00:00:00 2001 From: AaronCode2 Date: Tue, 18 Feb 2025 11:50:11 +0000 Subject: [PATCH 23/39] Reorder audio device initialization in App to improve startup sequence --- App.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/App.cpp b/App.cpp index f9c0e89..79e24e7 100644 --- a/App.cpp +++ b/App.cpp @@ -8,10 +8,10 @@ void App::init() { Image logo = LoadImage("../Assets/Logo/Logo.png"); InitWindow(1440, 750, "Floating Kingdom"); - InitAudioDevice(); - SetWindowIcon(logo); UnloadImage(logo); + InitAudioDevice(); + MaximizeWindow(); SetTargetFPS(60); From a4d5587f39748b1cee36a1c69f255feef855735b Mon Sep 17 00:00:00 2001 From: AaronCode2 Date: Tue, 18 Feb 2025 11:52:28 +0000 Subject: [PATCH 24/39] Reorder audio device initialization in App to improve startup sequence --- App.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/App.cpp b/App.cpp index 79e24e7..d8781d9 100644 --- a/App.cpp +++ b/App.cpp @@ -8,10 +8,11 @@ void App::init() { Image logo = LoadImage("../Assets/Logo/Logo.png"); InitWindow(1440, 750, "Floating Kingdom"); + SetWindowIcon(logo); UnloadImage(logo); - InitAudioDevice(); + InitAudioDevice(); MaximizeWindow(); SetTargetFPS(60); From 9613709c932b03a815d3b0404546e2792666c0d6 Mon Sep 17 00:00:00 2001 From: AaronCode2 Date: Tue, 18 Feb 2025 11:52:39 +0000 Subject: [PATCH 25/39] Remove unnecessary blank line in App initialization --- App.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/App.cpp b/App.cpp index d8781d9..e9e6846 100644 --- a/App.cpp +++ b/App.cpp @@ -16,7 +16,6 @@ void App::init() { MaximizeWindow(); SetTargetFPS(60); - } void App::run() { From 419f6db1e0ac8240fad2fcd1d8296da17eaeb040 Mon Sep 17 00:00:00 2001 From: AaronCode2 Date: Sun, 23 Mar 2025 16:10:12 +0000 Subject: [PATCH 26/39] Fix formatting in README and ensure newline at end of files in CMakeLists --- CMakelists.txt | 2 +- README.md | 26 +++++++++++++------------- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/CMakelists.txt b/CMakelists.txt index 8e6f5e9..8c59852 100644 --- a/CMakelists.txt +++ b/CMakelists.txt @@ -34,4 +34,4 @@ SOURCE_FILES ) add_executable(Floating_Kingdom ${SOURCE_FILES}) -target_link_libraries(Floating_Kingdom raylib) +target_link_libraries(Floating_Kingdom raylib) \ No newline at end of file diff --git a/README.md b/README.md index 5107def..9f2dd34 100644 --- a/README.md +++ b/README.md @@ -1,26 +1,26 @@ -# How To Complie +# How To Complie -### Hopefully you have a **C++ Complier**, **CMake** and **VsCode** installed to work. +## Hopefully you have a **C++ Complier**, **CMake**, **Make**, and **VsCode** installed to work -1. Download as a Zip or use Git -2. Open the Project with Vscode and install the C/C++ Extension Pack -3. It should come with a option of what Complier to use - you may have to reopen VsCode - use the complier that fits you (a GCC is recommended) +1. Download as a Zip or use Git +2. Open the Project with Vscode and install the C/C++ Extension Pack +3. It should come with a option of what Complier to use - you may have to reopen VsCode - use the complier that fits you (a GCC is recommended) -4. Once done, open the Terminal in this directory or you could use the built-in one in Vscode. -5. Check if Cmake has created the build file or you have done it wrong ❌ -6. Type this command +4. Once done, open the Terminal in this directory or you could use the built-in one in Vscode. +5. Check if Cmake has created the build file or you have done it wrong ❌ +6. Type this command cmake --build build -# How To Play +## How To Play - Use WASD or Arrow keys to move - To Jump use the W, Up Arrow or even the Space Bar - Try to reach the Sign and Hopeful not fall due to Gravity - Most Important: Have Fun! 🎮😊 - # Info +## Info - - The Assets are CC0 - - This is a Raylib C++ Project - - You can do anything with this project \ No newline at end of file +- The Assets are CC0 +- This is a Raylib C++ Project +- You can do anything with this project \ No newline at end of file From 4f49dced214aba15205e92665127fa3d3e570107 Mon Sep 17 00:00:00 2001 From: AaronCode2 Date: Sat, 10 May 2025 19:51:40 +0100 Subject: [PATCH 27/39] Add Dockerfile for containerized build environment --- CMakelists.txt | 2 +- Dockerfile | 16 ++++++++++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) create mode 100644 Dockerfile diff --git a/CMakelists.txt b/CMakelists.txt index 8e6f5e9..8c59852 100644 --- a/CMakelists.txt +++ b/CMakelists.txt @@ -34,4 +34,4 @@ SOURCE_FILES ) add_executable(Floating_Kingdom ${SOURCE_FILES}) -target_link_libraries(Floating_Kingdom raylib) +target_link_libraries(Floating_Kingdom raylib) \ No newline at end of file diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..d1b20de --- /dev/null +++ b/Dockerfile @@ -0,0 +1,16 @@ +FROM ubuntu:latest + +# Install required packages +RUN apt update && apt install -y build-essential cmake + +# Set working directory +WORKDIR /app + +# Copy source code into container +COPY . . + +# Create build dir, run cmake & make +RUN mkdir -p build && cd build && cmake .. && make + +# Run the compiled binary +CMD ["./build/Floating_Kingdom"] \ No newline at end of file From d7b40c267cb4a8e419dd258e6007c7aab320d881 Mon Sep 17 00:00:00 2001 From: AaronCode2 Date: Sat, 10 May 2025 19:57:04 +0100 Subject: [PATCH 28/39] Enhance Dockerfile by adding missing dependencies for build environment --- Dockerfile | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/Dockerfile b/Dockerfile index d1b20de..a0e47e3 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,16 +1,15 @@ FROM ubuntu:latest -# Install required packages -RUN apt update && apt install -y build-essential cmake +RUN apt update && apt install -y \ + build-essential cmake git \ + libx11-dev libxcursor-dev libxrandr-dev libxinerama-dev \ + libgl1-mesa-dev libxi-dev -# Set working directory WORKDIR /app - -# Copy source code into container COPY . . -# Create build dir, run cmake & make + RUN mkdir -p build && cd build && cmake .. && make -# Run the compiled binary + CMD ["./build/Floating_Kingdom"] \ No newline at end of file From 647f96314d457e55b952423f8cca1907fa4e67a7 Mon Sep 17 00:00:00 2001 From: AaronCode2 Date: Fri, 26 Dec 2025 14:08:05 +0000 Subject: [PATCH 29/39] Remove Dockerfile as it is no longer needed for the build process --- Dockerfile | 15 --------------- 1 file changed, 15 deletions(-) delete mode 100644 Dockerfile diff --git a/Dockerfile b/Dockerfile deleted file mode 100644 index a0e47e3..0000000 --- a/Dockerfile +++ /dev/null @@ -1,15 +0,0 @@ -FROM ubuntu:latest - -RUN apt update && apt install -y \ - build-essential cmake git \ - libx11-dev libxcursor-dev libxrandr-dev libxinerama-dev \ - libgl1-mesa-dev libxi-dev - -WORKDIR /app -COPY . . - - -RUN mkdir -p build && cd build && cmake .. && make - - -CMD ["./build/Floating_Kingdom"] \ No newline at end of file From 7c82f0493eeb3a6e676de7aacda9443d64f57532 Mon Sep 17 00:00:00 2001 From: AaronCode2 Date: Fri, 26 Dec 2025 14:16:54 +0000 Subject: [PATCH 30/39] Add note about using the Release branch for newer versions in README --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 9f2dd34..6c02f7b 100644 --- a/README.md +++ b/README.md @@ -22,5 +22,6 @@ ## Info - The Assets are CC0 +- Use the Release Branch for the newer version! - This is a Raylib C++ Project - You can do anything with this project \ No newline at end of file From f9ab91e64478a449be477d317ec10880d3e37317 Mon Sep 17 00:00:00 2001 From: AaronCode2 Date: Sat, 27 Dec 2025 11:53:46 +0000 Subject: [PATCH 31/39] Update CMake tasks and add Windows resource file for application --- .vscode/tasks.json | 2 +- Assets/Windows/app.rc | 32 ++++++++++++++++++++++++++++++++ Assets/Windows/favicon.ico | Bin 0 -> 15406 bytes CMakelists.txt | 25 ++++++++++++++++++++++++- 4 files changed, 57 insertions(+), 2 deletions(-) create mode 100644 Assets/Windows/app.rc create mode 100644 Assets/Windows/favicon.ico diff --git a/.vscode/tasks.json b/.vscode/tasks.json index 7c704c4..301cd6d 100644 --- a/.vscode/tasks.json +++ b/.vscode/tasks.json @@ -4,7 +4,7 @@ { "label": "Cmake", "type": "shell", - "command": "cmake --build build", + "command": "cmake --build build -- -j", "group": { "kind": "build", "isDefault": true diff --git a/Assets/Windows/app.rc b/Assets/Windows/app.rc new file mode 100644 index 0000000..feec0e6 --- /dev/null +++ b/Assets/Windows/app.rc @@ -0,0 +1,32 @@ +#include +IDI_ICON1 ICON "favicon.ico" + +VS_VERSION_INFO VERSIONINFO + FILEVERSION 1,0,0,0 + PRODUCTVERSION 1,0,0,0 + FILEFLAGSMASK VS_FFI_FILEFLAGSMASK + FILEFLAGS 0 + FILEOS VOS__WINDOWS32 + FILETYPE VFT_APP + FILESUBTYPE 0 +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040904E4" + BEGIN + VALUE "CompanyName", "N/A" + VALUE "FileDescription", "Floating kingdom" + VALUE "FileVersion", "1.0.0" + VALUE "InternalName", "Floating_kingdom" + VALUE "OriginalFilename", "Floating_kingdom.exe" + VALUE "ProductName", "Floating kingdom" + VALUE "ProductVersion", "1.0.0" + VALUE "LegalCopyright", "N/A" + END + END + + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 1200, 0x0409 + END +END \ No newline at end of file diff --git a/Assets/Windows/favicon.ico b/Assets/Windows/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..68bdef2ec471b643444b81580ce5cde5f5a24acc GIT binary patch literal 15406 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:-mwindows>) +elseif(APPLE) + + target_link_options(Floating_Kingdom PRIVATE $<$:-MACOSX_BUNDLE>) +endif() + +target_compile_definitions(Floating_Kingdom PUBLIC $<$:DEBUG_ENABLED>) + +if("${PLATFORM}" STREQUAL "Web") + + message(FATAL_ERROR "Do not build in this project in the Web as it doesn't work!") +endif() + +if(APPLE) + + target_link_libraries(${PROJECT_NAME} "-framework IOKit") + target_link_libraries(${PROJECT_NAME} "-framework Cocoa") + target_link_libraries(${PROJECT_NAME} "-framework OpenGL") +endif() \ No newline at end of file From b9997bd1d6e742818cb4c8c666c7395456fcbfe9 Mon Sep 17 00:00:00 2001 From: AaronCode2 Date: Sat, 27 Dec 2025 12:19:44 +0000 Subject: [PATCH 32/39] Adjust jump velocity and speed calculation based on window state --- Classes/Player.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/Classes/Player.cpp b/Classes/Player.cpp index d28801a..08e42f6 100644 --- a/Classes/Player.cpp +++ b/Classes/Player.cpp @@ -46,10 +46,12 @@ void Player::update(MusicManager *musicManager) { if(jumpKey() && isOnGround) { musicManager->playSoundEffect(Jump); - velocity.y = -30 * (utils::getSize().y / 50); + if(IsWindowMaximized()) + velocity.y = -35; + else velocity.y = -35 * (utils::getSize().y / 51); } - const int speed = 5 * (utils::getSize().x / 50); + const float speed = 6.5 * (utils::getSize().x / 51); if(IsKeyDown(KEY_D) || IsKeyDown(KEY_RIGHT)) velocity.x = speed; else if(IsKeyDown(KEY_A) || IsKeyDown(KEY_LEFT)) velocity.x = -speed; From 717b2113f1f110aa9eabbbaf691d33629f035c22 Mon Sep 17 00:00:00 2001 From: AaronCode2 Date: Sat, 27 Dec 2025 12:32:40 +0000 Subject: [PATCH 33/39] Add early return in move() method for window resize handling --- Classes/Player.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Classes/Player.cpp b/Classes/Player.cpp index 08e42f6..412131d 100644 --- a/Classes/Player.cpp +++ b/Classes/Player.cpp @@ -70,6 +70,8 @@ void Player::activateResetPosition() { void Player::move() { + if(IsWindowResized()) return; + object.x += velocity.x; checkCollisionX(); From e2eb47a292f912fe52a608ce80dd5a52b5fc4aa7 Mon Sep 17 00:00:00 2001 From: AaronCode2 Date: Sat, 27 Dec 2025 23:08:22 +0000 Subject: [PATCH 34/39] Unload textures conditionally for non-Linux platforms in Player and LevelManager --- Classes/Player.cpp | 7 +++++-- LevelManager/LevelManager.cpp | 3 +++ 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/Classes/Player.cpp b/Classes/Player.cpp index 412131d..a83efb9 100644 --- a/Classes/Player.cpp +++ b/Classes/Player.cpp @@ -22,8 +22,11 @@ Player::Player( Player::~Player() { +#if !__linux__ UnloadTexture(image[0]); UnloadTexture(image[1]); +#endif + } void Player::update(MusicManager *musicManager) { @@ -56,7 +59,7 @@ void Player::update(MusicManager *musicManager) { if(IsKeyDown(KEY_D) || IsKeyDown(KEY_RIGHT)) velocity.x = speed; else if(IsKeyDown(KEY_A) || IsKeyDown(KEY_LEFT)) velocity.x = -speed; - if(applyGravity()) musicManager->playSoundEffect(Hurt); + if(applyGravity() && (IsWindowResized() || IsWindowHidden())) musicManager->playSoundEffect(Hurt); move(); draw(); @@ -70,7 +73,7 @@ void Player::activateResetPosition() { void Player::move() { - if(IsWindowResized()) return; + if(IsWindowResized() || IsWindowHidden()) return; object.x += velocity.x; checkCollisionX(); diff --git a/LevelManager/LevelManager.cpp b/LevelManager/LevelManager.cpp index 592afeb..49d2fc4 100644 --- a/LevelManager/LevelManager.cpp +++ b/LevelManager/LevelManager.cpp @@ -111,11 +111,14 @@ void LevelManager::clearBackground() { void LevelManager::destroy() { +#if !__linux__ UnloadTexture(PlatFormTile::image[0]); UnloadTexture(PlatFormTile::image[1]); UnloadTexture(Item::image[0]); UnloadTexture(Item::image[1]); +#endif + } void LevelManager::readData() { From 34c798c8dbddfe985ef98b3d25b71bfc004f8204 Mon Sep 17 00:00:00 2001 From: AaronCode2 Date: Mon, 26 Jan 2026 17:17:25 +0000 Subject: [PATCH 35/39] Remove CMakeLists.txt as part of project restructuring --- CMakelists.txt | 60 -------------------------------------------------- 1 file changed, 60 deletions(-) delete mode 100644 CMakelists.txt diff --git a/CMakelists.txt b/CMakelists.txt deleted file mode 100644 index 97568bf..0000000 --- a/CMakelists.txt +++ /dev/null @@ -1,60 +0,0 @@ -cmake_minimum_required(VERSION 3.28) - -project(Floating_Kingdom) - -include(FetchContent) - -set(RAYLIB_VERSION 4.2.0) - -# Uses the Internet to get Raylib - -FetchContent_Declare( - raylib - URL https://github.com/raysan5/raylib/archive/refs/tags/${RAYLIB_VERSION}.tar.gz - FIND_PACKAGE_ARGS ${RAYLIB_VERSION} EXACT -) - -set(BUILD_EXAMPLES OFF CACHE INTERNAL "") -FetchContent_MakeAvailable(raylib) - -set( -SOURCE_FILES - - main.cpp - utils.cpp - App.cpp - Game.cpp - Classes/Sprite.cpp - Classes/Slime.cpp - Classes/Item.cpp - Classes/Player.cpp - MusicManager/MusicManager.cpp - LevelManager/LevelManager.cpp - LevelManager/Tile.cpp -) - -add_executable(Floating_Kingdom ${SOURCE_FILES}) -target_link_libraries(Floating_Kingdom raylib) - -if(WIN32) - - target_sources(Floating_Kingdom PRIVATE Assets/Windows/app.rc) - target_link_options(Floating_Kingdom PRIVATE $<$:-mwindows>) -elseif(APPLE) - - target_link_options(Floating_Kingdom PRIVATE $<$:-MACOSX_BUNDLE>) -endif() - -target_compile_definitions(Floating_Kingdom PUBLIC $<$:DEBUG_ENABLED>) - -if("${PLATFORM}" STREQUAL "Web") - - message(FATAL_ERROR "Do not build in this project in the Web as it doesn't work!") -endif() - -if(APPLE) - - target_link_libraries(${PROJECT_NAME} "-framework IOKit") - target_link_libraries(${PROJECT_NAME} "-framework Cocoa") - target_link_libraries(${PROJECT_NAME} "-framework OpenGL") -endif() \ No newline at end of file From 18210f4d50c87625e6c95952c315f1aea0426278 Mon Sep 17 00:00:00 2001 From: AaronCode2 Date: Mon, 26 Jan 2026 17:18:00 +0000 Subject: [PATCH 36/39] Add CMakeLists.txt for project configuration and dependency management --- CMakeLists.txt | 60 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 CMakeLists.txt diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..97568bf --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,60 @@ +cmake_minimum_required(VERSION 3.28) + +project(Floating_Kingdom) + +include(FetchContent) + +set(RAYLIB_VERSION 4.2.0) + +# Uses the Internet to get Raylib + +FetchContent_Declare( + raylib + URL https://github.com/raysan5/raylib/archive/refs/tags/${RAYLIB_VERSION}.tar.gz + FIND_PACKAGE_ARGS ${RAYLIB_VERSION} EXACT +) + +set(BUILD_EXAMPLES OFF CACHE INTERNAL "") +FetchContent_MakeAvailable(raylib) + +set( +SOURCE_FILES + + main.cpp + utils.cpp + App.cpp + Game.cpp + Classes/Sprite.cpp + Classes/Slime.cpp + Classes/Item.cpp + Classes/Player.cpp + MusicManager/MusicManager.cpp + LevelManager/LevelManager.cpp + LevelManager/Tile.cpp +) + +add_executable(Floating_Kingdom ${SOURCE_FILES}) +target_link_libraries(Floating_Kingdom raylib) + +if(WIN32) + + target_sources(Floating_Kingdom PRIVATE Assets/Windows/app.rc) + target_link_options(Floating_Kingdom PRIVATE $<$:-mwindows>) +elseif(APPLE) + + target_link_options(Floating_Kingdom PRIVATE $<$:-MACOSX_BUNDLE>) +endif() + +target_compile_definitions(Floating_Kingdom PUBLIC $<$:DEBUG_ENABLED>) + +if("${PLATFORM}" STREQUAL "Web") + + message(FATAL_ERROR "Do not build in this project in the Web as it doesn't work!") +endif() + +if(APPLE) + + target_link_libraries(${PROJECT_NAME} "-framework IOKit") + target_link_libraries(${PROJECT_NAME} "-framework Cocoa") + target_link_libraries(${PROJECT_NAME} "-framework OpenGL") +endif() \ No newline at end of file From c90b6856e48f1dfe6569ec0d0c33670df454f49d Mon Sep 17 00:00:00 2001 From: AaronCode2 Date: Mon, 26 Jan 2026 17:23:44 +0000 Subject: [PATCH 37/39] Replace KnightLeft.png with knightLeft.png for Windows platform compatibility --- .../KnightLeft.png => Windows/knightLeft.png} | Bin 1 file changed, 0 insertions(+), 0 deletions(-) rename Assets/{sprites/KnightLeft.png => Windows/knightLeft.png} (100%) diff --git a/Assets/sprites/KnightLeft.png b/Assets/Windows/knightLeft.png similarity index 100% rename from Assets/sprites/KnightLeft.png rename to Assets/Windows/knightLeft.png From 6f4496356dc5d9babaf99c121f9d0acbf06e1ecc Mon Sep 17 00:00:00 2001 From: AaronCode2 Date: Mon, 26 Jan 2026 17:23:58 +0000 Subject: [PATCH 38/39] Replace knightLeft.png with new sprite file for improved graphics --- Assets/{Windows => sprites}/knightLeft.png | Bin 1 file changed, 0 insertions(+), 0 deletions(-) rename Assets/{Windows => sprites}/knightLeft.png (100%) diff --git a/Assets/Windows/knightLeft.png b/Assets/sprites/knightLeft.png similarity index 100% rename from Assets/Windows/knightLeft.png rename to Assets/sprites/knightLeft.png From f3b241dad230003e1ac0b65984309fe3699c89d4 Mon Sep 17 00:00:00 2001 From: AaronCode2 Date: Sat, 14 Feb 2026 11:43:47 +0000 Subject: [PATCH 39/39] Fix typos in README.md for clarity and consistency --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 6c02f7b..8fdd4da 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,10 @@ -# How To Complie +# How To Compile -## Hopefully you have a **C++ Complier**, **CMake**, **Make**, and **VsCode** installed to work +## Hopefully you have a **C++ Compiler**, **CMake**, **Make**, and **VsCode** installed to work 1. Download as a Zip or use Git 2. Open the Project with Vscode and install the C/C++ Extension Pack -3. It should come with a option of what Complier to use - you may have to reopen VsCode - use the complier that fits you (a GCC is recommended) +3. It should come with a option of what Compiler to use - you may have to reopen VsCode - use the compiler that fits you (a GCC is recommended) 4. Once done, open the Terminal in this directory or you could use the built-in one in Vscode. 5. Check if Cmake has created the build file or you have done it wrong ❌