From d740e1a16748c413f79f8ec619ee5004201760ca Mon Sep 17 00:00:00 2001 From: Ninjaws Date: Tue, 17 Dec 2024 23:15:26 +0100 Subject: [PATCH] [Updated] Code for use with WASM, [TODO] Make enemy gun follow player, spawn bullets from tip of the barrel --- include/entities/Enemy.h | 7 +- include/entities/Flag.h | 8 +- include/entities/Game.h | 27 ++-- include/entities/Player.h | 5 + include/entities/Powerup.h | 5 +- include/entities/Text.h | 68 +++++---- include/screens/Screen.h | 3 +- include/screens/VictoryScreen.h | 2 + include/services/BulletService.h | 1 + include/services/CollectableService.h | 209 ++------------------------ include/services/EnemyService.h | 53 +------ include/services/GameService.h | 4 +- include/services/InputService.h | 11 +- include/services/StateService.h | 18 +-- scripts/build_wasm.sh | 3 +- src/entities/Map.cpp | 49 +----- src/entities/Player.cpp | 6 +- src/main.cpp | 57 ------- src/screens/MainScreen.cpp | 4 +- src/screens/TitleScreen.cpp | 2 - src/screens/TutorialScreen.cpp | 5 +- src/services/AssetService.cpp | 1 - src/services/CollectableService.cpp | 196 ++++++++++++++++++++++++ src/services/EnemyService.cpp | 51 +++++++ src/services/StateService.cpp | 14 +- 25 files changed, 371 insertions(+), 438 deletions(-) create mode 100644 src/services/CollectableService.cpp create mode 100644 src/services/EnemyService.cpp diff --git a/include/entities/Enemy.h b/include/entities/Enemy.h index 5d811ba..db80e7d 100644 --- a/include/entities/Enemy.h +++ b/include/entities/Enemy.h @@ -6,6 +6,7 @@ #include "entities/TextureWrapper.h" #include "entities/Vector2i.h" #include +#include class Enemy { @@ -47,7 +48,7 @@ public: return this->texture; } - u_int8_t getHealth() + uint8_t getHealth() { return this->health; } @@ -61,8 +62,8 @@ private: TextureWrapper texture; TextureWrapper gunLeft; TextureWrapper gunRight; - u_int8_t health; - u_int8_t maxHealth = 5; + uint8_t health; + uint8_t maxHealth = 5; Vector2 velocity = {0, 0}; float spottingRange = 300; // From how far away enemies can spot the player float gravity = 0.6f; diff --git a/include/entities/Flag.h b/include/entities/Flag.h index fbb4287..7215236 100644 --- a/include/entities/Flag.h +++ b/include/entities/Flag.h @@ -20,10 +20,10 @@ public: void logic() { - if (touched) - { - StateService::getInstance().setScreen(EScreen::VICTORY); - } + // if (touched) + // { + // // StateService::getInstance().setScreen(EScreen::VICTORY); + // } } void draw() diff --git a/include/entities/Game.h b/include/entities/Game.h index df4df1b..0de6b30 100644 --- a/include/entities/Game.h +++ b/include/entities/Game.h @@ -66,7 +66,7 @@ public: void logic() { - this->crosshair.setPosition(GetMousePosition()); + this->crosshair.setPosition(InputService::getInstance().getMousePos()); if (GameService::getInstance().isPaused()) { @@ -96,6 +96,9 @@ public: { GameService::getInstance().getCamera().offset = {(StateService::getInstance().getScreenSize().x / 2.0f) + ((StateService::getInstance().getScreenSize().x / 2.0f) - player.getTexture().getPosition().x), StateService::getInstance().getScreenSize().y / 2.0f}; } + if(player.isFinishReached()) { + StateService::getInstance().setScreen(EScreen::VICTORY); + } } void draw() @@ -113,6 +116,7 @@ public: EndMode2D(); + drawHud(); if (GameService::getInstance().isPaused()) { drawPaused(); @@ -120,9 +124,9 @@ public: else if (GameService::getInstance().isGameOver()) { drawGameOver(); + } else { + drawCrosshair(); } - drawHud(); - drawCrosshair(); EndDrawing(); } @@ -184,7 +188,7 @@ private: const int SPACE_PER_ITEM = TOTAL_SPACE / AMNT_OF_BUTTONS; for (int i = 0; i < AMNT_OF_BUTTONS; i++) { - Text txt = Text("Play Again", EFont::SANSATION, 30, 0, GRAY); + Text txt = Text("Play Again", EFont::SANSATION, 30, 0, BLACK); gameOverScreenButtons.push_back(txt); } gameOverScreenButtons[0].setColor(WHITE); @@ -229,7 +233,7 @@ private: { if (InputService::getInstance().isKeyPressed(KEY_D) || InputService::getInstance().isKeyPressed(KEY_A)) { - gameOverScreenButtons[hoveredGameOverScreenButton].setColor(GRAY); + gameOverScreenButtons[hoveredGameOverScreenButton].setColor(BLACK); /** Move up or down depending on the pressed button. +4 is used so that -1 becomes 3 (the last button) */ hoveredGameOverScreenButton = ((hoveredGameOverScreenButton - (InputService::getInstance().isKeyPressed(KEY_D) ? -1 : 1)) + gameOverScreenButtons.size()) % gameOverScreenButtons.size(); gameOverScreenButtons[hoveredGameOverScreenButton].setColor(WHITE); @@ -254,7 +258,7 @@ private: void drawPaused() { // 100, 100, 255, 60 - DrawRectangle(0, 0, StateService::getInstance().getScreenSize().x, StateService::getInstance().getScreenSize().y, {0, 0, 255, 100}); + DrawRectangle(0, 0, StateService::getInstance().getScreenSize().x, StateService::getInstance().getScreenSize().y, {0, 0, 0, 200}); if (pauseScreenButtons.size() > 0) { for (int i = 0; i < pauseScreenButtons.size(); i++) @@ -266,7 +270,7 @@ private: void drawGameOver() { - DrawRectangle(0, 0, StateService::getInstance().getScreenSize().x, StateService::getInstance().getScreenSize().y, {255, 0, 0, 100}); + DrawRectangle(0, 0, StateService::getInstance().getScreenSize().x, StateService::getInstance().getScreenSize().y, {100, 0, 0, 200}); gameOverText.draw(); @@ -280,17 +284,10 @@ private: { DrawTextureEx( this->crosshair.getTexture(), - {GetMousePosition().x - this->crosshair.getSize().x / 2.0f, GetMousePosition().y - this->crosshair.getSize().y / 2.0f}, + {InputService::getInstance().getMousePos().x - this->crosshair.getSize().x / 2.0f, InputService::getInstance().getMousePos().y - this->crosshair.getSize().y / 2.0f}, 0, 1.2f, RED); - // DrawTexturePro( - // this->crosshair.getTexture(), - // this->crosshair.getSourceRect(), - // {GetMousePosition().x, GetMousePosition().y, GetMousePosition().x+this->crosshair.getSize().x, GetMousePosition().y+this->crosshair.getSize().y}, - // {this->crosshair.getSize().x/2.0f, this->crosshair.getSize().y/2.0f}, - // 0, - // WHITE); } void drawHud() diff --git a/include/entities/Player.h b/include/entities/Player.h index a8c44a5..d4e0263 100644 --- a/include/entities/Player.h +++ b/include/entities/Player.h @@ -81,6 +81,10 @@ public: this->health = std::max(health - damage, 0); } + bool isFinishReached() { + return this->finishReached; + } + protected: private: TextureWrapper texture; @@ -113,6 +117,7 @@ private: uint8_t health; // Current health of the player uint8_t max_health = 10; // Max health of the player bool gainedPowerup = false; + bool finishReached = false; void applyGravity(); void movement(); diff --git a/include/entities/Powerup.h b/include/entities/Powerup.h index 7375531..837996b 100644 --- a/include/entities/Powerup.h +++ b/include/entities/Powerup.h @@ -4,6 +4,7 @@ #include "raylib.h" #include "services/AssetService.h" #include "entities/TextureWrapper.h" +#include class Powerup { public: @@ -40,8 +41,8 @@ class Powerup { bool pickedUp = false; // When the player has picked up the pack float animationDelay = 0.08f; // How long to wait in between animation frames (in seconds) double lastFrame; // Time since the last frame - u_int8_t currentFrame = 0; // Current frame of the animation - u_int8_t amountOfFrames = 8; // Total amount of animation frames + uint8_t currentFrame = 0; // Current frame of the animation + uint8_t amountOfFrames = 8; // Total amount of animation frames void animate() { if(GetTime() - lastFrame > animationDelay) { diff --git a/include/entities/Text.h b/include/entities/Text.h index 680a206..e667f11 100644 --- a/include/entities/Text.h +++ b/include/entities/Text.h @@ -3,47 +3,53 @@ #include "raylib.h" #include "enums/EFont.h" -#include -#include #include "services/AssetService.h" +#include -class Text { - public: - Text(){} - Text(std::string text, EFont font, int fontSize = 30, int spacing = 0, Color color = WHITE, Vector2 position = {100,100}); - ~Text(){} +class Text +{ +public: + Text() {} + Text(std::string text, EFont font, int fontSize = 30, int spacing = 0, Color color = WHITE, Vector2 position = {100, 100}); + ~Text() { + } - Vector2 getDimensions(); + Vector2 getDimensions(); - void setPosition(Vector2 position) { - this->position = position; - } + void setPosition(Vector2 position) + { + this->position = position; + } - void setColor(Color color) { - this->color = color; - } + void setColor(Color color) + { + this->color = color; + } - void setText(std::string text) { - this->text = text; - } + void setText(std::string text) + { + this->text = text; + } - Vector2 getPosition() { - return position; - } + Vector2 getPosition() + { + return position; + } - std::string getText() { - return this->text; - } + std::string getText() + { + return this->text; + } - void draw(); + void draw(); - private: - std::string text; - Font font; - int fontSize; - int spacing; - Color color; - Vector2 position; +private: + std::string text; + Font font; + int fontSize; + int spacing; + Color color; + Vector2 position; }; #endif \ No newline at end of file diff --git a/include/screens/Screen.h b/include/screens/Screen.h index 90270ec..9acc00c 100644 --- a/include/screens/Screen.h +++ b/include/screens/Screen.h @@ -5,7 +5,8 @@ class Screen { public: Screen(){} - ~Screen() {} + ~Screen() { + } /** * Execute all logic for this frame diff --git a/include/screens/VictoryScreen.h b/include/screens/VictoryScreen.h index a0e71fa..600f790 100644 --- a/include/screens/VictoryScreen.h +++ b/include/screens/VictoryScreen.h @@ -14,6 +14,8 @@ class VictoryScreen : public Screen public: VictoryScreen(); + ~VictoryScreen() { + } void logic() override; void draw() override; diff --git a/include/services/BulletService.h b/include/services/BulletService.h index 4751191..ab9ee19 100644 --- a/include/services/BulletService.h +++ b/include/services/BulletService.h @@ -4,6 +4,7 @@ #include "raylib.h" #include "services/Service.h" #include "services/AssetService.h" +#include "entities/Bullet.h" #include "entities/PBullet.h" #include "entities/EBullet.h" #include diff --git a/include/services/CollectableService.h b/include/services/CollectableService.h index be118ae..94ef4d6 100644 --- a/include/services/CollectableService.h +++ b/include/services/CollectableService.h @@ -3,7 +3,6 @@ #include "raylib.h" #include "services/Service.h" -#include "services/MapService.h" #include "entities/Vector2i.h" #include "entities/Crate.h" #include "entities/Jelly.h" @@ -94,198 +93,22 @@ private: std::vector powerUps; Flag flag; - void initCrates() - { - crates.clear(); - int tileSize = MapService::getInstance().getMap().getTileSize(); - for (int i = 0; i < amountOfCrates; i++) - { - crates.push_back(Crate()); - } - crates[0].getObject().setPosition({38.0f * tileSize, 9.0f * tileSize}); - crates[1].getObject().setPosition({41.0f * tileSize, 5.0f * tileSize}); - crates[2].getObject().setPosition({68.0f * tileSize, 4.0f * tileSize}); - - for (int i = 0; i < crates.size(); i++) - { - Vector2i crateTilePos = Vector2i(crates[i].getObject().getPosition().x / tileSize, crates[i].getObject().getPosition().y / tileSize); - MapService::getInstance().getMap().updateColmapTile(crateTilePos, true); - } - } - - void initJellies() - { - jellies.clear(); - } - - void initAmmoPacks() - { - ammoPacks.clear(); - int tileSize = MapService::getInstance().getMap().getTileSize(); - for (int i = 0; i < amountOfAmmoPacks; i++) - { - ammoPacks.push_back(AmmoPack()); - } - ammoPacks[0].getObject().setPosition({32.0f * tileSize, 9.0f * tileSize}); - ammoPacks[1].getObject().setPosition({48.0f * tileSize, 5.0f * tileSize}); - ammoPacks[2].getObject().setPosition({88.0f * tileSize, 9.0f * tileSize}); - ammoPacks[3].getObject().setPosition({105.0f * tileSize, 15.0f * tileSize}); - } - - void initHealthPacks() - { - healthPacks.clear(); - int tileSize = MapService::getInstance().getMap().getTileSize(); - for (int i = 0; i < amountOfHealthPacks; i++) - { - healthPacks.push_back(HealthPack()); - } - healthPacks[0].getObject().setPosition({28.0f * tileSize, 10.0f * tileSize}); - healthPacks[1].getObject().setPosition({64.0f * tileSize, 6.0f * tileSize}); - healthPacks[2].getObject().setPosition({118.0f * tileSize, 11.0f * tileSize}); - healthPacks[3].getObject().setPosition({74.0f * tileSize, 8.0f * tileSize}); - } - - void initPowerups() - { - powerUps.clear(); - int tileSize = MapService::getInstance().getMap().getTileSize(); - for (int i = 0; i < amountOfPowerups; i++) - { - powerUps.push_back(Powerup()); - } - powerUps[0].getObject().setPosition({41.0f * tileSize+8, 10.0f * tileSize-25}); - } - - void initFlag() { - int tileSize = MapService::getInstance().getMap().getTileSize(); - this->flag = Flag({118.0f*tileSize-tileSize/2.0f, 3.0f * tileSize-8}); - } - - void crateLogic() - { - for (auto it = crates.begin(); it != crates.end();) - { - auto &crate = *it; - /** - * If the crate has been hit: - * 1. Create a Jelly on the location of the crate - * 2. Remove the collision tile from the collision map - * 3. Remove the crate - */ - if (crate.hasBeenHit()) - { - Vector2 pos = crate.getObject().getPosition(); - - jellies.push_back(Jelly(pos)); - - Vector2i tilePos = Vector2i(pos.x / MapService::getInstance().getMap().getTileSize(), pos.y / MapService::getInstance().getMap().getTileSize()); - MapService::getInstance().getMap().updateColmapTile(tilePos, false); - it = crates.erase(it); - } - else - { - ++it; - } - } - } - - void jellyLogic() - { - for (int i = 0; i < jellies.size(); i++) - { - jellies[i].logic(); - } - } - - void ammoPackLogic() - { - for (auto it = ammoPacks.begin(); it != ammoPacks.end();) - { - auto &ammoPack = *it; - if (ammoPack.hasBeenPickedUp()) - { - it = ammoPacks.erase(it); - } - else - { - ++it; - } - } - } - - void healthPackLogic() - { - for (auto it = healthPacks.begin(); it != healthPacks.end();) - { - auto &healthPack = *it; - if (healthPack.hasBeenPickedUp()) - { - it = healthPacks.erase(it); - } - else - { - ++it; - } - } - } - - void powerupLogic() - { - for (auto it = powerUps.begin(); it != powerUps.end();) - { - auto &powerUp = *it; - if (powerUp.hasBeenPickedUp()) - { - it = powerUps.erase(it); - } - else - { - powerUp.logic(); - ++it; - } - } - } - - void drawCrates() - { - for (int i = 0; i < crates.size(); i++) - { - crates[i].draw(); - } - } - - void drawJellies() - { - for (int i = 0; i < jellies.size(); i++) - { - jellies[i].draw(); - } - } - - void drawAmmoPacks() - { - for (int i = 0; i < ammoPacks.size(); i++) - { - ammoPacks[i].draw(); - } - } - - void drawHealthpacks() - { - for (int i = 0; i < healthPacks.size(); i++) - { - healthPacks[i].draw(); - } - } - - void drawPowerups() - { - for (int i = 0; i < powerUps.size(); i++) - { - powerUps[i].draw(); - } - } + void initCrates(); + void initJellies(); + void initAmmoPacks(); + void initHealthPacks(); + void initPowerups(); + void initFlag(); + void crateLogic(); + void jellyLogic(); + void ammoPackLogic(); + void healthPackLogic(); + void powerupLogic(); + void drawCrates(); + void drawJellies(); + void drawAmmoPacks(); + void drawHealthpacks(); + void drawPowerups(); }; #endif \ No newline at end of file diff --git a/include/services/EnemyService.h b/include/services/EnemyService.h index 3a8a1eb..ee56a85 100644 --- a/include/services/EnemyService.h +++ b/include/services/EnemyService.h @@ -3,61 +3,16 @@ #include "raylib.h" #include "services/Service.h" -#include "services/AssetService.h" #include "entities/Enemy.h" #include class EnemyService : public Service { public: - void initEnemies() - { - this->enemies.clear(); - const int AMNT_OF_ENEMIES = 8; - int tileSize = MapService::getInstance().getMap().getTileSize(); - for (int i = 0; i < AMNT_OF_ENEMIES; i++) - { - enemies.push_back(Enemy()); - } - this->enemies[0].getObject().setPosition({31.0f * tileSize, 15.0f * tileSize}); - this->enemies[1].getObject().setPosition({51.0f * tileSize, 10.0f * tileSize}); - this->enemies[2].getObject().setPosition({56.0f * tileSize, 5.0f * tileSize}); - this->enemies[3].getObject().setPosition({78.0f * tileSize, 10.0f * tileSize}); - this->enemies[4].getObject().setPosition({82.0f * tileSize, 15.0f * tileSize}); - this->enemies[5].getObject().setPosition({88.0f * tileSize, 4.0f * tileSize}); - this->enemies[6].getObject().setPosition({98.0f * tileSize, 11.0f * tileSize}); - this->enemies[7].getObject().setPosition({103.0f * tileSize, 15.0f * tileSize}); - } - - void enemyLogic() - { - for (auto it = enemies.begin(); it != enemies.end();) - { - auto &enemy = *it; - if (enemy.getObject().getPosition().y < 0) - { - it = enemies.erase(it); - } - else - { - enemy.logic(); - ++it; - } - } - } - - void drawEnemies() - { - for (int i = 0; i < enemies.size(); i++) - { - enemies[i].draw(); - } - } - - std::vector &getEnemies() - { - return this->enemies; - } + void initEnemies(); + void enemyLogic(); + void drawEnemies(); + std::vector &getEnemies(); protected: private: diff --git a/include/services/GameService.h b/include/services/GameService.h index 81f3cf7..9b6b42a 100644 --- a/include/services/GameService.h +++ b/include/services/GameService.h @@ -4,6 +4,7 @@ #include "raylib.h" #include "services/Service.h" #include "services/AudioService.h" +#include "services/InputService.h" #include #include @@ -49,7 +50,8 @@ public: Vector2 getMouseWorldPos() { - Vector2 mouseWorldPos = {GetMousePosition().x + camera.target.x - camera.offset.x, GetMousePosition().y}; + Vector2 mouseWorldPos = {InputService::getInstance().getMousePos().x + camera.target.x - camera.offset.x, + InputService::getInstance().getMousePos().y}; return mouseWorldPos; } diff --git a/include/services/InputService.h b/include/services/InputService.h index 84b06bc..de793f7 100644 --- a/include/services/InputService.h +++ b/include/services/InputService.h @@ -1,8 +1,8 @@ #ifndef INPUT_SERVICE_H #define INPUT_SERVICE_H -#include "Service.h" #include "raylib.h" +#include "Service.h" #include #include #include @@ -69,6 +69,14 @@ public: } } + void checkMousePos() { + this->mousePosition = GetMousePosition(); + } + + Vector2 getMousePos() { + return this->mousePosition; + } + bool isKeyPressed(KeyboardKey key) { return keysPressed[key]; @@ -88,6 +96,7 @@ public: } private: + Vector2 mousePosition {0,0}; std::unordered_set watchedKeys; std::unordered_map keysPressed; std::unordered_map keysDown; diff --git a/include/services/StateService.h b/include/services/StateService.h index 4e1ce49..750a8fb 100644 --- a/include/services/StateService.h +++ b/include/services/StateService.h @@ -1,16 +1,17 @@ #ifndef STATE_SERVICE_H #define STATE_SERVICE_H -#include -#include -#include "services/Service.h" -#include "screens/Screen.h" -#include "enums/EScreen.h" #include "raylib.h" +#include "enums/EScreen.h" +#include "services/Service.h" +#include "services/InputService.h" +#include "screens/Screen.h" +#include #if defined(PLATFORM_WEB) #include #endif +// #include /** * Handles switching between screens @@ -34,14 +35,10 @@ public: void startGame(); static void staticStep() { - if (IsKeyPressed(KEY_ENTER) || IsMouseButtonPressed(MOUSE_BUTTON_LEFT)) - { - std::cout << "Input!" << std::endl; - } // Access the singleton instance and call step getInstance().step(); } - + private: std::unique_ptr currentScreen; bool gameRunning = true; @@ -52,6 +49,7 @@ private: */ void step(); void handleMusic(); + }; #endif \ No newline at end of file diff --git a/scripts/build_wasm.sh b/scripts/build_wasm.sh index e921bfc..5227541 100755 --- a/scripts/build_wasm.sh +++ b/scripts/build_wasm.sh @@ -2,7 +2,8 @@ # emcc src/main.cpp -o dist/game.js -Wno-missing-braces -I/app/libs/raylib/build/raylib/include -L/app/libs/raylib/src /app/libs/raylib/src/libraylib.a -s USE_GLFW=3 -DPLATFORM_WEB -emcc $(find src/ -name "*.cpp") -o dist/game.js -Wno-missing-braces -I./include -I/app/libs/raylib/build/raylib/include -L/app/libs/raylib/src /app/libs/raylib/src/libraylib.a -s ALLOW_MEMORY_GROWTH=1 -s INITIAL_MEMORY=268435456 -s MAXIMUM_MEMORY=4294967296 -s --preload-file assets@/assets -s USE_GLFW=3 -DPLATFORM_WEB +# emcc $(find src/ -name "*.cpp") -o dist/game.js -Wno-missing-braces -I./include -I/app/libs/raylib/build/raylib/include -L/app/libs/raylib/src /app/libs/raylib/src/libraylib.a -s ALLOW_MEMORY_GROWTH=1 -s INITIAL_MEMORY=268435456 -s MAXIMUM_MEMORY=4294967296 -s --preload-file assets@/assets -s USE_GLFW=3 -DPLATFORM_WEB +emcc $(find src/ -name "*.cpp") -o dist/game.js -Wno-missing-braces -I./include -I/app/libs/raylib/build/raylib/include -L/app/libs/raylib/src /app/libs/raylib/src/libraylib.a -s ALLOW_MEMORY_GROWTH=1 -s INITIAL_MEMORY=536870912 -s MAXIMUM_MEMORY=4294967296 -s --preload-file assets@/assets -s USE_GLFW=3 -s ASSERTIONS=2 -DPLATFORM_WEB # -I./include # -L$LD_LIBRARY_PATH # -I. diff --git a/src/entities/Map.cpp b/src/entities/Map.cpp index 775e090..7e0d2b5 100644 --- a/src/entities/Map.cpp +++ b/src/entities/Map.cpp @@ -1,10 +1,8 @@ #include "entities/Map.h" +#include "services/AssetService.h" #include #include #include -#include -#include "services/AssetService.h" -#include "entities/Map.h" Map::Map() { @@ -114,19 +112,6 @@ void Map::loadTileset() this->tileset = AssetService::getInstance().loadTexture("Textures/tileset.png"); } -// std::unordered_map Map::cornersToTilePos(std::unordered_map corners) -// { -// // std::cout << "Starting converting" << std::endl; -// std::unordered_map cornersTilePos; -// for (const auto &pair : corners) -// { -// // std::cout << "Foreach pair" << std::endl; -// Vector2 original = corners[pair.first]; -// cornersTilePos[pair.first] = {floorf(original.x / this->tileSize), floorf(original.y / this->tileSize)}; -// } -// return cornersTilePos; -// } - void Map::draw() { for (int i = 0; i < map.size(); i++) @@ -146,35 +131,3 @@ void Map::draw() } } -// std::unordered_map Map::checkForCollision(TextureWrapper texture) -// { -// // std::cout << "Converting.." << std::endl; -// std::unordered_map cornersTilePos = cornersToTilePos(texture.getCorners()); -// // std::cout << "Done with converting" << std::endl; - -// std::unordered_map cornerCollisions; - -// for (const auto &pair : cornersTilePos) -// { -// // std::cout << "foreach collision check" << std::endl; -// Vector2 pos = cornersTilePos[pair.first]; -// // std::cout << pos.x << " " << pos.y << std::endl; -// if(colMap[pos.y][pos.x] == 1) { -// cornerCollisions[pair.first] = true; -// } else { -// cornerCollisions[pair.first] = false; -// } -// } -// // std::cout << "Finished collision checks" << std::endl; - -// return cornerCollisions; - -// // for (int i = 0; i < tiles.size(); i++) -// // { -// // if (colMap[tiles[i].y][tiles[i].x] == 1) -// // { -// // timesCollision.push_back(i); -// // } -// // } - -// } diff --git a/src/entities/Player.cpp b/src/entities/Player.cpp index 81df783..f3c54af 100644 --- a/src/entities/Player.cpp +++ b/src/entities/Player.cpp @@ -3,6 +3,7 @@ #include "services/GameService.h" #include "services/CollectableService.h" #include "services/InputService.h" +#include "services/MapService.h" void Player::applyGravity() { @@ -171,7 +172,7 @@ void Player::consumableCollision() { healthPack.setPickedUp(true); AssetService::getInstance().playSound(ESound::HEAL_PICKUP); - health = std::max(health + healthPack.getHealAmount(), (int)max_health); + health = std::min(health + healthPack.getHealAmount(), (int)max_health); } } } @@ -188,8 +189,6 @@ void Player::consumableCollision() AssetService::getInstance().playSound(ESound::POWERUP); jumpPower += powerup.getExtraJumpPower(); gainedPowerup = true; - // health = std::max(health+powerup.getHealAmount(),(int)max_health); - // } } } @@ -200,6 +199,7 @@ void Player::consumableCollision() this->texture.getPosition().y < flag.getObject().getPosition().y + flag.getObject().getSize().y) { flag.setTouched(true); + finishReached = true; } } diff --git a/src/main.cpp b/src/main.cpp index e252ab4..c7b1bed 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,66 +1,9 @@ -#include "raylib.h" -// #include "screens/Screen.h" -// #include "screens/TitleScreen.h" #include "services/StateService.h" -// #include - -// #if defined(PLATFORM_WEB) -// #include -// #endif - -// void step(); -// static void gameloop(); int main() { StateService& stateService = StateService::getInstance(); stateService.setScreenSize({640,544}); stateService.startGame(); - // std::cout << "StateService instance: " << service << std::endl; - -// InitWindow(640, 544, "Jelly Rescue"); -// // SetTargetFPS(60); - -// // setScreen(EScreen::TITLE); - -// #if defined(PLATFORM_WEB) -// emscripten_set_main_loop(step, 0, 1); -// #else - -// while (!WindowShouldClose()) -// { -// step(); -// } -// #endif - -// CloseWindow(); - return 0; } - -// static void gameloop() -// { -// // InitAudioDevice(); -// InitWindow(640, 544, "Jelly Rescue"); -// // SetTargetFPS(60); - -// // setScreen(EScreen::TITLE); - -// #if defined(PLATFORM_WEB) -// emscripten_set_main_loop(step, 0, 1); -// #else - -// while (!WindowShouldClose()) -// { -// step(); -// } -// #endif - -// CloseWindow(); -// // CloseAudioDevice(); -// } - -// void step() -// { -// ClearBackground(BLACK); -// } \ No newline at end of file diff --git a/src/screens/MainScreen.cpp b/src/screens/MainScreen.cpp index 0eaf9b4..1371361 100644 --- a/src/screens/MainScreen.cpp +++ b/src/screens/MainScreen.cpp @@ -1,7 +1,7 @@ #include "screens/MainScreen.h" +#include "raylib.h" #include "services/AudioService.h" #include "services/StateService.h" -#include "raylib.h" #include "services/InputService.h" MainScreen::MainScreen() @@ -60,7 +60,7 @@ void MainScreen::mouseLogic() Vector2 pos = buttons[i].getPosition(); Rectangle rect = {pos.x, pos.y, dim.x, dim.y}; - Vector2 mousePos = GetMousePosition(); + Vector2 mousePos = InputService::getInstance().getMousePos(); // mousePos.x >= rect.x && mousePos.x <= (rect.x+rect.width) && if ((mousePos.x + textPadding) >= rect.x && mousePos.x <= (rect.x + rect.width + textPadding) && (mousePos.y + textPadding) >= rect.y && mousePos.y <= (rect.y + rect.height + textPadding)) { diff --git a/src/screens/TitleScreen.cpp b/src/screens/TitleScreen.cpp index 98e7f35..0dd10ed 100644 --- a/src/screens/TitleScreen.cpp +++ b/src/screens/TitleScreen.cpp @@ -3,7 +3,6 @@ #include "services/StateService.h" #include "enums/EFont.h" #include "services/AudioService.h" -#include #include "services/InputService.h" TitleScreen::TitleScreen() @@ -34,7 +33,6 @@ TitleScreen::TitleScreen() void TitleScreen::logic() { - // std::cout << "Next screen!" << std::endl; if (InputService::getInstance().isKeyPressed(KEY_ENTER) || InputService::getInstance().isMouseButtonPressed(MOUSE_BUTTON_LEFT)) { StateService::getInstance().setScreen(EScreen::MAIN); diff --git a/src/screens/TutorialScreen.cpp b/src/screens/TutorialScreen.cpp index 3f51fef..05f5701 100644 --- a/src/screens/TutorialScreen.cpp +++ b/src/screens/TutorialScreen.cpp @@ -1,8 +1,7 @@ #include "screens/TutorialScreen.h" - -#include "services/StateService.h" -#include "enums/EFont.h" #include "enums/EScreen.h" +#include "enums/EFont.h" +#include "services/StateService.h" #include "services/InputService.h" TutorialScreen::TutorialScreen() { diff --git a/src/services/AssetService.cpp b/src/services/AssetService.cpp index 653e57c..47c9c30 100644 --- a/src/services/AssetService.cpp +++ b/src/services/AssetService.cpp @@ -1,5 +1,4 @@ #include "services/AssetService.h" -#include AssetService::AssetService() { setAssetDir("assets/"); diff --git a/src/services/CollectableService.cpp b/src/services/CollectableService.cpp new file mode 100644 index 0000000..69feae9 --- /dev/null +++ b/src/services/CollectableService.cpp @@ -0,0 +1,196 @@ +#include "services/CollectableService.h" +#include "services/MapService.h" + +void CollectableService::initCrates() +{ + crates.clear(); + int tileSize = MapService::getInstance().getMap().getTileSize(); + for (int i = 0; i < amountOfCrates; i++) + { + crates.push_back(Crate()); + } + crates[0].getObject().setPosition({38.0f * tileSize, 9.0f * tileSize}); + crates[1].getObject().setPosition({41.0f * tileSize, 5.0f * tileSize}); + crates[2].getObject().setPosition({68.0f * tileSize, 4.0f * tileSize}); + + for (int i = 0; i < crates.size(); i++) + { + Vector2i crateTilePos = Vector2i(crates[i].getObject().getPosition().x / tileSize, crates[i].getObject().getPosition().y / tileSize); + MapService::getInstance().getMap().updateColmapTile(crateTilePos, true); + } +} + +void CollectableService::initJellies() +{ + jellies.clear(); +} + +void CollectableService::initAmmoPacks() +{ + ammoPacks.clear(); + int tileSize = MapService::getInstance().getMap().getTileSize(); + for (int i = 0; i < amountOfAmmoPacks; i++) + { + ammoPacks.push_back(AmmoPack()); + } + ammoPacks[0].getObject().setPosition({32.0f * tileSize, 9.0f * tileSize}); + ammoPacks[1].getObject().setPosition({48.0f * tileSize, 5.0f * tileSize}); + ammoPacks[2].getObject().setPosition({88.0f * tileSize, 9.0f * tileSize}); + ammoPacks[3].getObject().setPosition({105.0f * tileSize, 15.0f * tileSize}); +} + +void CollectableService::initHealthPacks() +{ + healthPacks.clear(); + int tileSize = MapService::getInstance().getMap().getTileSize(); + for (int i = 0; i < amountOfHealthPacks; i++) + { + healthPacks.push_back(HealthPack()); + } + healthPacks[0].getObject().setPosition({28.0f * tileSize, 10.0f * tileSize}); + healthPacks[1].getObject().setPosition({64.0f * tileSize, 6.0f * tileSize}); + healthPacks[2].getObject().setPosition({118.0f * tileSize, 11.0f * tileSize}); + healthPacks[3].getObject().setPosition({74.0f * tileSize, 8.0f * tileSize}); +} + +void CollectableService::initPowerups() +{ + powerUps.clear(); + int tileSize = MapService::getInstance().getMap().getTileSize(); + for (int i = 0; i < amountOfPowerups; i++) + { + powerUps.push_back(Powerup()); + } + powerUps[0].getObject().setPosition({41.0f * tileSize + 8, 10.0f * tileSize - 25}); +} + +void CollectableService::initFlag() +{ + int tileSize = MapService::getInstance().getMap().getTileSize(); + this->flag = Flag({118.0f * tileSize - tileSize / 2.0f, 3.0f * tileSize - 8}); +} + +void CollectableService::crateLogic() +{ + for (auto it = crates.begin(); it != crates.end();) + { + auto &crate = *it; + /** + * If the crate has been hit: + * 1. Create a Jelly on the location of the crate + * 2. Remove the collision tile from the collision map + * 3. Remove the crate + */ + if (crate.hasBeenHit()) + { + Vector2 pos = crate.getObject().getPosition(); + + jellies.push_back(Jelly(pos)); + + Vector2i tilePos = Vector2i(pos.x / MapService::getInstance().getMap().getTileSize(), pos.y / MapService::getInstance().getMap().getTileSize()); + MapService::getInstance().getMap().updateColmapTile(tilePos, false); + it = crates.erase(it); + } + else + { + ++it; + } + } +} + +void CollectableService::jellyLogic() +{ + for (int i = 0; i < jellies.size(); i++) + { + jellies[i].logic(); + } +} + +void CollectableService::ammoPackLogic() +{ + for (auto it = ammoPacks.begin(); it != ammoPacks.end();) + { + auto &ammoPack = *it; + if (ammoPack.hasBeenPickedUp()) + { + it = ammoPacks.erase(it); + } + else + { + ++it; + } + } +} + +void CollectableService::healthPackLogic() +{ + for (auto it = healthPacks.begin(); it != healthPacks.end();) + { + auto &healthPack = *it; + if (healthPack.hasBeenPickedUp()) + { + it = healthPacks.erase(it); + } + else + { + ++it; + } + } +} + +void CollectableService::powerupLogic() +{ + for (auto it = powerUps.begin(); it != powerUps.end();) + { + auto &powerUp = *it; + if (powerUp.hasBeenPickedUp()) + { + it = powerUps.erase(it); + } + else + { + powerUp.logic(); + ++it; + } + } +} + +void CollectableService::drawCrates() +{ + for (int i = 0; i < crates.size(); i++) + { + crates[i].draw(); + } +} + +void CollectableService::drawJellies() +{ + for (int i = 0; i < jellies.size(); i++) + { + jellies[i].draw(); + } +} + +void CollectableService::drawAmmoPacks() +{ + for (int i = 0; i < ammoPacks.size(); i++) + { + ammoPacks[i].draw(); + } +} + +void CollectableService::drawHealthpacks() +{ + for (int i = 0; i < healthPacks.size(); i++) + { + healthPacks[i].draw(); + } +} + +void CollectableService::drawPowerups() +{ + for (int i = 0; i < powerUps.size(); i++) + { + powerUps[i].draw(); + } +} \ No newline at end of file diff --git a/src/services/EnemyService.cpp b/src/services/EnemyService.cpp new file mode 100644 index 0000000..646fde2 --- /dev/null +++ b/src/services/EnemyService.cpp @@ -0,0 +1,51 @@ +#include "services/EnemyService.h" +#include "services/MapService.h" + +void EnemyService::initEnemies() +{ + this->enemies.clear(); + const int AMNT_OF_ENEMIES = 8; + int tileSize = MapService::getInstance().getMap().getTileSize(); + for (int i = 0; i < AMNT_OF_ENEMIES; i++) + { + enemies.push_back(Enemy()); + } + this->enemies[0].getObject().setPosition({31.0f * tileSize, 15.0f * tileSize}); + this->enemies[1].getObject().setPosition({51.0f * tileSize, 10.0f * tileSize}); + this->enemies[2].getObject().setPosition({56.0f * tileSize, 5.0f * tileSize}); + this->enemies[3].getObject().setPosition({78.0f * tileSize, 10.0f * tileSize}); + this->enemies[4].getObject().setPosition({82.0f * tileSize, 15.0f * tileSize}); + this->enemies[5].getObject().setPosition({88.0f * tileSize, 4.0f * tileSize}); + this->enemies[6].getObject().setPosition({98.0f * tileSize, 11.0f * tileSize}); + this->enemies[7].getObject().setPosition({103.0f * tileSize, 15.0f * tileSize}); +} + +void EnemyService::enemyLogic() +{ + for (auto it = enemies.begin(); it != enemies.end();) + { + auto &enemy = *it; + if (enemy.getObject().getPosition().y < 0) + { + it = enemies.erase(it); + } + else + { + enemy.logic(); + ++it; + } + } +} + +void EnemyService::drawEnemies() +{ + for (int i = 0; i < enemies.size(); i++) + { + enemies[i].draw(); + } +} + +std::vector &EnemyService::getEnemies() +{ + return this->enemies; +} \ No newline at end of file diff --git a/src/services/StateService.cpp b/src/services/StateService.cpp index c477d51..9b523af 100644 --- a/src/services/StateService.cpp +++ b/src/services/StateService.cpp @@ -49,17 +49,9 @@ void StateService::startGame() // InitWindow(640,544, "Jelly Rescue"); InitWindow(screenSize.x, screenSize.y, "Jelly Rescue"); SetTargetFPS(45); + #if not defined(PLATFORM_WEB) HideCursor(); - - // #if defined(PLATFORM_WEB) - // emscripten_set_keypress_callback(EMSCRIPTEN_EVENT_TARGET_CANVAS, nullptr, 1, staticStep); - // #endif - - // #if defined(PLATFORM_WEB) - // emscripten_set_focusin_callback(EMSCRIPTEN_EVENT_TARGET_CANVAS, nullptr, 1, [](const EmscriptenFocusEvent* event) { - // std::cout << "Canvas Focused!" << std::endl; - // }); - // #endif + #endif setScreen(EScreen::TITLE); @@ -67,7 +59,6 @@ void StateService::startGame() emscripten_set_main_loop(StateService::staticStep, 0, 1); #else - // while (!WindowShouldClose() && instance->gameRunning) while (!WindowShouldClose() && gameRunning) { step(); @@ -90,6 +81,7 @@ void StateService::handleMusic() void StateService::step() { InputService::getInstance().checkKeys(); + InputService::getInstance().checkMousePos(); handleMusic(); currentScreen->draw();