From 93f3e4476bc2889a7b9892f0eeca8ad2cca58369 Mon Sep 17 00:00:00 2001 From: Rishi Saxena Date: Sun, 28 Jul 2024 14:25:36 +0530 Subject: [PATCH 01/56] Added my own window file --- Space-Invaders/main.cpp | 35 ++++++++++++++++++++++++++++++----- 1 file changed, 30 insertions(+), 5 deletions(-) diff --git a/Space-Invaders/main.cpp b/Space-Invaders/main.cpp index 7d5f90dff..194234723 100644 --- a/Space-Invaders/main.cpp +++ b/Space-Invaders/main.cpp @@ -1,5 +1,30 @@ - -int main() -{ - return 0; -} \ No newline at end of file +#include + +int main() +{ + // Define the video mode (dimensions) + sf::VideoMode videoMode = sf::VideoMode(800, 600); + + // Create a window object with specific dimensions and a title + sf::RenderWindow window(videoMode, "My SFML Window"); + + + + while (window.isOpen()) { + sf::Event event; + while (window.pollEvent(event)) { + // Check for window closure + if (event.type == sf::Event::Closed) + window.close(); + } + + + // Clear the window--- + window.clear(sf::Color::Blue); + + // Display whatever you draw + window.display(); + } + + return 0; +} From 676acb27083c928d83d919a1cc580247443014e5 Mon Sep 17 00:00:00 2001 From: Rishi Saxena Date: Mon, 29 Jul 2024 13:17:15 +0530 Subject: [PATCH 02/56] Added new Main.cpp --- Space-Invaders/main.cpp | 55 +++++++++++++++++++++++++++++++++++++---- 1 file changed, 50 insertions(+), 5 deletions(-) diff --git a/Space-Invaders/main.cpp b/Space-Invaders/main.cpp index 7d5f90dff..2963054ca 100644 --- a/Space-Invaders/main.cpp +++ b/Space-Invaders/main.cpp @@ -1,5 +1,50 @@ - -int main() -{ - return 0; -} \ No newline at end of file +#include + +int main() +{ + // Define the video mode (dimensions) + sf::VideoMode videoMode = sf::VideoMode(800, 600); + + // Create a window object with specific dimensions and a title + sf::RenderWindow window(videoMode, "My SFML Window"); + + while (window.isOpen()) { + sf::Event event; + while (window.pollEvent(event)) { + // Check for window closure + if (event.type == sf::Event::Closed) + window.close(); + } + + + // Clear the window--- + window.clear(sf::Color::Magenta); + + //Start + + // Draw a circle + sf::CircleShape circle(50); // Radius 50 + circle.setFillColor(sf::Color::Green); + circle.setPosition(100, 100); // Set position + window.draw(circle); + + //Draw a Red Square + sf::RectangleShape square(sf::Vector2f(50, 50)); + square.setFillColor(sf::Color::Red); + square.setPosition(200, 200); // Set position + window.draw(square); + + //Draw a Blue Triangle + sf::CircleShape Triangle(50, 3); + Triangle.setFillColor(sf::Color::Blue); + Triangle.setPosition(300, 300); // Set position + window.draw(Triangle); + + //End + + // Display whatever you draw + window.display(); + } + + return 0; +} From fe06d7c4cc2e706476aceb5d6dd8a83d9ad15db2 Mon Sep 17 00:00:00 2001 From: Rishi Saxena Date: Mon, 29 Jul 2024 13:27:28 +0530 Subject: [PATCH 03/56] Shapes added --- Space-Invaders/main.cpp | 26 +++++++++++++++++++++++--- 1 file changed, 23 insertions(+), 3 deletions(-) diff --git a/Space-Invaders/main.cpp b/Space-Invaders/main.cpp index 194234723..2963054ca 100644 --- a/Space-Invaders/main.cpp +++ b/Space-Invaders/main.cpp @@ -8,8 +8,6 @@ int main() // Create a window object with specific dimensions and a title sf::RenderWindow window(videoMode, "My SFML Window"); - - while (window.isOpen()) { sf::Event event; while (window.pollEvent(event)) { @@ -20,7 +18,29 @@ int main() // Clear the window--- - window.clear(sf::Color::Blue); + window.clear(sf::Color::Magenta); + + //Start + + // Draw a circle + sf::CircleShape circle(50); // Radius 50 + circle.setFillColor(sf::Color::Green); + circle.setPosition(100, 100); // Set position + window.draw(circle); + + //Draw a Red Square + sf::RectangleShape square(sf::Vector2f(50, 50)); + square.setFillColor(sf::Color::Red); + square.setPosition(200, 200); // Set position + window.draw(square); + + //Draw a Blue Triangle + sf::CircleShape Triangle(50, 3); + Triangle.setFillColor(sf::Color::Blue); + Triangle.setPosition(300, 300); // Set position + window.draw(Triangle); + + //End // Display whatever you draw window.display(); From a096bda7a4ac996f110d5cde921f1b003a79d54f Mon Sep 17 00:00:00 2001 From: Rishi Saxena Date: Mon, 29 Jul 2024 13:46:20 +0530 Subject: [PATCH 04/56] Logo and Sprites --- Space-Invaders/main.cpp | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/Space-Invaders/main.cpp b/Space-Invaders/main.cpp index 2963054ca..c7eaf2cf6 100644 --- a/Space-Invaders/main.cpp +++ b/Space-Invaders/main.cpp @@ -18,7 +18,7 @@ int main() // Clear the window--- - window.clear(sf::Color::Magenta); + window.clear(sf::Color::Black); //Start @@ -40,6 +40,26 @@ int main() Triangle.setPosition(300, 300); // Set position window.draw(Triangle); + //Drawing a sprite + sf::Texture outscal_texture; + outscal_texture.loadFromFile("assets/textures/outscal_logo.png"); + + sf::Sprite outscal_sprite; + outscal_sprite.setTexture(outscal_texture); + + outscal_sprite.setPosition(500, 200); // Position + outscal_sprite.setRotation(45); // Rotation in degrees + outscal_sprite.setScale(0.5, 0.5); // Scale factor + + window.draw(outscal_sprite); + + //Drawing a text + sf::Font font; + font.loadFromFile("assets/fonts/OpenSans.ttf"); + sf::Text text("SFML is Awesome", font, 50); + text.setFillColor(sf::Color::White); + window.draw(text); + //End // Display whatever you draw From fcc675e3a76c97449b5e3a7f2cd29e189606ddff Mon Sep 17 00:00:00 2001 From: Rishi Saxena Date: Mon, 29 Jul 2024 13:49:23 +0530 Subject: [PATCH 05/56] added text and sprites --- Space-Invaders/main.cpp | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/Space-Invaders/main.cpp b/Space-Invaders/main.cpp index 2963054ca..c7eaf2cf6 100644 --- a/Space-Invaders/main.cpp +++ b/Space-Invaders/main.cpp @@ -18,7 +18,7 @@ int main() // Clear the window--- - window.clear(sf::Color::Magenta); + window.clear(sf::Color::Black); //Start @@ -40,6 +40,26 @@ int main() Triangle.setPosition(300, 300); // Set position window.draw(Triangle); + //Drawing a sprite + sf::Texture outscal_texture; + outscal_texture.loadFromFile("assets/textures/outscal_logo.png"); + + sf::Sprite outscal_sprite; + outscal_sprite.setTexture(outscal_texture); + + outscal_sprite.setPosition(500, 200); // Position + outscal_sprite.setRotation(45); // Rotation in degrees + outscal_sprite.setScale(0.5, 0.5); // Scale factor + + window.draw(outscal_sprite); + + //Drawing a text + sf::Font font; + font.loadFromFile("assets/fonts/OpenSans.ttf"); + sf::Text text("SFML is Awesome", font, 50); + text.setFillColor(sf::Color::White); + window.draw(text); + //End // Display whatever you draw From 9b096bbaab273403773ebc492aa7d97b6def8962 Mon Sep 17 00:00:00 2001 From: Rishi Saxena Date: Mon, 29 Jul 2024 15:11:02 +0530 Subject: [PATCH 06/56] OOP --- Space-Invaders/main.cpp | 75 +++++++++++++++++++---------------------- 1 file changed, 34 insertions(+), 41 deletions(-) diff --git a/Space-Invaders/main.cpp b/Space-Invaders/main.cpp index c7eaf2cf6..a92576c58 100644 --- a/Space-Invaders/main.cpp +++ b/Space-Invaders/main.cpp @@ -1,5 +1,38 @@ +#include #include + +class Player +{ +private: + + // Private Properties + int health = 3; + sf::Vector2f position = sf::Vector2f(200.0f, 100.0f); + int movement_speed = 5; + int player_score = 0; + +public: + + // Public Properties + sf::Texture player_texture; + sf::Sprite player_sprite; + + //Public Getter & Setter methods + int getScore() { + return player_score; + }; + + void setScore(int newScore) { + player_score = newScore; + }; + + //New methods + void takeDamage() {}; + void move() {}; + void shootBullets() {}; +}; + int main() { // Define the video mode (dimensions) @@ -20,47 +53,7 @@ int main() // Clear the window--- window.clear(sf::Color::Black); - //Start - - // Draw a circle - sf::CircleShape circle(50); // Radius 50 - circle.setFillColor(sf::Color::Green); - circle.setPosition(100, 100); // Set position - window.draw(circle); - - //Draw a Red Square - sf::RectangleShape square(sf::Vector2f(50, 50)); - square.setFillColor(sf::Color::Red); - square.setPosition(200, 200); // Set position - window.draw(square); - - //Draw a Blue Triangle - sf::CircleShape Triangle(50, 3); - Triangle.setFillColor(sf::Color::Blue); - Triangle.setPosition(300, 300); // Set position - window.draw(Triangle); - - //Drawing a sprite - sf::Texture outscal_texture; - outscal_texture.loadFromFile("assets/textures/outscal_logo.png"); - - sf::Sprite outscal_sprite; - outscal_sprite.setTexture(outscal_texture); - - outscal_sprite.setPosition(500, 200); // Position - outscal_sprite.setRotation(45); // Rotation in degrees - outscal_sprite.setScale(0.5, 0.5); // Scale factor - - window.draw(outscal_sprite); - - //Drawing a text - sf::Font font; - font.loadFromFile("assets/fonts/OpenSans.ttf"); - sf::Text text("SFML is Awesome", font, 50); - text.setFillColor(sf::Color::White); - window.draw(text); - - //End + Player player; // Display whatever you draw window.display(); From 1116b79e83abc5d24616221af8faec5fe5cb694a Mon Sep 17 00:00:00 2001 From: Rishi Saxena Date: Mon, 29 Jul 2024 15:31:37 +0530 Subject: [PATCH 07/56] Added keyboard inputs and getters and setters --- Space-Invaders/main.cpp | 29 ++++++++++++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) diff --git a/Space-Invaders/main.cpp b/Space-Invaders/main.cpp index a92576c58..1c0f08fff 100644 --- a/Space-Invaders/main.cpp +++ b/Space-Invaders/main.cpp @@ -27,6 +27,14 @@ class Player player_score = newScore; }; + sf::Vector2f getPosition() { + return position; + } + + void setPosition(sf::Vector2f newPosition) { + position = newPosition; + } + //New methods void takeDamage() {}; void move() {}; @@ -41,6 +49,14 @@ int main() // Create a window object with specific dimensions and a title sf::RenderWindow window(videoMode, "My SFML Window"); + //Player object + Player player; + + //Load Textures and sprite + player.player_texture.loadFromFile("assets/textures/player_ship.png"); + + player.player_sprite.setTexture(player.player_texture); + while (window.isOpen()) { sf::Event event; while (window.pollEvent(event)) { @@ -49,11 +65,22 @@ int main() window.close(); } + // Handle keyboard input + if (sf::Keyboard::isKeyPressed(sf::Keyboard::Left)) { + player.move(); + } + if (sf::Keyboard::isKeyPressed(sf::Keyboard::Right)) { + player.move(); + } // Clear the window--- window.clear(sf::Color::Black); - Player player; + player.player_sprite.setPosition(player.getPosition()); // Set the position of the player sprite + + window.draw(player.player_sprite); // Draw the player sprite + + window.display(); // Display what was drawn // Display whatever you draw window.display(); From f7c02e37d4686c4b0c40f22870c5180a40718833 Mon Sep 17 00:00:00 2001 From: Rishi Saxena Date: Mon, 29 Jul 2024 16:01:16 +0530 Subject: [PATCH 08/56] Added move functions --- Space-Invaders/main.cpp | 25 ++++++++++++++++--------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/Space-Invaders/main.cpp b/Space-Invaders/main.cpp index 1c0f08fff..8bf8be270 100644 --- a/Space-Invaders/main.cpp +++ b/Space-Invaders/main.cpp @@ -9,7 +9,7 @@ class Player // Private Properties int health = 3; sf::Vector2f position = sf::Vector2f(200.0f, 100.0f); - int movement_speed = 5; + int movement_speed = 1; int player_score = 0; public: @@ -18,7 +18,15 @@ class Player sf::Texture player_texture; sf::Sprite player_sprite; - //Public Getter & Setter methods + //Public Functions, Getter & Setter methods + void move(float offsetX) { + position.x += offsetX; + } + + int getMoveSpeed() { + return movement_speed; + } + int getScore() { return player_score; }; @@ -35,7 +43,7 @@ class Player position = newPosition; } - //New methods + //New methods to be added void takeDamage() {}; void move() {}; void shootBullets() {}; @@ -67,20 +75,19 @@ int main() // Handle keyboard input if (sf::Keyboard::isKeyPressed(sf::Keyboard::Left)) { - player.move(); + player.move(-1.0f* player.getMoveSpeed()); } if (sf::Keyboard::isKeyPressed(sf::Keyboard::Right)) { - player.move(); + player.move(1.0f * player.getMoveSpeed()); } // Clear the window--- window.clear(sf::Color::Black); - player.player_sprite.setPosition(player.getPosition()); // Set the position of the player sprite - - window.draw(player.player_sprite); // Draw the player sprite + // Set and draw player + player.player_sprite.setPosition(player.getPosition()); - window.display(); // Display what was drawn + window.draw(player.player_sprite); // Display whatever you draw window.display(); From 45ea81265b2cef8b95f19842cf6a5780a16c62ad Mon Sep 17 00:00:00 2001 From: Rishi Saxena Date: Tue, 30 Jul 2024 13:23:19 +0530 Subject: [PATCH 09/56] Added Header and Source folders with GameService --- Space-Invaders/Header/GameService.h | 18 ++++++++++++++ Space-Invaders/Source/GameService.cpp | 34 +++++++++++++++++++++++++++ 2 files changed, 52 insertions(+) create mode 100644 Space-Invaders/Header/GameService.h create mode 100644 Space-Invaders/Source/GameService.cpp diff --git a/Space-Invaders/Header/GameService.h b/Space-Invaders/Header/GameService.h new file mode 100644 index 000000000..be6de25a8 --- /dev/null +++ b/Space-Invaders/Header/GameService.h @@ -0,0 +1,18 @@ +#pragma once + + +class GameService +{ +private: + void initialize(); // Handles game initialization. + void destroy(); // Handles cleanup tasks. + +public: + GameService(); // Constructor for initializing the GameService object. + ~GameService(); // Destructor for cleaning up resources upon object deletion. + + void ignite(); // Initiates the game. + void update(); // Updates the game logic and game state. + void render(); // Renders each frame of the game. + bool isRunning(); // Checks if the game is currently running. +}; \ No newline at end of file diff --git a/Space-Invaders/Source/GameService.cpp b/Space-Invaders/Source/GameService.cpp new file mode 100644 index 000000000..0dc9832af --- /dev/null +++ b/Space-Invaders/Source/GameService.cpp @@ -0,0 +1,34 @@ +#include "../Header/GameService.h" + +void GameService::initialize() +{ +} + +void GameService::destroy() +{ +} + +GameService::GameService() +{ +} + +GameService::~GameService() +{ +} + +void GameService::ignite() +{ +} + +void GameService::update() +{ +} + +void GameService::render() +{ +} + +bool GameService::isRunning() +{ + return false; +} From e527f50120c9f729c8a745776f0b58df66e7100b Mon Sep 17 00:00:00 2001 From: Rishi Saxena Date: Tue, 30 Jul 2024 13:32:04 +0530 Subject: [PATCH 10/56] comments and gameloop code shift --- Space-Invaders/main.cpp | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/Space-Invaders/main.cpp b/Space-Invaders/main.cpp index 8bf8be270..3659330ce 100644 --- a/Space-Invaders/main.cpp +++ b/Space-Invaders/main.cpp @@ -1,8 +1,9 @@ #include #include +#include "Header/GameService.h" -class Player +/*class Player { private: @@ -47,10 +48,11 @@ class Player void takeDamage() {}; void move() {}; void shootBullets() {}; -}; +};*/ int main() { + /* // Define the video mode (dimensions) sf::VideoMode videoMode = sf::VideoMode(800, 600); @@ -91,7 +93,13 @@ int main() // Display whatever you draw window.display(); + }*/ + GameService game_service; + game_service.ignite(); + + while (game_service.isRunning()) + { + game_service.update(); + game_service.render(); } - - return 0; } From a5529a711a782e280382708638e0e48bfb128f9c Mon Sep 17 00:00:00 2001 From: Rishi Saxena Date: Tue, 30 Jul 2024 13:55:15 +0530 Subject: [PATCH 11/56] Added Service Locator header and cpp --- Space-Invaders/Header/GameService.h | 1 - Space-Invaders/Header/ServiceLocator.h | 28 ++++++++++++++++++++++ Space-Invaders/Source/ServiceLocator.cpp | 30 ++++++++++++++++++++++++ 3 files changed, 58 insertions(+), 1 deletion(-) create mode 100644 Space-Invaders/Header/ServiceLocator.h create mode 100644 Space-Invaders/Source/ServiceLocator.cpp diff --git a/Space-Invaders/Header/GameService.h b/Space-Invaders/Header/GameService.h index be6de25a8..674677d04 100644 --- a/Space-Invaders/Header/GameService.h +++ b/Space-Invaders/Header/GameService.h @@ -1,6 +1,5 @@ #pragma once - class GameService { private: diff --git a/Space-Invaders/Header/ServiceLocator.h b/Space-Invaders/Header/ServiceLocator.h new file mode 100644 index 000000000..64e5d6126 --- /dev/null +++ b/Space-Invaders/Header/ServiceLocator.h @@ -0,0 +1,28 @@ +#pragma once +// ServiceLocator Class Summary: This class manages access to various services in the application. +// include relevant headers files + +class ServiceLocator +{ +private: + + // Public Methods + ServiceLocator(); + ~ServiceLocator(); + + // Private Methods: + void createServices(); + void clearAllServices(); + +public: + + // Public Methods: + static ServiceLocator* getInstance(); + void initialize(); // Initializes the ServiceLocator. + void update(); // Updates all services. + void render(); // Renders using the services. + + // Methods to Get Specific Services: + //EventService* getEventService(); // Retrieve the EventService instance + //GraphicService* getGraphicService(); // Retrieve the GraphicService instance +}; \ No newline at end of file diff --git a/Space-Invaders/Source/ServiceLocator.cpp b/Space-Invaders/Source/ServiceLocator.cpp new file mode 100644 index 000000000..079366424 --- /dev/null +++ b/Space-Invaders/Source/ServiceLocator.cpp @@ -0,0 +1,30 @@ +#include "../Header/ServiceLocator.h" + +ServiceLocator::~ServiceLocator() +{ +} + +void ServiceLocator::createServices() +{ +} + +void ServiceLocator::clearAllServices() +{ +} + +ServiceLocator* ServiceLocator::getInstance() +{ + return nullptr; +} + +void ServiceLocator::initialize() +{ +} + +void ServiceLocator::update() +{ +} + +void ServiceLocator::render() +{ +} From 9c1cd5ada61a695938bb3d0927eff154137a46f9 Mon Sep 17 00:00:00 2001 From: Rishi Saxena Date: Tue, 30 Jul 2024 15:11:59 +0530 Subject: [PATCH 12/56] Changed Architecture and added links between units --- Space-Invaders/Header/GameService.h | 8 ++++ Space-Invaders/Header/GraphicService.h | 36 ++++++++++++++++ Space-Invaders/Header/ServiceLocator.h | 7 ++- Space-Invaders/Source/GameService.cpp | 51 ++++++++++++++++------ Space-Invaders/Source/GraphicService.cpp | 55 ++++++++++++++++++++++++ Space-Invaders/Source/ServiceLocator.cpp | 47 +++++++++++++------- Space-Invaders/main.cpp | 11 ++--- 7 files changed, 180 insertions(+), 35 deletions(-) create mode 100644 Space-Invaders/Header/GraphicService.h create mode 100644 Space-Invaders/Source/GraphicService.cpp diff --git a/Space-Invaders/Header/GameService.h b/Space-Invaders/Header/GameService.h index 674677d04..32230d67d 100644 --- a/Space-Invaders/Header/GameService.h +++ b/Space-Invaders/Header/GameService.h @@ -1,9 +1,17 @@ #pragma once +#include +#include "../Header/ServiceLocator.h" class GameService { private: + + ServiceLocator* service_locator; + sf::RenderWindow* game_window; + + void initialize(); // Handles game initialization. + void initializeVariables();// Handles game initialization. void destroy(); // Handles cleanup tasks. public: diff --git a/Space-Invaders/Header/GraphicService.h b/Space-Invaders/Header/GraphicService.h new file mode 100644 index 000000000..5f719bb1c --- /dev/null +++ b/Space-Invaders/Header/GraphicService.h @@ -0,0 +1,36 @@ +#pragma once +#include + +class GraphicService +{ +private: + + const std::string game_window_title = "Alien Invader"; + + const int game_window_width = 800; + const int game_window_height = 600; + + const sf::Color window_color = sf::Color::Blue; + + sf::VideoMode* video_mode; // ptr to video mode + sf::RenderWindow* game_window; // ptr to a RenderWindow + + void setVideoMode(); // Method for setting our video mode + void onDestroy(); // method to run when window is deleted + +public: + GraphicService(); + ~GraphicService(); //cleanup + + //method to create the game window. returns a pointer to an instance of the game window + sf::RenderWindow* createGameWindow(); + + + void initialize(); //lifecycle functions + void update(); //.. + void render(); //.. + bool isGameWindowOpen(); //check if the window is open + + sf::RenderWindow* getGameWindow(); //getter for the game window instance + sf::Color getWindowColor();//get the color +}; \ No newline at end of file diff --git a/Space-Invaders/Header/ServiceLocator.h b/Space-Invaders/Header/ServiceLocator.h index 64e5d6126..78dfe507e 100644 --- a/Space-Invaders/Header/ServiceLocator.h +++ b/Space-Invaders/Header/ServiceLocator.h @@ -1,4 +1,6 @@ #pragma once +#include "../Header/GraphicService.h" + // ServiceLocator Class Summary: This class manages access to various services in the application. // include relevant headers files @@ -6,6 +8,9 @@ class ServiceLocator { private: + // Private Attributes: + GraphicService* graphic_service; + // Public Methods ServiceLocator(); ~ServiceLocator(); @@ -24,5 +29,5 @@ class ServiceLocator // Methods to Get Specific Services: //EventService* getEventService(); // Retrieve the EventService instance - //GraphicService* getGraphicService(); // Retrieve the GraphicService instance + GraphicService* getGraphicService(); // Retrieve the GraphicService instance }; \ No newline at end of file diff --git a/Space-Invaders/Source/GameService.cpp b/Space-Invaders/Source/GameService.cpp index 0dc9832af..bf1f6f464 100644 --- a/Space-Invaders/Source/GameService.cpp +++ b/Space-Invaders/Source/GameService.cpp @@ -1,34 +1,57 @@ #include "../Header/GameService.h" +#include "../Header/GraphicService.h" -void GameService::initialize() -{ +// Constructor: Initializes pointers to null. +GameService::GameService() { + service_locator = nullptr; // Set service locator to null + game_window = nullptr; // Set game window to null } -void GameService::destroy() -{ +// Destructor: Calls the destroy function to clean up resources. +GameService::~GameService() { + destroy(); // Clean up and release resources } -GameService::GameService() -{ +// Prepares the game service for use by obtaining the service locator instance and initializing services. +void GameService::ignite() { + service_locator = ServiceLocator::getInstance(); // Get ServiceLocator + initialize(); // Initialize services. } -GameService::~GameService() +//initialize service locator and other variables +void GameService::initialize() { + service_locator->initialize(); + initializeVariables(); } -void GameService::ignite() +void GameService::initializeVariables() { + game_window = service_locator->getGraphicService()->getGameWindow(); //set game window (it was null before this) } -void GameService::update() +void GameService::destroy() { + // don't need to do anything here for now. } -void GameService::render() -{ +// Updates the game logic by delegating to the service locator's update method. +void GameService::update() { + + service_locator->update(); // Call update on the service locator which then updates all its managed services } -bool GameService::isRunning() -{ - return false; +// Clears the window then display it. +void GameService::render() { + // Clears the game window with the background color provided by the graphic service + game_window->clear(service_locator->getGraphicService()->getWindowColor()); + service_locator->render(); // Render the current frame using the service locator + game_window->display(); // Display the rendered frame on the game window } + +// Checks if the game is still running by querying the graphic service's window open status. +bool GameService::isRunning() { + // Returns true if the game window is open, indicating the game is still running + return service_locator->getGraphicService()->isGameWindowOpen(); +} + diff --git a/Space-Invaders/Source/GraphicService.cpp b/Space-Invaders/Source/GraphicService.cpp new file mode 100644 index 000000000..8f3aae085 --- /dev/null +++ b/Space-Invaders/Source/GraphicService.cpp @@ -0,0 +1,55 @@ +#include "../Header/GraphicService.h" + +// Constructor: Initializes game window and video mode pointers to null. +GraphicService::GraphicService() { + game_window = nullptr; // Initializes game window pointer to null + video_mode = nullptr; // Initializes video mode pointer to null +} + +// Destructor: Cleans up resources by calling onDestroy. +GraphicService::~GraphicService() { + onDestroy(); // Calls onDestroy method to clean up resources +} + +// Initializes the graphic service by creating a new game window. +void GraphicService::initialize() { + game_window = createGameWindow(); // Assigns a new game window to the game_window pointer +} + +// Creates a new SFML RenderWindow object with specified video mode and title. +sf::RenderWindow* GraphicService::createGameWindow() { + setVideoMode(); // Sets up the video mode for the window + return new sf::RenderWindow(*video_mode, game_window_title); // Creates and returns a new RenderWindow object +} + +// Sets up the video mode for the game window using specified dimensions and system's color depth. +void GraphicService::setVideoMode() { + video_mode = new sf::VideoMode(game_window_width, game_window_height, sf::VideoMode::getDesktopMode().bitsPerPixel); // Allocates and sets the video mode +} + +// Cleans up allocated memory for video mode and game window to avoid memory leaks. +void GraphicService::onDestroy() { + delete(video_mode); // Deletes the video mode object + delete(game_window); // Deletes the game window object +} + +// Placeholder function for game update logic. +void GraphicService::update() { } + +// Placeholder function for game rendering logic. +void GraphicService::render() { } + +// Checks if the game window is currently open. +bool GraphicService::isGameWindowOpen() { + return game_window->isOpen(); // Returns the open status of the game window +} + +// Returns a pointer to the game window object. +sf::RenderWindow* GraphicService::getGameWindow() { + return game_window; +} + +// Returns the configured window background color. +sf::Color GraphicService::getWindowColor() { + return window_color; +} \ No newline at end of file diff --git a/Space-Invaders/Source/ServiceLocator.cpp b/Space-Invaders/Source/ServiceLocator.cpp index 079366424..b3e690efa 100644 --- a/Space-Invaders/Source/ServiceLocator.cpp +++ b/Space-Invaders/Source/ServiceLocator.cpp @@ -1,30 +1,47 @@ #include "../Header/ServiceLocator.h" -ServiceLocator::~ServiceLocator() -{ +// Constructor: Initializes the graphic_service pointer to null and creates services. +ServiceLocator::ServiceLocator() { + graphic_service = nullptr; // Initialize graphic_service to null + createServices(); // Call createServices to instantiate services } -void ServiceLocator::createServices() -{ +// Destructor: Cleans up resources by clearing all services. +ServiceLocator::~ServiceLocator() { + clearAllServices(); // Call clearAllServices to delete any allocated services } -void ServiceLocator::clearAllServices() -{ +// Creates service instances, specifically the graphic service in this case. +void ServiceLocator::createServices() { + graphic_service = new GraphicService(); // Dynamically create a GraphicService instance } -ServiceLocator* ServiceLocator::getInstance() -{ - return nullptr; +// Deletes allocated services to prevent memory leaks, specifically the graphic service. +void ServiceLocator::clearAllServices() { + delete(graphic_service); // Delete the graphic_service instance + graphic_service = nullptr; // Reset pointer to null to avoid dangling pointer } -void ServiceLocator::initialize() -{ +// Returns a pointer to ServiceLocator. +ServiceLocator* ServiceLocator::getInstance() { + static ServiceLocator instance; // we will discuss what 'static' means at a later time. + return &instance; // Return address of the instance } -void ServiceLocator::update() -{ +// Calls initialize on the graphic service, readying it for use. +void ServiceLocator::initialize() { + graphic_service->initialize(); // Initialize graphic service } -void ServiceLocator::render() -{ +// Updates the state of the graphic service. +void ServiceLocator::update() { + graphic_service->update(); // Update graphic service } + +// Renders using the graphic service. +void ServiceLocator::render() { + graphic_service->render(); // Render graphic service +} + +// Returns a pointer to the currently set graphic service. +GraphicService* ServiceLocator::getGraphicService() { return graphic_service; } \ No newline at end of file diff --git a/Space-Invaders/main.cpp b/Space-Invaders/main.cpp index 3659330ce..900795c1d 100644 --- a/Space-Invaders/main.cpp +++ b/Space-Invaders/main.cpp @@ -94,12 +94,13 @@ int main() // Display whatever you draw window.display(); }*/ - GameService game_service; - game_service.ignite(); + GameService* game_service = new GameService(); - while (game_service.isRunning()) + game_service->ignite(); + + while (game_service->isRunning()) { - game_service.update(); - game_service.render(); + game_service->update(); + game_service->render(); } } From 452befa033bbd789689c2aa65aac5971af57d02e Mon Sep 17 00:00:00 2001 From: Rishi Saxena Date: Tue, 30 Jul 2024 15:28:20 +0530 Subject: [PATCH 13/56] added event service header and cpp --- Space-Invaders/Header/EventService.h | 28 +++++++++++ Space-Invaders/Header/ServiceLocator.h | 4 +- Space-Invaders/Source/EventService.cpp | 42 ++++++++++++++++ Space-Invaders/Source/GameService.cpp | 2 + Space-Invaders/Source/ServiceLocator.cpp | 64 +++++++++++++----------- 5 files changed, 109 insertions(+), 31 deletions(-) create mode 100644 Space-Invaders/Header/EventService.h create mode 100644 Space-Invaders/Source/EventService.cpp diff --git a/Space-Invaders/Header/EventService.h b/Space-Invaders/Header/EventService.h new file mode 100644 index 000000000..80d016bb2 --- /dev/null +++ b/Space-Invaders/Header/EventService.h @@ -0,0 +1,28 @@ +#pragma once + +#include +#include + +class EventService +{ +private: + sf::Event game_event; //event var + sf::RenderWindow* game_window; //ptr to our game window + + bool isGameWindowOpen(); + bool gameWindowWasClosed(); //for the condition we already had - the title bar cross. + bool hasQuitGame(); //for our new 'ESC' condition + + + +public: + EventService(); + ~EventService(); + + void initialize(); + void update(); + void processEvents(); // while window is open we will check for events + bool pressedEscapeKey(); + bool isKeyboardEvent(); + +}; \ No newline at end of file diff --git a/Space-Invaders/Header/ServiceLocator.h b/Space-Invaders/Header/ServiceLocator.h index 78dfe507e..19d7a008d 100644 --- a/Space-Invaders/Header/ServiceLocator.h +++ b/Space-Invaders/Header/ServiceLocator.h @@ -1,5 +1,6 @@ #pragma once #include "../Header/GraphicService.h" +#include "../Header/EventService.h" // ServiceLocator Class Summary: This class manages access to various services in the application. // include relevant headers files @@ -10,6 +11,7 @@ class ServiceLocator // Private Attributes: GraphicService* graphic_service; + EventService* event_service; // Public Methods ServiceLocator(); @@ -28,6 +30,6 @@ class ServiceLocator void render(); // Renders using the services. // Methods to Get Specific Services: - //EventService* getEventService(); // Retrieve the EventService instance + EventService* getEventService(); // Retrieve the EventService instance GraphicService* getGraphicService(); // Retrieve the GraphicService instance }; \ No newline at end of file diff --git a/Space-Invaders/Source/EventService.cpp b/Space-Invaders/Source/EventService.cpp new file mode 100644 index 000000000..d8fc0d68b --- /dev/null +++ b/Space-Invaders/Source/EventService.cpp @@ -0,0 +1,42 @@ +#include "../Header/EventService.h" +#include "../Header/GameService.h" +#include "../Header/GraphicService.h" + +EventService::EventService() { game_window = nullptr; } + +EventService::~EventService() = default; //calls the default destructor + +void EventService::initialize() +{ + game_window = ServiceLocator::getInstance()->getGraphicService()->getGameWindow(); +} + +void EventService::update() +{ + //for later +} + +void EventService::processEvents() +{ + if (isGameWindowOpen()) { + while (game_window->pollEvent(game_event)) { + // Check for window closure + if (gameWindowWasClosed() || hasQuitGame()) + { + game_window->close(); + } + } + } +} + +bool EventService::hasQuitGame() { return (isKeyboardEvent() && pressedEscapeKey()); } // only true if the ESC key is pressed and a keyboard event has been registered + +//checks for if a keyboard key has been pressed +bool EventService::isKeyboardEvent() { return game_event.type == sf::Event::KeyPressed; } + +//control click on the SFML functions to see what they do internally +bool EventService::pressedEscapeKey() { return game_event.key.code == sf::Keyboard::Escape; } + +bool EventService::isGameWindowOpen() { return game_window != nullptr; } + +bool EventService::gameWindowWasClosed() { return game_event.type == sf::Event::Closed; } \ No newline at end of file diff --git a/Space-Invaders/Source/GameService.cpp b/Space-Invaders/Source/GameService.cpp index bf1f6f464..e0fe519e8 100644 --- a/Space-Invaders/Source/GameService.cpp +++ b/Space-Invaders/Source/GameService.cpp @@ -38,6 +38,8 @@ void GameService::destroy() // Updates the game logic by delegating to the service locator's update method. void GameService::update() { + service_locator->getEventService()->processEvents(); + service_locator->update(); // Call update on the service locator which then updates all its managed services } diff --git a/Space-Invaders/Source/ServiceLocator.cpp b/Space-Invaders/Source/ServiceLocator.cpp index b3e690efa..af461c730 100644 --- a/Space-Invaders/Source/ServiceLocator.cpp +++ b/Space-Invaders/Source/ServiceLocator.cpp @@ -1,47 +1,51 @@ #include "../Header/ServiceLocator.h" -// Constructor: Initializes the graphic_service pointer to null and creates services. -ServiceLocator::ServiceLocator() { - graphic_service = nullptr; // Initialize graphic_service to null - createServices(); // Call createServices to instantiate services +ServiceLocator::ServiceLocator() +{ + graphic_service = nullptr; + event_service = nullptr; + createServices(); } - -// Destructor: Cleans up resources by clearing all services. -ServiceLocator::~ServiceLocator() { - clearAllServices(); // Call clearAllServices to delete any allocated services +ServiceLocator::~ServiceLocator() +{ + clearAllServices(); } -// Creates service instances, specifically the graphic service in this case. -void ServiceLocator::createServices() { - graphic_service = new GraphicService(); // Dynamically create a GraphicService instance +void ServiceLocator::createServices() +{ + graphic_service = new GraphicService(); + event_service = new EventService(); } -// Deletes allocated services to prevent memory leaks, specifically the graphic service. -void ServiceLocator::clearAllServices() { - delete(graphic_service); // Delete the graphic_service instance - graphic_service = nullptr; // Reset pointer to null to avoid dangling pointer +void ServiceLocator::clearAllServices() +{ + delete(graphic_service); + delete(event_service); } -// Returns a pointer to ServiceLocator. -ServiceLocator* ServiceLocator::getInstance() { - static ServiceLocator instance; // we will discuss what 'static' means at a later time. - return &instance; // Return address of the instance +ServiceLocator* ServiceLocator::getInstance() +{ + static ServiceLocator instance; + return &instance; } -// Calls initialize on the graphic service, readying it for use. -void ServiceLocator::initialize() { - graphic_service->initialize(); // Initialize graphic service +void ServiceLocator::initialize() +{ + graphic_service->initialize(); + event_service->initialize(); } -// Updates the state of the graphic service. -void ServiceLocator::update() { - graphic_service->update(); // Update graphic service +void ServiceLocator::update() +{ + graphic_service->update(); + event_service->update(); } -// Renders using the graphic service. -void ServiceLocator::render() { - graphic_service->render(); // Render graphic service +void ServiceLocator::render() +{ + graphic_service->render(); + //no event service because nothing to render } -// Returns a pointer to the currently set graphic service. -GraphicService* ServiceLocator::getGraphicService() { return graphic_service; } \ No newline at end of file +GraphicService* ServiceLocator::getGraphicService() { return graphic_service; } +EventService* ServiceLocator::getEventService() { return event_service; } From abdf09b6af4166d62085762cb955722d13a60e9f Mon Sep 17 00:00:00 2001 From: Rishi Saxena Date: Wed, 31 Jul 2024 13:30:41 +0530 Subject: [PATCH 14/56] Added Player Service Header and cpp --- Space-Invaders/Header/EventService.h | 2 + Space-Invaders/Header/PlayerService.h | 37 ++++++++++++++ Space-Invaders/Header/ServiceLocator.h | 3 ++ Space-Invaders/Source/EventService.cpp | 6 ++- Space-Invaders/Source/PlayerService.cpp | 64 ++++++++++++++++++++++++ Space-Invaders/Source/ServiceLocator.cpp | 7 +++ 6 files changed, 117 insertions(+), 2 deletions(-) create mode 100644 Space-Invaders/Header/PlayerService.h create mode 100644 Space-Invaders/Source/PlayerService.cpp diff --git a/Space-Invaders/Header/EventService.h b/Space-Invaders/Header/EventService.h index 80d016bb2..ce9882ddc 100644 --- a/Space-Invaders/Header/EventService.h +++ b/Space-Invaders/Header/EventService.h @@ -24,5 +24,7 @@ class EventService void processEvents(); // while window is open we will check for events bool pressedEscapeKey(); bool isKeyboardEvent(); + bool pressedLeftKey(); // getting inputs for the player + bool pressedRightKey(); }; \ No newline at end of file diff --git a/Space-Invaders/Header/PlayerService.h b/Space-Invaders/Header/PlayerService.h new file mode 100644 index 000000000..9aadf0a0c --- /dev/null +++ b/Space-Invaders/Header/PlayerService.h @@ -0,0 +1,37 @@ +#pragma once +#include + +class PlayerService +{ + +private: + + int health = 3; + sf::Vector2f position = sf::Vector2f(200.0f, 300.0f); + int movement_speed = 1; + int player_score = 0; + + const sf::String player_texture_path = "assets/textures/player_ship.png"; + + sf::Texture player_texture; + sf::Sprite player_sprite; + + sf::RenderWindow* game_window; //as always + + void initializePlayerSprite(); + void processPlayerInput(); + +public: + + PlayerService(); + ~PlayerService(); + + void initialize(); + void update(); + void render(); + + void move(float offsetX); + int getMoveSpeed(); + sf::Vector2f getPlayerPosition(); + +}; \ No newline at end of file diff --git a/Space-Invaders/Header/ServiceLocator.h b/Space-Invaders/Header/ServiceLocator.h index 19d7a008d..7c9a1d6ac 100644 --- a/Space-Invaders/Header/ServiceLocator.h +++ b/Space-Invaders/Header/ServiceLocator.h @@ -1,6 +1,7 @@ #pragma once #include "../Header/GraphicService.h" #include "../Header/EventService.h" +#include "../Header/PlayerService.h" // ServiceLocator Class Summary: This class manages access to various services in the application. // include relevant headers files @@ -12,6 +13,7 @@ class ServiceLocator // Private Attributes: GraphicService* graphic_service; EventService* event_service; + PlayerService* player_service; // Public Methods ServiceLocator(); @@ -32,4 +34,5 @@ class ServiceLocator // Methods to Get Specific Services: EventService* getEventService(); // Retrieve the EventService instance GraphicService* getGraphicService(); // Retrieve the GraphicService instance + PlayerService* getPlayerService(); // Retrieve the PlayerService instance }; \ No newline at end of file diff --git a/Space-Invaders/Source/EventService.cpp b/Space-Invaders/Source/EventService.cpp index d8fc0d68b..6f2941e93 100644 --- a/Space-Invaders/Source/EventService.cpp +++ b/Space-Invaders/Source/EventService.cpp @@ -36,7 +36,9 @@ bool EventService::isKeyboardEvent() { return game_event.type == sf::Event::KeyP //control click on the SFML functions to see what they do internally bool EventService::pressedEscapeKey() { return game_event.key.code == sf::Keyboard::Escape; } - bool EventService::isGameWindowOpen() { return game_window != nullptr; } +bool EventService::gameWindowWasClosed() { return game_event.type == sf::Event::Closed; } -bool EventService::gameWindowWasClosed() { return game_event.type == sf::Event::Closed; } \ No newline at end of file +// Player inputs +bool EventService::pressedLeftKey() { return game_event.key.code == sf::Keyboard::Left; } +bool EventService::pressedRightKey() { return game_event.key.code == sf::Keyboard::Right; } \ No newline at end of file diff --git a/Space-Invaders/Source/PlayerService.cpp b/Space-Invaders/Source/PlayerService.cpp new file mode 100644 index 000000000..e64c0dc1a --- /dev/null +++ b/Space-Invaders/Source/PlayerService.cpp @@ -0,0 +1,64 @@ +#include "../Header/PlayerService.h" +#include "../Header/ServiceLocator.h" + +PlayerService::PlayerService() +{ + game_window = nullptr; +} + +PlayerService::~PlayerService() = default; + +//init +void PlayerService::initialize() +{ + game_window = ServiceLocator::getInstance()->getGraphicService()->getGameWindow(); + initializePlayerSprite(); +} + +//take our players input in update, then set the position. +//order is important here +void PlayerService::update() +{ + processPlayerInput(); + player_sprite.setPosition(getPlayerPosition()); +} + +void PlayerService::render() +{ + game_window->draw(player_sprite); +} + +void PlayerService::processPlayerInput() +{ + // Handle movement - inputs now handled by eventservice + EventService* event_service = ServiceLocator::getInstance()->getEventService(); //get the event service object created in service locator + + if (event_service->isKeyboardEvent()) + { + if (event_service->pressedLeftKey()) + { + move(-1.0f * getMoveSpeed()); + } + + if (event_service->pressedRightKey()) + { + move(1.0f * getMoveSpeed()); + } + } +} + +void PlayerService::initializePlayerSprite() +{ + if (player_texture.loadFromFile(player_texture_path)) + { + player_sprite.setTexture(player_texture); + } +} + +void PlayerService::move(float offsetX) { + position.x += offsetX; +} + +//Getter and Setter Functions +sf::Vector2f PlayerService::getPlayerPosition() { return position; } +int PlayerService::getMoveSpeed() { return movement_speed; } \ No newline at end of file diff --git a/Space-Invaders/Source/ServiceLocator.cpp b/Space-Invaders/Source/ServiceLocator.cpp index af461c730..0e95973c7 100644 --- a/Space-Invaders/Source/ServiceLocator.cpp +++ b/Space-Invaders/Source/ServiceLocator.cpp @@ -4,6 +4,7 @@ ServiceLocator::ServiceLocator() { graphic_service = nullptr; event_service = nullptr; + player_service = nullptr; createServices(); } ServiceLocator::~ServiceLocator() @@ -15,12 +16,14 @@ void ServiceLocator::createServices() { graphic_service = new GraphicService(); event_service = new EventService(); + player_service = new PlayerService(); } void ServiceLocator::clearAllServices() { delete(graphic_service); delete(event_service); + delete(player_service); } ServiceLocator* ServiceLocator::getInstance() @@ -33,19 +36,23 @@ void ServiceLocator::initialize() { graphic_service->initialize(); event_service->initialize(); + player_service->initialize(); } void ServiceLocator::update() { graphic_service->update(); event_service->update(); + player_service->update(); } void ServiceLocator::render() { graphic_service->render(); + player_service->render(); //no event service because nothing to render } GraphicService* ServiceLocator::getGraphicService() { return graphic_service; } EventService* ServiceLocator::getEventService() { return event_service; } +PlayerService* ServiceLocator::getPlayerService() { return player_service; } From e759f6e768adf7e03348899f4840dfbcb5a270ea Mon Sep 17 00:00:00 2001 From: Rishi Saxena Date: Wed, 31 Jul 2024 14:26:58 +0530 Subject: [PATCH 15/56] Added time Service --- Space-Invaders/Header/GraphicService.h | 2 ++ Space-Invaders/Header/PlayerService.h | 5 ++- Space-Invaders/Header/ServiceLocator.h | 3 ++ Space-Invaders/Header/TimeService.h | 28 +++++++++++++++++ Space-Invaders/Source/GraphicService.cpp | 3 +- Space-Invaders/Source/PlayerService.cpp | 17 +++++++++-- Space-Invaders/Source/ServiceLocator.cpp | 7 +++++ Space-Invaders/Source/TimeService.cpp | 39 ++++++++++++++++++++++++ 8 files changed, 99 insertions(+), 5 deletions(-) create mode 100644 Space-Invaders/Header/TimeService.h create mode 100644 Space-Invaders/Source/TimeService.cpp diff --git a/Space-Invaders/Header/GraphicService.h b/Space-Invaders/Header/GraphicService.h index 5f719bb1c..96ed95751 100644 --- a/Space-Invaders/Header/GraphicService.h +++ b/Space-Invaders/Header/GraphicService.h @@ -9,6 +9,8 @@ class GraphicService const int game_window_width = 800; const int game_window_height = 600; + + const int frame_rate = 60; const sf::Color window_color = sf::Color::Blue; diff --git a/Space-Invaders/Header/PlayerService.h b/Space-Invaders/Header/PlayerService.h index 9aadf0a0c..66397a35c 100644 --- a/Space-Invaders/Header/PlayerService.h +++ b/Space-Invaders/Header/PlayerService.h @@ -8,7 +8,7 @@ class PlayerService int health = 3; sf::Vector2f position = sf::Vector2f(200.0f, 300.0f); - int movement_speed = 1; + float movement_speed = 350.f; int player_score = 0; const sf::String player_texture_path = "assets/textures/player_ship.png"; @@ -21,6 +21,9 @@ class PlayerService void initializePlayerSprite(); void processPlayerInput(); + void moveLeft(); + void moveRight(); + public: PlayerService(); diff --git a/Space-Invaders/Header/ServiceLocator.h b/Space-Invaders/Header/ServiceLocator.h index 7c9a1d6ac..df101d414 100644 --- a/Space-Invaders/Header/ServiceLocator.h +++ b/Space-Invaders/Header/ServiceLocator.h @@ -2,6 +2,7 @@ #include "../Header/GraphicService.h" #include "../Header/EventService.h" #include "../Header/PlayerService.h" +#include "../Header/TimeService.h" // ServiceLocator Class Summary: This class manages access to various services in the application. // include relevant headers files @@ -14,6 +15,7 @@ class ServiceLocator GraphicService* graphic_service; EventService* event_service; PlayerService* player_service; + TimeService* time_service; // Public Methods ServiceLocator(); @@ -35,4 +37,5 @@ class ServiceLocator EventService* getEventService(); // Retrieve the EventService instance GraphicService* getGraphicService(); // Retrieve the GraphicService instance PlayerService* getPlayerService(); // Retrieve the PlayerService instance + TimeService* getTimeService(); // Retrieve the TimeService instance }; \ No newline at end of file diff --git a/Space-Invaders/Header/TimeService.h b/Space-Invaders/Header/TimeService.h new file mode 100644 index 000000000..24ddec14a --- /dev/null +++ b/Space-Invaders/Header/TimeService.h @@ -0,0 +1,28 @@ +#pragma once +#include + + // The TimeService class helps keep track of time in game and calculate delta time. + // Utilizes the library to calculate delta time. +class TimeService +{ +private: + + // A point in time which indicates the starting time of previous frame. + std::chrono::time_point previous_time; + + float delta_time; //to store the detla time + + void updateDeltaTime(); // method to update time + float calculateDeltaTime(); //calculate time by subtracting the previous time from the current time + void updatePreviousTime(); // finally update the current time to be previous time + +public: + + //lifecycle methods + void initialize(); + void update(); + + //getter + float getDeltaTime(); +}; + diff --git a/Space-Invaders/Source/GraphicService.cpp b/Space-Invaders/Source/GraphicService.cpp index 8f3aae085..2cfef211f 100644 --- a/Space-Invaders/Source/GraphicService.cpp +++ b/Space-Invaders/Source/GraphicService.cpp @@ -13,7 +13,8 @@ GraphicService::~GraphicService() { // Initializes the graphic service by creating a new game window. void GraphicService::initialize() { - game_window = createGameWindow(); // Assigns a new game window to the game_window pointer + game_window = createGameWindow(); // Assigns a new game window + game_window->setFramerateLimit(frame_rate); // setting a frame rate limit } // Creates a new SFML RenderWindow object with specified video mode and title. diff --git a/Space-Invaders/Source/PlayerService.cpp b/Space-Invaders/Source/PlayerService.cpp index e64c0dc1a..0d8e4e45e 100644 --- a/Space-Invaders/Source/PlayerService.cpp +++ b/Space-Invaders/Source/PlayerService.cpp @@ -37,16 +37,27 @@ void PlayerService::processPlayerInput() { if (event_service->pressedLeftKey()) { - move(-1.0f * getMoveSpeed()); + moveLeft(); } if (event_service->pressedRightKey()) { - move(1.0f * getMoveSpeed()); + moveRight(); } } } +// New movement methods +void PlayerService::moveLeft() +{ + position.x -= movement_speed * ServiceLocator::getInstance()->getTimeService()->getDeltaTime(); +} + +void PlayerService::moveRight() +{ + position.x += movement_speed * ServiceLocator::getInstance()->getTimeService()->getDeltaTime(); +} + void PlayerService::initializePlayerSprite() { if (player_texture.loadFromFile(player_texture_path)) @@ -56,7 +67,7 @@ void PlayerService::initializePlayerSprite() } void PlayerService::move(float offsetX) { - position.x += offsetX; + position.x += offsetX * ServiceLocator::getInstance()->getTimeService()->getDeltaTime(); } //Getter and Setter Functions diff --git a/Space-Invaders/Source/ServiceLocator.cpp b/Space-Invaders/Source/ServiceLocator.cpp index 0e95973c7..a8fbc2d90 100644 --- a/Space-Invaders/Source/ServiceLocator.cpp +++ b/Space-Invaders/Source/ServiceLocator.cpp @@ -5,6 +5,7 @@ ServiceLocator::ServiceLocator() graphic_service = nullptr; event_service = nullptr; player_service = nullptr; + time_service = nullptr; createServices(); } ServiceLocator::~ServiceLocator() @@ -17,6 +18,7 @@ void ServiceLocator::createServices() graphic_service = new GraphicService(); event_service = new EventService(); player_service = new PlayerService(); + time_service = new TimeService(); } void ServiceLocator::clearAllServices() @@ -24,6 +26,7 @@ void ServiceLocator::clearAllServices() delete(graphic_service); delete(event_service); delete(player_service); + delete(time_service); } ServiceLocator* ServiceLocator::getInstance() @@ -37,6 +40,7 @@ void ServiceLocator::initialize() graphic_service->initialize(); event_service->initialize(); player_service->initialize(); + time_service->initialize(); } void ServiceLocator::update() @@ -44,6 +48,7 @@ void ServiceLocator::update() graphic_service->update(); event_service->update(); player_service->update(); + time_service->update(); } void ServiceLocator::render() @@ -51,8 +56,10 @@ void ServiceLocator::render() graphic_service->render(); player_service->render(); //no event service because nothing to render + //no time service } GraphicService* ServiceLocator::getGraphicService() { return graphic_service; } EventService* ServiceLocator::getEventService() { return event_service; } PlayerService* ServiceLocator::getPlayerService() { return player_service; } +TimeService* ServiceLocator::getTimeService() { return time_service; } diff --git a/Space-Invaders/Source/TimeService.cpp b/Space-Invaders/Source/TimeService.cpp new file mode 100644 index 000000000..7ede82971 --- /dev/null +++ b/Space-Invaders/Source/TimeService.cpp @@ -0,0 +1,39 @@ +#include "../Header/TimeService.h" + +void TimeService::initialize() +{ + previous_time = std::chrono::steady_clock::now(); + delta_time = 0; +} + +void TimeService::update() +{ + updateDeltaTime(); +} + +float TimeService::getDeltaTime() +{ + return delta_time; +} + +void TimeService::updateDeltaTime() +{ + delta_time = calculateDeltaTime(); + updatePreviousTime(); +} + +float TimeService::calculateDeltaTime() +{ + // Calculate time difference in microseconds between the current and previous frame. + int delta = std::chrono::duration_cast( + std::chrono::steady_clock::now() - previous_time).count(); + + // The cast is used to convert delta time from microseconds into seconds. + return static_cast(delta) / static_cast(1000000); +} + +// Update previous_time to the current time +void TimeService::updatePreviousTime() +{ + previous_time = std::chrono::steady_clock::now(); +} From 943dfd9925012b9808f071d5bd12b06d098ca778 Mon Sep 17 00:00:00 2001 From: Rishi Saxena Date: Wed, 31 Jul 2024 15:23:11 +0530 Subject: [PATCH 16/56] Split the player into 3 different units --- .../Header/Player/PlayerController.h | 1 + Space-Invaders/Header/Player/PlayerModel.h | 43 ++++++++++++++++++ Space-Invaders/Header/Player/PlayerView.h | 1 + .../Source/Player/PlayerController.cpp | 0 Space-Invaders/Source/Player/PlayerModel.cpp | 45 +++++++++++++++++++ Space-Invaders/Source/Player/PlayerView.cpp | 0 6 files changed, 90 insertions(+) create mode 100644 Space-Invaders/Header/Player/PlayerController.h create mode 100644 Space-Invaders/Header/Player/PlayerModel.h create mode 100644 Space-Invaders/Header/Player/PlayerView.h create mode 100644 Space-Invaders/Source/Player/PlayerController.cpp create mode 100644 Space-Invaders/Source/Player/PlayerModel.cpp create mode 100644 Space-Invaders/Source/Player/PlayerView.cpp diff --git a/Space-Invaders/Header/Player/PlayerController.h b/Space-Invaders/Header/Player/PlayerController.h new file mode 100644 index 000000000..50e96676b --- /dev/null +++ b/Space-Invaders/Header/Player/PlayerController.h @@ -0,0 +1 @@ +#pragma once diff --git a/Space-Invaders/Header/Player/PlayerModel.h b/Space-Invaders/Header/Player/PlayerModel.h new file mode 100644 index 000000000..cf048eca5 --- /dev/null +++ b/Space-Invaders/Header/Player/PlayerModel.h @@ -0,0 +1,43 @@ +#pragma once +#include + +enum class PlayerState //Our Enum +{ + ALIVE, + DEAD, + // we will add more states later +}; + +class PlayerModel +{ +private: + const sf::Vector2f initial_player_position = sf::Vector2f(500.f, 500.f); + + sf::Vector2f player_position; + PlayerState player_state; //Declaration + int player_score; + +public: + const sf::Vector2f left_most_position = sf::Vector2f(50.f, 0.f); + const sf::Vector2f right_most_position = sf::Vector2f(700.f, 0.f); + + const float player_movement_speed = 200.0f; + + PlayerModel(); + ~PlayerModel(); + + void initialize(); + void reset(); + + sf::Vector2f getPlayerPosition(); + void setPlayerPosition(sf::Vector2f position); + + int getPlayerScore(); + void setPlayerScore(int score); + + //new getter and setter + PlayerState getPlayerState(); + void setPlayerState(PlayerState state); + + +}; diff --git a/Space-Invaders/Header/Player/PlayerView.h b/Space-Invaders/Header/Player/PlayerView.h new file mode 100644 index 000000000..50e96676b --- /dev/null +++ b/Space-Invaders/Header/Player/PlayerView.h @@ -0,0 +1 @@ +#pragma once diff --git a/Space-Invaders/Source/Player/PlayerController.cpp b/Space-Invaders/Source/Player/PlayerController.cpp new file mode 100644 index 000000000..e69de29bb diff --git a/Space-Invaders/Source/Player/PlayerModel.cpp b/Space-Invaders/Source/Player/PlayerModel.cpp new file mode 100644 index 000000000..0d51db820 --- /dev/null +++ b/Space-Invaders/Source/Player/PlayerModel.cpp @@ -0,0 +1,45 @@ +#include "../../Header/Player/PlayerModel.h" + +PlayerModel::PlayerModel() { } + +PlayerModel::~PlayerModel() { } + +void PlayerModel::initialize() { reset(); } // remember to call reset() + +void PlayerModel::reset() +{ + player_state = PlayerState::ALIVE; // set state to alive + player_position = initial_player_position; + player_score = 0; +} + +sf::Vector2f PlayerModel::getPlayerPosition() +{ + return player_position; +} + +void PlayerModel::setPlayerPosition(sf::Vector2f position) +{ + player_position = position; +} + +int PlayerModel::getPlayerScore() +{ + return player_score; +} + +void PlayerModel::setPlayerScore(int score) +{ + player_score = score; +} + +//.. +PlayerState PlayerModel::getPlayerState() +{ + return player_state; +} + +void PlayerModel::setPlayerState(PlayerState state) +{ + player_state = state; +} \ No newline at end of file diff --git a/Space-Invaders/Source/Player/PlayerView.cpp b/Space-Invaders/Source/Player/PlayerView.cpp new file mode 100644 index 000000000..e69de29bb From e01b88b7f463b44ebfa31ca910838490bc97376e Mon Sep 17 00:00:00 2001 From: Rishi Saxena Date: Wed, 31 Jul 2024 15:38:14 +0530 Subject: [PATCH 17/56] Added code to player units --- .../Header/Player/PlayerController.h | 24 +++++++ Space-Invaders/Header/Player/PlayerView.h | 30 ++++++++ Space-Invaders/Header/PlayerService.h | 40 +++-------- .../Source/Player/PlayerController.cpp | 72 +++++++++++++++++++ Space-Invaders/Source/Player/PlayerView.cpp | 50 +++++++++++++ Space-Invaders/Source/PlayerService.cpp | 68 +++--------------- 6 files changed, 194 insertions(+), 90 deletions(-) diff --git a/Space-Invaders/Header/Player/PlayerController.h b/Space-Invaders/Header/Player/PlayerController.h index 50e96676b..9ea24d95d 100644 --- a/Space-Invaders/Header/Player/PlayerController.h +++ b/Space-Invaders/Header/Player/PlayerController.h @@ -1 +1,25 @@ #pragma once +#include +#include "../Player/PlayerModel.h" +#include "../Player/PlayerView.h" + +class PlayerController +{ +private: + PlayerView* player_view; + PlayerModel* player_model; + + void processPlayerInput(); + void moveLeft(); + void moveRight(); + +public: + PlayerController(); + ~PlayerController(); + + void initialize(); + void update(); + void render(); + + sf::Vector2f getPlayerPosition(); +}; \ No newline at end of file diff --git a/Space-Invaders/Header/Player/PlayerView.h b/Space-Invaders/Header/Player/PlayerView.h index 50e96676b..8a1aa85e9 100644 --- a/Space-Invaders/Header/Player/PlayerView.h +++ b/Space-Invaders/Header/Player/PlayerView.h @@ -1 +1,31 @@ #pragma once +#include +#include "../../Header/Player/PlayerController.h" + +class PlayerView +{ +private: + + const sf::String player_texture_path = "assets/textures/player_ship.png"; + const float player_sprite_width = 60.f; + const float player_sprite_height = 60.f; + + sf::RenderWindow* game_window; + + sf::Texture player_texture; + sf::Sprite player_sprite; + + void initializePlayerSprite(); + void scalePlayerSprite(); + + PlayerController* player_controller; // ptr to player controller + +public: + PlayerView(); + ~PlayerView(); + + void initialize(); + void update(); + void render(); + void initialize(PlayerController* controller); +}; \ No newline at end of file diff --git a/Space-Invaders/Header/PlayerService.h b/Space-Invaders/Header/PlayerService.h index 66397a35c..2f46d4894 100644 --- a/Space-Invaders/Header/PlayerService.h +++ b/Space-Invaders/Header/PlayerService.h @@ -1,40 +1,16 @@ #pragma once -#include +#include "../../Header/Player/PlayerController.h" class PlayerService { - private: - - int health = 3; - sf::Vector2f position = sf::Vector2f(200.0f, 300.0f); - float movement_speed = 350.f; - int player_score = 0; - - const sf::String player_texture_path = "assets/textures/player_ship.png"; - - sf::Texture player_texture; - sf::Sprite player_sprite; - - sf::RenderWindow* game_window; //as always - - void initializePlayerSprite(); - void processPlayerInput(); - - void moveLeft(); - void moveRight(); + PlayerController* player_controller; public: + PlayerService(); + ~PlayerService(); - PlayerService(); - ~PlayerService(); - - void initialize(); - void update(); - void render(); - - void move(float offsetX); - int getMoveSpeed(); - sf::Vector2f getPlayerPosition(); - -}; \ No newline at end of file + void initialize(); + void update(); + void render(); +}; diff --git a/Space-Invaders/Source/Player/PlayerController.cpp b/Space-Invaders/Source/Player/PlayerController.cpp index e69de29bb..19181c698 100644 --- a/Space-Invaders/Source/Player/PlayerController.cpp +++ b/Space-Invaders/Source/Player/PlayerController.cpp @@ -0,0 +1,72 @@ +#include "../../Header/Player/PlayerController.h" +#include "../../Header/EventService.h" +#include "../../Header/ServiceLocator.h" +#include + +PlayerController::PlayerController() +{ + player_view = new PlayerView(); + player_model = new PlayerModel(); +} + +PlayerController::~PlayerController() +{ + delete (player_view); + delete (player_model); +} +//the controller is responsible for calling the lifecycle methods for the other two +void PlayerController::initialize() +{ + player_model->initialize(); + + //This will give an error right now since we haven't included the controller in the view. + player_view->initialize(this); // 'this' refers to the class we are currently inside +} + +void PlayerController::update() +{ + processPlayerInput(); + player_view->update(); // we update() the view +} + +void PlayerController::render() +{ + player_view->render(); // render the view +} + +sf::Vector2f PlayerController::getPlayerPosition() +{ + return player_model->getPlayerPosition(); +} + +void PlayerController::processPlayerInput() +{ + // we will move this to event service at a later time + if ((sf::Keyboard::isKeyPressed(sf::Keyboard::Left))) + { + moveLeft(); + } + // we will move this to event service at a later time + if ((sf::Keyboard::isKeyPressed(sf::Keyboard::Right))) + { + moveRight(); + } +} + +void PlayerController::moveLeft() +{ + sf::Vector2f currentPosition = player_model->getPlayerPosition(); + currentPosition.x -= player_model->player_movement_speed * ServiceLocator::getInstance()->getTimeService()->getDeltaTime(); + + currentPosition.x = std::max(currentPosition.x, player_model->left_most_position.x); + player_model->setPlayerPosition(currentPosition); +} + +void PlayerController::moveRight() +{ + sf::Vector2f currentPosition = player_model->getPlayerPosition(); + currentPosition.x += player_model->player_movement_speed * ServiceLocator::getInstance()->getTimeService()->getDeltaTime(); + + currentPosition.x = std::min(currentPosition.x, player_model->right_most_position.x); + player_model->setPlayerPosition(currentPosition); +} \ No newline at end of file diff --git a/Space-Invaders/Source/Player/PlayerView.cpp b/Space-Invaders/Source/Player/PlayerView.cpp index e69de29bb..93762cd15 100644 --- a/Space-Invaders/Source/Player/PlayerView.cpp +++ b/Space-Invaders/Source/Player/PlayerView.cpp @@ -0,0 +1,50 @@ +#include "../../Header/Player/PlayerView.h" +#include "../../Header/ServiceLocator.h" + +PlayerView::PlayerView() { } + +PlayerView::~PlayerView() { } + +void PlayerView::initialize() +{ + + game_window = ServiceLocator::getInstance()->getGraphicService()->getGameWindow(); + initializePlayerSprite(); +} + +void PlayerView::initialize(PlayerController* controller) +{ + player_controller = controller; //to later use it for setting position + game_window = ServiceLocator::getInstance()->getGraphicService()->getGameWindow(); + initializePlayerSprite(); +} + +void PlayerView::initializePlayerSprite() +{ + if (player_texture.loadFromFile(player_texture_path)) + { + player_sprite.setTexture(player_texture); + scalePlayerSprite(); + } +} + +void PlayerView::scalePlayerSprite() +{ + // setScale is an inbuilt method of the sprite class that takes two floats to scale the sprite. it scales the sprite to our desired height + player_sprite.setScale( + //Here we find the factor to scale our sprites with. Ignore the static_cast for now, we will discuss it later. + static_cast(player_sprite_width) / player_sprite.getTexture()->getSize().x, + static_cast(player_sprite_height) / player_sprite.getTexture()->getSize().y + ); +} + +void PlayerView::update() +{ + //set the updated position before we render + player_sprite.setPosition(player_controller->getPlayerPosition()); +} + +void PlayerView::render() +{ + game_window->draw(player_sprite); +} \ No newline at end of file diff --git a/Space-Invaders/Source/PlayerService.cpp b/Space-Invaders/Source/PlayerService.cpp index 0d8e4e45e..8b19d77f9 100644 --- a/Space-Invaders/Source/PlayerService.cpp +++ b/Space-Invaders/Source/PlayerService.cpp @@ -1,75 +1,27 @@ #include "../Header/PlayerService.h" -#include "../Header/ServiceLocator.h" +#include "../Header/Player/PlayerController.h" PlayerService::PlayerService() { - game_window = nullptr; + player_controller = new PlayerController(); } -PlayerService::~PlayerService() = default; +PlayerService::~PlayerService() +{ + delete (player_controller); +} -//init void PlayerService::initialize() { - game_window = ServiceLocator::getInstance()->getGraphicService()->getGameWindow(); - initializePlayerSprite(); + player_controller->initialize(); } -//take our players input in update, then set the position. -//order is important here void PlayerService::update() { - processPlayerInput(); - player_sprite.setPosition(getPlayerPosition()); + player_controller->update(); } void PlayerService::render() { - game_window->draw(player_sprite); -} - -void PlayerService::processPlayerInput() -{ - // Handle movement - inputs now handled by eventservice - EventService* event_service = ServiceLocator::getInstance()->getEventService(); //get the event service object created in service locator - - if (event_service->isKeyboardEvent()) - { - if (event_service->pressedLeftKey()) - { - moveLeft(); - } - - if (event_service->pressedRightKey()) - { - moveRight(); - } - } -} - -// New movement methods -void PlayerService::moveLeft() -{ - position.x -= movement_speed * ServiceLocator::getInstance()->getTimeService()->getDeltaTime(); -} - -void PlayerService::moveRight() -{ - position.x += movement_speed * ServiceLocator::getInstance()->getTimeService()->getDeltaTime(); -} - -void PlayerService::initializePlayerSprite() -{ - if (player_texture.loadFromFile(player_texture_path)) - { - player_sprite.setTexture(player_texture); - } -} - -void PlayerService::move(float offsetX) { - position.x += offsetX * ServiceLocator::getInstance()->getTimeService()->getDeltaTime(); -} - -//Getter and Setter Functions -sf::Vector2f PlayerService::getPlayerPosition() { return position; } -int PlayerService::getMoveSpeed() { return movement_speed; } \ No newline at end of file + player_controller->render(); +} \ No newline at end of file From 621747db4a8ed9a8c99a3409b47593db7dd674bb Mon Sep 17 00:00:00 2001 From: Rishi Saxena Date: Thu, 1 Aug 2024 14:13:13 +0530 Subject: [PATCH 18/56] Delete Space-Invaders/Header directory --- Space-Invaders/Header/EventService.h | 28 -------------------- Space-Invaders/Header/GameService.h | 25 ------------------ Space-Invaders/Header/GraphicService.h | 36 -------------------------- Space-Invaders/Header/ServiceLocator.h | 35 ------------------------- 4 files changed, 124 deletions(-) delete mode 100644 Space-Invaders/Header/EventService.h delete mode 100644 Space-Invaders/Header/GameService.h delete mode 100644 Space-Invaders/Header/GraphicService.h delete mode 100644 Space-Invaders/Header/ServiceLocator.h diff --git a/Space-Invaders/Header/EventService.h b/Space-Invaders/Header/EventService.h deleted file mode 100644 index 80d016bb2..000000000 --- a/Space-Invaders/Header/EventService.h +++ /dev/null @@ -1,28 +0,0 @@ -#pragma once - -#include -#include - -class EventService -{ -private: - sf::Event game_event; //event var - sf::RenderWindow* game_window; //ptr to our game window - - bool isGameWindowOpen(); - bool gameWindowWasClosed(); //for the condition we already had - the title bar cross. - bool hasQuitGame(); //for our new 'ESC' condition - - - -public: - EventService(); - ~EventService(); - - void initialize(); - void update(); - void processEvents(); // while window is open we will check for events - bool pressedEscapeKey(); - bool isKeyboardEvent(); - -}; \ No newline at end of file diff --git a/Space-Invaders/Header/GameService.h b/Space-Invaders/Header/GameService.h deleted file mode 100644 index 32230d67d..000000000 --- a/Space-Invaders/Header/GameService.h +++ /dev/null @@ -1,25 +0,0 @@ -#pragma once -#include -#include "../Header/ServiceLocator.h" - -class GameService -{ -private: - - ServiceLocator* service_locator; - sf::RenderWindow* game_window; - - - void initialize(); // Handles game initialization. - void initializeVariables();// Handles game initialization. - void destroy(); // Handles cleanup tasks. - -public: - GameService(); // Constructor for initializing the GameService object. - ~GameService(); // Destructor for cleaning up resources upon object deletion. - - void ignite(); // Initiates the game. - void update(); // Updates the game logic and game state. - void render(); // Renders each frame of the game. - bool isRunning(); // Checks if the game is currently running. -}; \ No newline at end of file diff --git a/Space-Invaders/Header/GraphicService.h b/Space-Invaders/Header/GraphicService.h deleted file mode 100644 index 5f719bb1c..000000000 --- a/Space-Invaders/Header/GraphicService.h +++ /dev/null @@ -1,36 +0,0 @@ -#pragma once -#include - -class GraphicService -{ -private: - - const std::string game_window_title = "Alien Invader"; - - const int game_window_width = 800; - const int game_window_height = 600; - - const sf::Color window_color = sf::Color::Blue; - - sf::VideoMode* video_mode; // ptr to video mode - sf::RenderWindow* game_window; // ptr to a RenderWindow - - void setVideoMode(); // Method for setting our video mode - void onDestroy(); // method to run when window is deleted - -public: - GraphicService(); - ~GraphicService(); //cleanup - - //method to create the game window. returns a pointer to an instance of the game window - sf::RenderWindow* createGameWindow(); - - - void initialize(); //lifecycle functions - void update(); //.. - void render(); //.. - bool isGameWindowOpen(); //check if the window is open - - sf::RenderWindow* getGameWindow(); //getter for the game window instance - sf::Color getWindowColor();//get the color -}; \ No newline at end of file diff --git a/Space-Invaders/Header/ServiceLocator.h b/Space-Invaders/Header/ServiceLocator.h deleted file mode 100644 index 19d7a008d..000000000 --- a/Space-Invaders/Header/ServiceLocator.h +++ /dev/null @@ -1,35 +0,0 @@ -#pragma once -#include "../Header/GraphicService.h" -#include "../Header/EventService.h" - -// ServiceLocator Class Summary: This class manages access to various services in the application. -// include relevant headers files - -class ServiceLocator -{ -private: - - // Private Attributes: - GraphicService* graphic_service; - EventService* event_service; - - // Public Methods - ServiceLocator(); - ~ServiceLocator(); - - // Private Methods: - void createServices(); - void clearAllServices(); - -public: - - // Public Methods: - static ServiceLocator* getInstance(); - void initialize(); // Initializes the ServiceLocator. - void update(); // Updates all services. - void render(); // Renders using the services. - - // Methods to Get Specific Services: - EventService* getEventService(); // Retrieve the EventService instance - GraphicService* getGraphicService(); // Retrieve the GraphicService instance -}; \ No newline at end of file From 433948443619e10fb6cd4f48589262f61a25e7e2 Mon Sep 17 00:00:00 2001 From: Rishi Saxena Date: Thu, 1 Aug 2024 14:13:29 +0530 Subject: [PATCH 19/56] Delete Space-Invaders/Source directory --- Space-Invaders/Source/EventService.cpp | 42 ----------------- Space-Invaders/Source/GameService.cpp | 59 ------------------------ Space-Invaders/Source/GraphicService.cpp | 55 ---------------------- Space-Invaders/Source/ServiceLocator.cpp | 51 -------------------- 4 files changed, 207 deletions(-) delete mode 100644 Space-Invaders/Source/EventService.cpp delete mode 100644 Space-Invaders/Source/GameService.cpp delete mode 100644 Space-Invaders/Source/GraphicService.cpp delete mode 100644 Space-Invaders/Source/ServiceLocator.cpp diff --git a/Space-Invaders/Source/EventService.cpp b/Space-Invaders/Source/EventService.cpp deleted file mode 100644 index d8fc0d68b..000000000 --- a/Space-Invaders/Source/EventService.cpp +++ /dev/null @@ -1,42 +0,0 @@ -#include "../Header/EventService.h" -#include "../Header/GameService.h" -#include "../Header/GraphicService.h" - -EventService::EventService() { game_window = nullptr; } - -EventService::~EventService() = default; //calls the default destructor - -void EventService::initialize() -{ - game_window = ServiceLocator::getInstance()->getGraphicService()->getGameWindow(); -} - -void EventService::update() -{ - //for later -} - -void EventService::processEvents() -{ - if (isGameWindowOpen()) { - while (game_window->pollEvent(game_event)) { - // Check for window closure - if (gameWindowWasClosed() || hasQuitGame()) - { - game_window->close(); - } - } - } -} - -bool EventService::hasQuitGame() { return (isKeyboardEvent() && pressedEscapeKey()); } // only true if the ESC key is pressed and a keyboard event has been registered - -//checks for if a keyboard key has been pressed -bool EventService::isKeyboardEvent() { return game_event.type == sf::Event::KeyPressed; } - -//control click on the SFML functions to see what they do internally -bool EventService::pressedEscapeKey() { return game_event.key.code == sf::Keyboard::Escape; } - -bool EventService::isGameWindowOpen() { return game_window != nullptr; } - -bool EventService::gameWindowWasClosed() { return game_event.type == sf::Event::Closed; } \ No newline at end of file diff --git a/Space-Invaders/Source/GameService.cpp b/Space-Invaders/Source/GameService.cpp deleted file mode 100644 index e0fe519e8..000000000 --- a/Space-Invaders/Source/GameService.cpp +++ /dev/null @@ -1,59 +0,0 @@ -#include "../Header/GameService.h" -#include "../Header/GraphicService.h" - -// Constructor: Initializes pointers to null. -GameService::GameService() { - service_locator = nullptr; // Set service locator to null - game_window = nullptr; // Set game window to null -} - -// Destructor: Calls the destroy function to clean up resources. -GameService::~GameService() { - destroy(); // Clean up and release resources -} - -// Prepares the game service for use by obtaining the service locator instance and initializing services. -void GameService::ignite() { - service_locator = ServiceLocator::getInstance(); // Get ServiceLocator - initialize(); // Initialize services. -} - -//initialize service locator and other variables -void GameService::initialize() -{ - service_locator->initialize(); - initializeVariables(); -} - -void GameService::initializeVariables() -{ - game_window = service_locator->getGraphicService()->getGameWindow(); //set game window (it was null before this) -} - -void GameService::destroy() -{ - // don't need to do anything here for now. -} - -// Updates the game logic by delegating to the service locator's update method. -void GameService::update() { - - service_locator->getEventService()->processEvents(); - - service_locator->update(); // Call update on the service locator which then updates all its managed services -} - -// Clears the window then display it. -void GameService::render() { - // Clears the game window with the background color provided by the graphic service - game_window->clear(service_locator->getGraphicService()->getWindowColor()); - service_locator->render(); // Render the current frame using the service locator - game_window->display(); // Display the rendered frame on the game window -} - -// Checks if the game is still running by querying the graphic service's window open status. -bool GameService::isRunning() { - // Returns true if the game window is open, indicating the game is still running - return service_locator->getGraphicService()->isGameWindowOpen(); -} - diff --git a/Space-Invaders/Source/GraphicService.cpp b/Space-Invaders/Source/GraphicService.cpp deleted file mode 100644 index 8f3aae085..000000000 --- a/Space-Invaders/Source/GraphicService.cpp +++ /dev/null @@ -1,55 +0,0 @@ -#include "../Header/GraphicService.h" - -// Constructor: Initializes game window and video mode pointers to null. -GraphicService::GraphicService() { - game_window = nullptr; // Initializes game window pointer to null - video_mode = nullptr; // Initializes video mode pointer to null -} - -// Destructor: Cleans up resources by calling onDestroy. -GraphicService::~GraphicService() { - onDestroy(); // Calls onDestroy method to clean up resources -} - -// Initializes the graphic service by creating a new game window. -void GraphicService::initialize() { - game_window = createGameWindow(); // Assigns a new game window to the game_window pointer -} - -// Creates a new SFML RenderWindow object with specified video mode and title. -sf::RenderWindow* GraphicService::createGameWindow() { - setVideoMode(); // Sets up the video mode for the window - return new sf::RenderWindow(*video_mode, game_window_title); // Creates and returns a new RenderWindow object -} - -// Sets up the video mode for the game window using specified dimensions and system's color depth. -void GraphicService::setVideoMode() { - video_mode = new sf::VideoMode(game_window_width, game_window_height, sf::VideoMode::getDesktopMode().bitsPerPixel); // Allocates and sets the video mode -} - -// Cleans up allocated memory for video mode and game window to avoid memory leaks. -void GraphicService::onDestroy() { - delete(video_mode); // Deletes the video mode object - delete(game_window); // Deletes the game window object -} - -// Placeholder function for game update logic. -void GraphicService::update() { } - -// Placeholder function for game rendering logic. -void GraphicService::render() { } - -// Checks if the game window is currently open. -bool GraphicService::isGameWindowOpen() { - return game_window->isOpen(); // Returns the open status of the game window -} - -// Returns a pointer to the game window object. -sf::RenderWindow* GraphicService::getGameWindow() { - return game_window; -} - -// Returns the configured window background color. -sf::Color GraphicService::getWindowColor() { - return window_color; -} \ No newline at end of file diff --git a/Space-Invaders/Source/ServiceLocator.cpp b/Space-Invaders/Source/ServiceLocator.cpp deleted file mode 100644 index af461c730..000000000 --- a/Space-Invaders/Source/ServiceLocator.cpp +++ /dev/null @@ -1,51 +0,0 @@ -#include "../Header/ServiceLocator.h" - -ServiceLocator::ServiceLocator() -{ - graphic_service = nullptr; - event_service = nullptr; - createServices(); -} -ServiceLocator::~ServiceLocator() -{ - clearAllServices(); -} - -void ServiceLocator::createServices() -{ - graphic_service = new GraphicService(); - event_service = new EventService(); -} - -void ServiceLocator::clearAllServices() -{ - delete(graphic_service); - delete(event_service); -} - -ServiceLocator* ServiceLocator::getInstance() -{ - static ServiceLocator instance; - return &instance; -} - -void ServiceLocator::initialize() -{ - graphic_service->initialize(); - event_service->initialize(); -} - -void ServiceLocator::update() -{ - graphic_service->update(); - event_service->update(); -} - -void ServiceLocator::render() -{ - graphic_service->render(); - //no event service because nothing to render -} - -GraphicService* ServiceLocator::getGraphicService() { return graphic_service; } -EventService* ServiceLocator::getEventService() { return event_service; } From 8df483d9826b1438e05817de5ef6aef66245fe52 Mon Sep 17 00:00:00 2001 From: Rishi Saxena Date: Thu, 1 Aug 2024 14:14:16 +0530 Subject: [PATCH 20/56] Delete Space-Invaders/main.cpp --- Space-Invaders/main.cpp | 106 ---------------------------------------- 1 file changed, 106 deletions(-) delete mode 100644 Space-Invaders/main.cpp diff --git a/Space-Invaders/main.cpp b/Space-Invaders/main.cpp deleted file mode 100644 index 900795c1d..000000000 --- a/Space-Invaders/main.cpp +++ /dev/null @@ -1,106 +0,0 @@ -#include -#include -#include "Header/GameService.h" - - -/*class Player -{ -private: - - // Private Properties - int health = 3; - sf::Vector2f position = sf::Vector2f(200.0f, 100.0f); - int movement_speed = 1; - int player_score = 0; - -public: - - // Public Properties - sf::Texture player_texture; - sf::Sprite player_sprite; - - //Public Functions, Getter & Setter methods - void move(float offsetX) { - position.x += offsetX; - } - - int getMoveSpeed() { - return movement_speed; - } - - int getScore() { - return player_score; - }; - - void setScore(int newScore) { - player_score = newScore; - }; - - sf::Vector2f getPosition() { - return position; - } - - void setPosition(sf::Vector2f newPosition) { - position = newPosition; - } - - //New methods to be added - void takeDamage() {}; - void move() {}; - void shootBullets() {}; -};*/ - -int main() -{ - /* - // Define the video mode (dimensions) - sf::VideoMode videoMode = sf::VideoMode(800, 600); - - // Create a window object with specific dimensions and a title - sf::RenderWindow window(videoMode, "My SFML Window"); - - //Player object - Player player; - - //Load Textures and sprite - player.player_texture.loadFromFile("assets/textures/player_ship.png"); - - player.player_sprite.setTexture(player.player_texture); - - while (window.isOpen()) { - sf::Event event; - while (window.pollEvent(event)) { - // Check for window closure - if (event.type == sf::Event::Closed) - window.close(); - } - - // Handle keyboard input - if (sf::Keyboard::isKeyPressed(sf::Keyboard::Left)) { - player.move(-1.0f* player.getMoveSpeed()); - } - if (sf::Keyboard::isKeyPressed(sf::Keyboard::Right)) { - player.move(1.0f * player.getMoveSpeed()); - } - - // Clear the window--- - window.clear(sf::Color::Black); - - // Set and draw player - player.player_sprite.setPosition(player.getPosition()); - - window.draw(player.player_sprite); - - // Display whatever you draw - window.display(); - }*/ - GameService* game_service = new GameService(); - - game_service->ignite(); - - while (game_service->isRunning()) - { - game_service->update(); - game_service->render(); - } -} From f01bc02802256f090ce092c68b287ac91f84192c Mon Sep 17 00:00:00 2001 From: Rishi Saxena Date: Thu, 1 Aug 2024 14:14:55 +0530 Subject: [PATCH 21/56] Delete Space-Invaders/Space-Invaders.sln --- Space-Invaders/Space-Invaders.sln | 31 ------------------------------- 1 file changed, 31 deletions(-) delete mode 100644 Space-Invaders/Space-Invaders.sln diff --git a/Space-Invaders/Space-Invaders.sln b/Space-Invaders/Space-Invaders.sln deleted file mode 100644 index 21ec086fc..000000000 --- a/Space-Invaders/Space-Invaders.sln +++ /dev/null @@ -1,31 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Version 17 -VisualStudioVersion = 17.7.34024.191 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Space-Invaders", "Space-Invaders.vcxproj", "{AB3664CD-9870-4359-8811-B481DB3B55A0}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|x64 = Debug|x64 - Debug|x86 = Debug|x86 - Release|x64 = Release|x64 - Release|x86 = Release|x86 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {AB3664CD-9870-4359-8811-B481DB3B55A0}.Debug|x64.ActiveCfg = Debug|x64 - {AB3664CD-9870-4359-8811-B481DB3B55A0}.Debug|x64.Build.0 = Debug|x64 - {AB3664CD-9870-4359-8811-B481DB3B55A0}.Debug|x86.ActiveCfg = Debug|Win32 - {AB3664CD-9870-4359-8811-B481DB3B55A0}.Debug|x86.Build.0 = Debug|Win32 - {AB3664CD-9870-4359-8811-B481DB3B55A0}.Release|x64.ActiveCfg = Release|x64 - {AB3664CD-9870-4359-8811-B481DB3B55A0}.Release|x64.Build.0 = Release|x64 - {AB3664CD-9870-4359-8811-B481DB3B55A0}.Release|x86.ActiveCfg = Release|Win32 - {AB3664CD-9870-4359-8811-B481DB3B55A0}.Release|x86.Build.0 = Release|Win32 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution - SolutionGuid = {F8206701-92F6-4A4D-B0E5-F40E32131C64} - EndGlobalSection -EndGlobal From 5844287564978c1a5be646e8a9dd43e40be5f1ab Mon Sep 17 00:00:00 2001 From: Rishi Saxena Date: Thu, 1 Aug 2024 14:16:54 +0530 Subject: [PATCH 22/56] New Feature 3 Arch branch --- Space-Invaders/Header/Event/EventService.h | 30 ++ Space-Invaders/Header/Global/ServiceLocator.h | 41 +++ .../Header/Graphic/GraphicService.h | 38 +++ Space-Invaders/Header/Main/GameService.h | 25 ++ .../Header/Player/PlayerController.h | 28 ++ Space-Invaders/Header/Player/PlayerModel.h | 43 +++ Space-Invaders/Header/Player/PlayerService.h | 16 + Space-Invaders/Header/Player/PlayerView.h | 31 ++ Space-Invaders/Header/Time/TimeService.h | 28 ++ Space-Invaders/Source/Event/EventService.cpp | 44 +++ .../Source/Global/ServiceLocator.cpp | 65 ++++ .../Source/Graphic/GraphicService.cpp | 56 ++++ Space-Invaders/Source/Main/GameService.cpp | 59 ++++ .../Source/Player/PlayerController.cpp | 74 +++++ Space-Invaders/Source/Player/PlayerModel.cpp | 45 +++ .../Source/Player/PlayerService.cpp | 27 ++ Space-Invaders/Source/Player/PlayerView.cpp | 50 +++ Space-Invaders/Source/Time/TimeService.cpp | 39 +++ Space-Invaders/Space-Invaders.sln | 31 ++ Space-Invaders/Space-Invaders.vcxproj | 298 ++++++++++-------- Space-Invaders/Space-Invaders.vcxproj.filters | 98 ++++-- Space-Invaders/Space-Invaders.vcxproj.user | 10 +- Space-Invaders/main.cpp | 106 +++++++ 23 files changed, 1117 insertions(+), 165 deletions(-) create mode 100644 Space-Invaders/Header/Event/EventService.h create mode 100644 Space-Invaders/Header/Global/ServiceLocator.h create mode 100644 Space-Invaders/Header/Graphic/GraphicService.h create mode 100644 Space-Invaders/Header/Main/GameService.h create mode 100644 Space-Invaders/Header/Player/PlayerController.h create mode 100644 Space-Invaders/Header/Player/PlayerModel.h create mode 100644 Space-Invaders/Header/Player/PlayerService.h create mode 100644 Space-Invaders/Header/Player/PlayerView.h create mode 100644 Space-Invaders/Header/Time/TimeService.h create mode 100644 Space-Invaders/Source/Event/EventService.cpp create mode 100644 Space-Invaders/Source/Global/ServiceLocator.cpp create mode 100644 Space-Invaders/Source/Graphic/GraphicService.cpp create mode 100644 Space-Invaders/Source/Main/GameService.cpp create mode 100644 Space-Invaders/Source/Player/PlayerController.cpp create mode 100644 Space-Invaders/Source/Player/PlayerModel.cpp create mode 100644 Space-Invaders/Source/Player/PlayerService.cpp create mode 100644 Space-Invaders/Source/Player/PlayerView.cpp create mode 100644 Space-Invaders/Source/Time/TimeService.cpp create mode 100644 Space-Invaders/Space-Invaders.sln create mode 100644 Space-Invaders/main.cpp diff --git a/Space-Invaders/Header/Event/EventService.h b/Space-Invaders/Header/Event/EventService.h new file mode 100644 index 000000000..ce9882ddc --- /dev/null +++ b/Space-Invaders/Header/Event/EventService.h @@ -0,0 +1,30 @@ +#pragma once + +#include +#include + +class EventService +{ +private: + sf::Event game_event; //event var + sf::RenderWindow* game_window; //ptr to our game window + + bool isGameWindowOpen(); + bool gameWindowWasClosed(); //for the condition we already had - the title bar cross. + bool hasQuitGame(); //for our new 'ESC' condition + + + +public: + EventService(); + ~EventService(); + + void initialize(); + void update(); + void processEvents(); // while window is open we will check for events + bool pressedEscapeKey(); + bool isKeyboardEvent(); + bool pressedLeftKey(); // getting inputs for the player + bool pressedRightKey(); + +}; \ No newline at end of file diff --git a/Space-Invaders/Header/Global/ServiceLocator.h b/Space-Invaders/Header/Global/ServiceLocator.h new file mode 100644 index 000000000..332e1549f --- /dev/null +++ b/Space-Invaders/Header/Global/ServiceLocator.h @@ -0,0 +1,41 @@ +#pragma once +#include "../../Header/Graphic/GraphicService.h" +#include "../../Header/Event/EventService.h" +#include "../../Header/Player/PlayerService.h" +#include "../../Header/Time/TimeService.h" + +// ServiceLocator Class Summary: This class manages access to various services in the application. +// include relevant headers files + +class ServiceLocator +{ +private: + + // Private Attributes: + GraphicService* graphic_service; + EventService* event_service; + PlayerService* player_service; + TimeService* time_service; + + // Public Methods + ServiceLocator(); + ~ServiceLocator(); + + // Private Methods: + void createServices(); + void clearAllServices(); + +public: + + // Public Methods: + static ServiceLocator* getInstance(); + void initialize(); // Initializes the ServiceLocator. + void update(); // Updates all services. + void render(); // Renders using the services. + + // Methods to Get Specific Services: + EventService* getEventService(); // Retrieve the EventService instance + GraphicService* getGraphicService(); // Retrieve the GraphicService instance + PlayerService* getPlayerService(); // Retrieve the PlayerService instance + TimeService* getTimeService(); // Retrieve the TimeService instance +}; \ No newline at end of file diff --git a/Space-Invaders/Header/Graphic/GraphicService.h b/Space-Invaders/Header/Graphic/GraphicService.h new file mode 100644 index 000000000..83674fde3 --- /dev/null +++ b/Space-Invaders/Header/Graphic/GraphicService.h @@ -0,0 +1,38 @@ +#pragma once +#include + +class GraphicService +{ +private: + + const std::string game_window_title = "Alien Invader"; + + const int game_window_width = 800; + const int game_window_height = 600; + + const int frame_rate = 60; + + const sf::Color window_color = sf::Color::Black; + + sf::VideoMode* video_mode; // ptr to video mode + sf::RenderWindow* game_window; // ptr to a RenderWindow + + void setVideoMode(); // Method for setting our video mode + void onDestroy(); // method to run when window is deleted + +public: + GraphicService(); + ~GraphicService(); //cleanup + + //method to create the game window. returns a pointer to an instance of the game window + sf::RenderWindow* createGameWindow(); + + + void initialize(); //lifecycle functions + void update(); //.. + void render(); //.. + bool isGameWindowOpen(); //check if the window is open + + sf::RenderWindow* getGameWindow(); //getter for the game window instance + sf::Color getWindowColor();//get the color +}; \ No newline at end of file diff --git a/Space-Invaders/Header/Main/GameService.h b/Space-Invaders/Header/Main/GameService.h new file mode 100644 index 000000000..53f95bee5 --- /dev/null +++ b/Space-Invaders/Header/Main/GameService.h @@ -0,0 +1,25 @@ +#pragma once +#include +#include "../../Header/Global/ServiceLocator.h" + +class GameService +{ +private: + + ServiceLocator* service_locator; + sf::RenderWindow* game_window; + + + void initialize(); // Handles game initialization. + void initializeVariables();// Handles game initialization. + void destroy(); // Handles cleanup tasks. + +public: + GameService(); // Constructor for initializing the GameService object. + ~GameService(); // Destructor for cleaning up resources upon object deletion. + + void ignite(); // Initiates the game. + void update(); // Updates the game logic and game state. + void render(); // Renders each frame of the game. + bool isRunning(); // Checks if the game is currently running. +}; \ No newline at end of file diff --git a/Space-Invaders/Header/Player/PlayerController.h b/Space-Invaders/Header/Player/PlayerController.h new file mode 100644 index 000000000..36fda230a --- /dev/null +++ b/Space-Invaders/Header/Player/PlayerController.h @@ -0,0 +1,28 @@ +#pragma once +#include + +enum class PlayerState; +class PlayerView; +class PlayerModel; + +class PlayerController +{ +private: + + PlayerView* player_view; + PlayerModel* player_model; + + void processPlayerInput(); + void moveLeft(); + void moveRight(); + +public: + PlayerController(); + ~PlayerController(); + + void initialize(); + void update(); + void render(); + + sf::Vector2f getPlayerPosition(); +}; \ No newline at end of file diff --git a/Space-Invaders/Header/Player/PlayerModel.h b/Space-Invaders/Header/Player/PlayerModel.h new file mode 100644 index 000000000..13d61e0ea --- /dev/null +++ b/Space-Invaders/Header/Player/PlayerModel.h @@ -0,0 +1,43 @@ +#pragma once +#include + +enum class PlayerState //Our Enum +{ + ALIVE, + DEAD, + // we will add more states later +}; + +class PlayerModel +{ +private: + const sf::Vector2f initial_player_position = sf::Vector2f(400.f, 400.f); + + sf::Vector2f player_position; + PlayerState player_state; //Declaration + int player_score; + +public: + const sf::Vector2f left_most_position = sf::Vector2f(50.f, 0.f); + const sf::Vector2f right_most_position = sf::Vector2f(700.f, 0.f); + + const float player_movement_speed = 300.0f; + + PlayerModel(); + ~PlayerModel(); + + void initialize(); + void reset(); + + sf::Vector2f getPlayerPosition(); + void setPlayerPosition(sf::Vector2f position); + + int getPlayerScore(); + void setPlayerScore(int score); + + //new getter and setter + PlayerState getPlayerState(); + void setPlayerState(PlayerState state); + + +}; diff --git a/Space-Invaders/Header/Player/PlayerService.h b/Space-Invaders/Header/Player/PlayerService.h new file mode 100644 index 000000000..2f46d4894 --- /dev/null +++ b/Space-Invaders/Header/Player/PlayerService.h @@ -0,0 +1,16 @@ +#pragma once +#include "../../Header/Player/PlayerController.h" + +class PlayerService +{ +private: + PlayerController* player_controller; + +public: + PlayerService(); + ~PlayerService(); + + void initialize(); + void update(); + void render(); +}; diff --git a/Space-Invaders/Header/Player/PlayerView.h b/Space-Invaders/Header/Player/PlayerView.h new file mode 100644 index 000000000..8a1aa85e9 --- /dev/null +++ b/Space-Invaders/Header/Player/PlayerView.h @@ -0,0 +1,31 @@ +#pragma once +#include +#include "../../Header/Player/PlayerController.h" + +class PlayerView +{ +private: + + const sf::String player_texture_path = "assets/textures/player_ship.png"; + const float player_sprite_width = 60.f; + const float player_sprite_height = 60.f; + + sf::RenderWindow* game_window; + + sf::Texture player_texture; + sf::Sprite player_sprite; + + void initializePlayerSprite(); + void scalePlayerSprite(); + + PlayerController* player_controller; // ptr to player controller + +public: + PlayerView(); + ~PlayerView(); + + void initialize(); + void update(); + void render(); + void initialize(PlayerController* controller); +}; \ No newline at end of file diff --git a/Space-Invaders/Header/Time/TimeService.h b/Space-Invaders/Header/Time/TimeService.h new file mode 100644 index 000000000..24ddec14a --- /dev/null +++ b/Space-Invaders/Header/Time/TimeService.h @@ -0,0 +1,28 @@ +#pragma once +#include + + // The TimeService class helps keep track of time in game and calculate delta time. + // Utilizes the library to calculate delta time. +class TimeService +{ +private: + + // A point in time which indicates the starting time of previous frame. + std::chrono::time_point previous_time; + + float delta_time; //to store the detla time + + void updateDeltaTime(); // method to update time + float calculateDeltaTime(); //calculate time by subtracting the previous time from the current time + void updatePreviousTime(); // finally update the current time to be previous time + +public: + + //lifecycle methods + void initialize(); + void update(); + + //getter + float getDeltaTime(); +}; + diff --git a/Space-Invaders/Source/Event/EventService.cpp b/Space-Invaders/Source/Event/EventService.cpp new file mode 100644 index 000000000..9be3a667d --- /dev/null +++ b/Space-Invaders/Source/Event/EventService.cpp @@ -0,0 +1,44 @@ +#include "../../Header/Event/EventService.h" +#include "../../Header/Main/GameService.h" +#include "../../Header/Graphic/GraphicService.h" + +EventService::EventService() { game_window = nullptr; } + +EventService::~EventService() = default; //calls the default destructor + +void EventService::initialize() +{ + game_window = ServiceLocator::getInstance()->getGraphicService()->getGameWindow(); +} + +void EventService::update() +{ + //for later +} + +void EventService::processEvents() +{ + if (isGameWindowOpen()) { + while (game_window->pollEvent(game_event)) { + // Check for window closure + if (gameWindowWasClosed() || hasQuitGame()) + { + game_window->close(); + } + } + } +} + +bool EventService::hasQuitGame() { return (isKeyboardEvent() && pressedEscapeKey()); } // only true if the ESC key is pressed and a keyboard event has been registered + +//checks for if a keyboard key has been pressed +bool EventService::isKeyboardEvent() { return game_event.type == sf::Event::KeyPressed; } + +//control click on the SFML functions to see what they do internally +bool EventService::pressedEscapeKey() { return game_event.key.code == sf::Keyboard::Escape; } +bool EventService::isGameWindowOpen() { return game_window != nullptr; } +bool EventService::gameWindowWasClosed() { return game_event.type == sf::Event::Closed; } + +// Player inputs +bool EventService::pressedLeftKey() { return game_event.key.code == sf::Keyboard::Left; } +bool EventService::pressedRightKey() { return game_event.key.code == sf::Keyboard::Right; } \ No newline at end of file diff --git a/Space-Invaders/Source/Global/ServiceLocator.cpp b/Space-Invaders/Source/Global/ServiceLocator.cpp new file mode 100644 index 000000000..4c239d74b --- /dev/null +++ b/Space-Invaders/Source/Global/ServiceLocator.cpp @@ -0,0 +1,65 @@ +#include "../../Header/Global/ServiceLocator.h" + +ServiceLocator::ServiceLocator() +{ + graphic_service = nullptr; + event_service = nullptr; + player_service = nullptr; + time_service = nullptr; + createServices(); +} +ServiceLocator::~ServiceLocator() +{ + clearAllServices(); +} + +void ServiceLocator::createServices() +{ + graphic_service = new GraphicService(); + event_service = new EventService(); + player_service = new PlayerService(); + time_service = new TimeService(); +} + +void ServiceLocator::clearAllServices() +{ + delete(graphic_service); + delete(event_service); + delete(player_service); + delete(time_service); +} + +ServiceLocator* ServiceLocator::getInstance() +{ + static ServiceLocator instance; + return &instance; +} + +void ServiceLocator::initialize() +{ + graphic_service->initialize(); + event_service->initialize(); + player_service->initialize(); + time_service->initialize(); +} + +void ServiceLocator::update() +{ + graphic_service->update(); + event_service->update(); + player_service->update(); + time_service->update(); +} + +void ServiceLocator::render() +{ + graphic_service->render(); + player_service->render(); + //no event service because nothing to render + //no time service +} + +GraphicService* ServiceLocator::getGraphicService() { return graphic_service; } +EventService* ServiceLocator::getEventService() { return event_service; } +PlayerService* ServiceLocator::getPlayerService() { return player_service; } +TimeService* ServiceLocator::getTimeService() { return time_service; } diff --git a/Space-Invaders/Source/Graphic/GraphicService.cpp b/Space-Invaders/Source/Graphic/GraphicService.cpp new file mode 100644 index 000000000..4c8bb04ab --- /dev/null +++ b/Space-Invaders/Source/Graphic/GraphicService.cpp @@ -0,0 +1,56 @@ +#include "../../Header/Graphic/GraphicService.h" + +// Constructor: Initializes game window and video mode pointers to null. +GraphicService::GraphicService() { + game_window = nullptr; // Initializes game window pointer to null + video_mode = nullptr; // Initializes video mode pointer to null +} + +// Destructor: Cleans up resources by calling onDestroy. +GraphicService::~GraphicService() { + onDestroy(); // Calls onDestroy method to clean up resources +} + +// Initializes the graphic service by creating a new game window. +void GraphicService::initialize() { + game_window = createGameWindow(); // Assigns a new game window + game_window->setFramerateLimit(frame_rate); // setting a frame rate limit +} + +// Creates a new SFML RenderWindow object with specified video mode and title. +sf::RenderWindow* GraphicService::createGameWindow() { + setVideoMode(); // Sets up the video mode for the window + return new sf::RenderWindow(*video_mode, game_window_title); // Creates and returns a new RenderWindow object +} + +// Sets up the video mode for the game window using specified dimensions and system's color depth. +void GraphicService::setVideoMode() { + video_mode = new sf::VideoMode(game_window_width, game_window_height, sf::VideoMode::getDesktopMode().bitsPerPixel); // Allocates and sets the video mode +} + +// Cleans up allocated memory for video mode and game window to avoid memory leaks. +void GraphicService::onDestroy() { + delete(video_mode); // Deletes the video mode object + delete(game_window); // Deletes the game window object +} + +// Placeholder function for game update logic. +void GraphicService::update() { } + +// Placeholder function for game rendering logic. +void GraphicService::render() { } + +// Checks if the game window is currently open. +bool GraphicService::isGameWindowOpen() { + return game_window->isOpen(); // Returns the open status of the game window +} + +// Returns a pointer to the game window object. +sf::RenderWindow* GraphicService::getGameWindow() { + return game_window; +} + +// Returns the configured window background color. +sf::Color GraphicService::getWindowColor() { + return window_color; +} \ No newline at end of file diff --git a/Space-Invaders/Source/Main/GameService.cpp b/Space-Invaders/Source/Main/GameService.cpp new file mode 100644 index 000000000..12918afe4 --- /dev/null +++ b/Space-Invaders/Source/Main/GameService.cpp @@ -0,0 +1,59 @@ +#include "../../Header/Main/GameService.h" +#include "../../Header/Graphic/GraphicService.h" + +// Constructor: Initializes pointers to null. +GameService::GameService() { + service_locator = nullptr; // Set service locator to null + game_window = nullptr; // Set game window to null +} + +// Destructor: Calls the destroy function to clean up resources. +GameService::~GameService() { + destroy(); // Clean up and release resources +} + +// Prepares the game service for use by obtaining the service locator instance and initializing services. +void GameService::ignite() { + service_locator = ServiceLocator::getInstance(); // Get ServiceLocator + initialize(); // Initialize services. +} + +//initialize service locator and other variables +void GameService::initialize() +{ + service_locator->initialize(); + initializeVariables(); +} + +void GameService::initializeVariables() +{ + game_window = service_locator->getGraphicService()->getGameWindow(); //set game window (it was null before this) +} + +void GameService::destroy() +{ + // don't need to do anything here for now. +} + +// Updates the game logic by delegating to the service locator's update method. +void GameService::update() { + + service_locator->getEventService()->processEvents(); + + service_locator->update(); // Call update on the service locator which then updates all its managed services +} + +// Clears the window then display it. +void GameService::render() { + // Clears the game window with the background color provided by the graphic service + game_window->clear(service_locator->getGraphicService()->getWindowColor()); + service_locator->render(); // Render the current frame using the service locator + game_window->display(); // Display the rendered frame on the game window +} + +// Checks if the game is still running by querying the graphic service's window open status. +bool GameService::isRunning() { + // Returns true if the game window is open, indicating the game is still running + return service_locator->getGraphicService()->isGameWindowOpen(); +} + diff --git a/Space-Invaders/Source/Player/PlayerController.cpp b/Space-Invaders/Source/Player/PlayerController.cpp new file mode 100644 index 000000000..14b9754c9 --- /dev/null +++ b/Space-Invaders/Source/Player/PlayerController.cpp @@ -0,0 +1,74 @@ +#include "../../Header/Player/PlayerController.h" +#include "../../Header/Player/PlayerModel.h" +#include "../../Header/Player/PlayerView.h" +#include "../../Header/Event/EventService.h" +#include "../../Header/Global/ServiceLocator.h" +#include + +PlayerController::PlayerController() +{ + player_view = new PlayerView(); + player_model = new PlayerModel(); +} + +PlayerController::~PlayerController() +{ + delete (player_view); + delete (player_model); +} +//the controller is responsible for calling the lifecycle methods for the other two +void PlayerController::initialize() +{ + player_model->initialize(); + + //This will give an error right now since we haven't included the controller in the view. + player_view->initialize(this); // 'this' refers to the class we are currently inside +} + +void PlayerController::update() +{ + processPlayerInput(); + player_view->update(); // we update() the view +} + +void PlayerController::render() +{ + player_view->render(); // render the view +} + +sf::Vector2f PlayerController::getPlayerPosition() +{ + return player_model->getPlayerPosition(); +} + +void PlayerController::processPlayerInput() +{ + // we will move this to event service at a later time + if ((sf::Keyboard::isKeyPressed(sf::Keyboard::Left))) + { + moveLeft(); + } + // we will move this to event service at a later time + if ((sf::Keyboard::isKeyPressed(sf::Keyboard::Right))) + { + moveRight(); + } +} + +void PlayerController::moveLeft() +{ + sf::Vector2f currentPosition = player_model->getPlayerPosition(); + currentPosition.x -= player_model->player_movement_speed * ServiceLocator::getInstance()->getTimeService()->getDeltaTime(); + + currentPosition.x = std::max(currentPosition.x, player_model->left_most_position.x); + player_model->setPlayerPosition(currentPosition); +} + +void PlayerController::moveRight() +{ + sf::Vector2f currentPosition = player_model->getPlayerPosition(); + currentPosition.x += player_model->player_movement_speed * ServiceLocator::getInstance()->getTimeService()->getDeltaTime(); + + currentPosition.x = std::min(currentPosition.x, player_model->right_most_position.x); + player_model->setPlayerPosition(currentPosition); +} \ No newline at end of file diff --git a/Space-Invaders/Source/Player/PlayerModel.cpp b/Space-Invaders/Source/Player/PlayerModel.cpp new file mode 100644 index 000000000..0d51db820 --- /dev/null +++ b/Space-Invaders/Source/Player/PlayerModel.cpp @@ -0,0 +1,45 @@ +#include "../../Header/Player/PlayerModel.h" + +PlayerModel::PlayerModel() { } + +PlayerModel::~PlayerModel() { } + +void PlayerModel::initialize() { reset(); } // remember to call reset() + +void PlayerModel::reset() +{ + player_state = PlayerState::ALIVE; // set state to alive + player_position = initial_player_position; + player_score = 0; +} + +sf::Vector2f PlayerModel::getPlayerPosition() +{ + return player_position; +} + +void PlayerModel::setPlayerPosition(sf::Vector2f position) +{ + player_position = position; +} + +int PlayerModel::getPlayerScore() +{ + return player_score; +} + +void PlayerModel::setPlayerScore(int score) +{ + player_score = score; +} + +//.. +PlayerState PlayerModel::getPlayerState() +{ + return player_state; +} + +void PlayerModel::setPlayerState(PlayerState state) +{ + player_state = state; +} \ No newline at end of file diff --git a/Space-Invaders/Source/Player/PlayerService.cpp b/Space-Invaders/Source/Player/PlayerService.cpp new file mode 100644 index 000000000..af4e3d1e8 --- /dev/null +++ b/Space-Invaders/Source/Player/PlayerService.cpp @@ -0,0 +1,27 @@ +#include "../../Header/Player/PlayerService.h" +#include "../../Header/Player/PlayerController.h" + +PlayerService::PlayerService() +{ + player_controller = new PlayerController(); +} + +PlayerService::~PlayerService() +{ + delete (player_controller); +} + +void PlayerService::initialize() +{ + player_controller->initialize(); +} + +void PlayerService::update() +{ + player_controller->update(); +} + +void PlayerService::render() +{ + player_controller->render(); +} \ No newline at end of file diff --git a/Space-Invaders/Source/Player/PlayerView.cpp b/Space-Invaders/Source/Player/PlayerView.cpp new file mode 100644 index 000000000..b3abf9070 --- /dev/null +++ b/Space-Invaders/Source/Player/PlayerView.cpp @@ -0,0 +1,50 @@ +#include "../../Header/Player/PlayerView.h" +#include "../../Header/Global/ServiceLocator.h" + +PlayerView::PlayerView() { } + +PlayerView::~PlayerView() { } + +void PlayerView::initialize() +{ + + game_window = ServiceLocator::getInstance()->getGraphicService()->getGameWindow(); + initializePlayerSprite(); +} + +void PlayerView::initialize(PlayerController* controller) +{ + player_controller = controller; //to later use it for setting position + game_window = ServiceLocator::getInstance()->getGraphicService()->getGameWindow(); + initializePlayerSprite(); +} + +void PlayerView::initializePlayerSprite() +{ + if (player_texture.loadFromFile(player_texture_path)) + { + player_sprite.setTexture(player_texture); + scalePlayerSprite(); + } +} + +void PlayerView::scalePlayerSprite() +{ + // setScale is an inbuilt method of the sprite class that takes two floats to scale the sprite. it scales the sprite to our desired height + player_sprite.setScale( + //Here we find the factor to scale our sprites with. Ignore the static_cast for now, we will discuss it later. + static_cast(player_sprite_width) / player_sprite.getTexture()->getSize().x, + static_cast(player_sprite_height) / player_sprite.getTexture()->getSize().y + ); +} + +void PlayerView::update() +{ + //set the updated position before we render + player_sprite.setPosition(player_controller->getPlayerPosition()); +} + +void PlayerView::render() +{ + game_window->draw(player_sprite); +} \ No newline at end of file diff --git a/Space-Invaders/Source/Time/TimeService.cpp b/Space-Invaders/Source/Time/TimeService.cpp new file mode 100644 index 000000000..0bfc0d679 --- /dev/null +++ b/Space-Invaders/Source/Time/TimeService.cpp @@ -0,0 +1,39 @@ +#include "../../Header/Time/TimeService.h" + +void TimeService::initialize() +{ + previous_time = std::chrono::steady_clock::now(); + delta_time = 0; +} + +void TimeService::update() +{ + updateDeltaTime(); +} + +float TimeService::getDeltaTime() +{ + return delta_time; +} + +void TimeService::updateDeltaTime() +{ + delta_time = calculateDeltaTime(); + updatePreviousTime(); +} + +float TimeService::calculateDeltaTime() +{ + // Calculate time difference in microseconds between the current and previous frame. + int delta = std::chrono::duration_cast( + std::chrono::steady_clock::now() - previous_time).count(); + + // The cast is used to convert delta time from microseconds into seconds. + return static_cast(delta) / static_cast(1000000); +} + +// Update previous_time to the current time +void TimeService::updatePreviousTime() +{ + previous_time = std::chrono::steady_clock::now(); +} diff --git a/Space-Invaders/Space-Invaders.sln b/Space-Invaders/Space-Invaders.sln new file mode 100644 index 000000000..21ec086fc --- /dev/null +++ b/Space-Invaders/Space-Invaders.sln @@ -0,0 +1,31 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.7.34024.191 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Space-Invaders", "Space-Invaders.vcxproj", "{AB3664CD-9870-4359-8811-B481DB3B55A0}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|x64 = Debug|x64 + Debug|x86 = Debug|x86 + Release|x64 = Release|x64 + Release|x86 = Release|x86 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {AB3664CD-9870-4359-8811-B481DB3B55A0}.Debug|x64.ActiveCfg = Debug|x64 + {AB3664CD-9870-4359-8811-B481DB3B55A0}.Debug|x64.Build.0 = Debug|x64 + {AB3664CD-9870-4359-8811-B481DB3B55A0}.Debug|x86.ActiveCfg = Debug|Win32 + {AB3664CD-9870-4359-8811-B481DB3B55A0}.Debug|x86.Build.0 = Debug|Win32 + {AB3664CD-9870-4359-8811-B481DB3B55A0}.Release|x64.ActiveCfg = Release|x64 + {AB3664CD-9870-4359-8811-B481DB3B55A0}.Release|x64.Build.0 = Release|x64 + {AB3664CD-9870-4359-8811-B481DB3B55A0}.Release|x86.ActiveCfg = Release|Win32 + {AB3664CD-9870-4359-8811-B481DB3B55A0}.Release|x86.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {F8206701-92F6-4A4D-B0E5-F40E32131C64} + EndGlobalSection +EndGlobal diff --git a/Space-Invaders/Space-Invaders.vcxproj b/Space-Invaders/Space-Invaders.vcxproj index 6f7fa388d..3dd5235bd 100644 --- a/Space-Invaders/Space-Invaders.vcxproj +++ b/Space-Invaders/Space-Invaders.vcxproj @@ -1,140 +1,160 @@ - - - - - Debug - Win32 - - - Release - Win32 - - - Debug - x64 - - - Release - x64 - - - - 17.0 - Win32Proj - {ab3664cd-9870-4359-8811-b481db3b55a0} - SpaceInvaders - 10.0 - - - - Application - true - v143 - Unicode - - - Application - false - v143 - true - Unicode - - - Application - true - v143 - Unicode - - - Application - false - v143 - true - Unicode - - - - - - - - - - - - - - - - - - - - - - Level3 - true - WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - - - Console - true - - - - - Level3 - true - true - true - WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - - - Console - true - true - true - - - - - Level3 - true - _DEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - $(SolutionDir)sfml\include;%(AdditionalIncludeDirectories) - - - Console - true - $(SolutionDir)sfml\lib;%(AdditionalLibraryDirectories) - sfml-graphics-d.lib;sfml-window-d.lib;sfml-network-d.lib;sfml-audio-d.lib;sfml-system-d.lib;%(AdditionalDependencies) - - - - - Level3 - true - true - true - NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - $(SolutionDir)sfml\include;%(AdditionalIncludeDirectories) - - - Console - true - true - true - $(SolutionDir)sfml\lib;%(AdditionalLibraryDirectories) - - - - - - - - + + + + + Debug + Win32 + + + Release + Win32 + + + Debug + x64 + + + Release + x64 + + + + 17.0 + Win32Proj + {ab3664cd-9870-4359-8811-b481db3b55a0} + SpaceInvaders + 10.0 + + + + Application + true + v143 + Unicode + + + Application + false + v143 + true + Unicode + + + Application + true + v143 + Unicode + + + Application + false + v143 + true + Unicode + + + + + + + + + + + + + + + + + + + + + + Level3 + true + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + + + Console + true + + + + + Level3 + true + true + true + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + + + Console + true + true + true + + + + + Level3 + true + _DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + $(SolutionDir)sfml\include;%(AdditionalIncludeDirectories) + + + Console + true + $(SolutionDir)sfml\lib;%(AdditionalLibraryDirectories) + sfml-graphics-d.lib;sfml-window-d.lib;sfml-network-d.lib;sfml-audio-d.lib;sfml-system-d.lib;%(AdditionalDependencies) + + + + + Level3 + true + true + true + NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + $(SolutionDir)sfml\include;%(AdditionalIncludeDirectories) + + + Console + true + true + true + $(SolutionDir)sfml\lib;%(AdditionalLibraryDirectories) + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Space-Invaders/Space-Invaders.vcxproj.filters b/Space-Invaders/Space-Invaders.vcxproj.filters index ce0c35ccf..8ae369c39 100644 --- a/Space-Invaders/Space-Invaders.vcxproj.filters +++ b/Space-Invaders/Space-Invaders.vcxproj.filters @@ -1,22 +1,78 @@ - - - - - {4FC737F1-C7A5-4376-A066-2A32D752A2FF} - cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx - - - {93995380-89BD-4b04-88EB-625FBE52EBFB} - h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd - - - {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} - rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms - - - - - Source Files - - + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + \ No newline at end of file diff --git a/Space-Invaders/Space-Invaders.vcxproj.user b/Space-Invaders/Space-Invaders.vcxproj.user index 966b4ffb6..429333de9 100644 --- a/Space-Invaders/Space-Invaders.vcxproj.user +++ b/Space-Invaders/Space-Invaders.vcxproj.user @@ -1,6 +1,6 @@ - - - - true - + + + + true + \ No newline at end of file diff --git a/Space-Invaders/main.cpp b/Space-Invaders/main.cpp new file mode 100644 index 000000000..434cdaeb5 --- /dev/null +++ b/Space-Invaders/main.cpp @@ -0,0 +1,106 @@ +#include +#include +#include "Header/Main/GameService.h" + + +/*class Player +{ +private: + + // Private Properties + int health = 3; + sf::Vector2f position = sf::Vector2f(200.0f, 100.0f); + int movement_speed = 1; + int player_score = 0; + +public: + + // Public Properties + sf::Texture player_texture; + sf::Sprite player_sprite; + + //Public Functions, Getter & Setter methods + void move(float offsetX) { + position.x += offsetX; + } + + int getMoveSpeed() { + return movement_speed; + } + + int getScore() { + return player_score; + }; + + void setScore(int newScore) { + player_score = newScore; + }; + + sf::Vector2f getPosition() { + return position; + } + + void setPosition(sf::Vector2f newPosition) { + position = newPosition; + } + + //New methods to be added + void takeDamage() {}; + void move() {}; + void shootBullets() {}; +};*/ + +int main() +{ + /* + // Define the video mode (dimensions) + sf::VideoMode videoMode = sf::VideoMode(800, 600); + + // Create a window object with specific dimensions and a title + sf::RenderWindow window(videoMode, "My SFML Window"); + + //Player object + Player player; + + //Load Textures and sprite + player.player_texture.loadFromFile("assets/textures/player_ship.png"); + + player.player_sprite.setTexture(player.player_texture); + + while (window.isOpen()) { + sf::Event event; + while (window.pollEvent(event)) { + // Check for window closure + if (event.type == sf::Event::Closed) + window.close(); + } + + // Handle keyboard input + if (sf::Keyboard::isKeyPressed(sf::Keyboard::Left)) { + player.move(-1.0f* player.getMoveSpeed()); + } + if (sf::Keyboard::isKeyPressed(sf::Keyboard::Right)) { + player.move(1.0f * player.getMoveSpeed()); + } + + // Clear the window--- + window.clear(sf::Color::Black); + + // Set and draw player + player.player_sprite.setPosition(player.getPosition()); + + window.draw(player.player_sprite); + + // Display whatever you draw + window.display(); + }*/ + GameService* game_service = new GameService(); + + game_service->ignite(); + + while (game_service->isRunning()) + { + game_service->update(); + game_service->render(); + } +} From 58622f519b5551a0979c3eda676a741893668248 Mon Sep 17 00:00:00 2001 From: Rishi Saxena Date: Thu, 1 Aug 2024 14:30:45 +0530 Subject: [PATCH 23/56] Delete Space-Invaders/Header directory --- Space-Invaders/Header/EventService.h | 30 ------------- Space-Invaders/Header/GameService.h | 25 ----------- Space-Invaders/Header/GraphicService.h | 38 ---------------- .../Header/Player/PlayerController.h | 25 ----------- Space-Invaders/Header/Player/PlayerModel.h | 43 ------------------- Space-Invaders/Header/Player/PlayerView.h | 31 ------------- Space-Invaders/Header/PlayerService.h | 16 ------- Space-Invaders/Header/ServiceLocator.h | 41 ------------------ Space-Invaders/Header/TimeService.h | 28 ------------ 9 files changed, 277 deletions(-) delete mode 100644 Space-Invaders/Header/EventService.h delete mode 100644 Space-Invaders/Header/GameService.h delete mode 100644 Space-Invaders/Header/GraphicService.h delete mode 100644 Space-Invaders/Header/Player/PlayerController.h delete mode 100644 Space-Invaders/Header/Player/PlayerModel.h delete mode 100644 Space-Invaders/Header/Player/PlayerView.h delete mode 100644 Space-Invaders/Header/PlayerService.h delete mode 100644 Space-Invaders/Header/ServiceLocator.h delete mode 100644 Space-Invaders/Header/TimeService.h diff --git a/Space-Invaders/Header/EventService.h b/Space-Invaders/Header/EventService.h deleted file mode 100644 index ce9882ddc..000000000 --- a/Space-Invaders/Header/EventService.h +++ /dev/null @@ -1,30 +0,0 @@ -#pragma once - -#include -#include - -class EventService -{ -private: - sf::Event game_event; //event var - sf::RenderWindow* game_window; //ptr to our game window - - bool isGameWindowOpen(); - bool gameWindowWasClosed(); //for the condition we already had - the title bar cross. - bool hasQuitGame(); //for our new 'ESC' condition - - - -public: - EventService(); - ~EventService(); - - void initialize(); - void update(); - void processEvents(); // while window is open we will check for events - bool pressedEscapeKey(); - bool isKeyboardEvent(); - bool pressedLeftKey(); // getting inputs for the player - bool pressedRightKey(); - -}; \ No newline at end of file diff --git a/Space-Invaders/Header/GameService.h b/Space-Invaders/Header/GameService.h deleted file mode 100644 index 32230d67d..000000000 --- a/Space-Invaders/Header/GameService.h +++ /dev/null @@ -1,25 +0,0 @@ -#pragma once -#include -#include "../Header/ServiceLocator.h" - -class GameService -{ -private: - - ServiceLocator* service_locator; - sf::RenderWindow* game_window; - - - void initialize(); // Handles game initialization. - void initializeVariables();// Handles game initialization. - void destroy(); // Handles cleanup tasks. - -public: - GameService(); // Constructor for initializing the GameService object. - ~GameService(); // Destructor for cleaning up resources upon object deletion. - - void ignite(); // Initiates the game. - void update(); // Updates the game logic and game state. - void render(); // Renders each frame of the game. - bool isRunning(); // Checks if the game is currently running. -}; \ No newline at end of file diff --git a/Space-Invaders/Header/GraphicService.h b/Space-Invaders/Header/GraphicService.h deleted file mode 100644 index 96ed95751..000000000 --- a/Space-Invaders/Header/GraphicService.h +++ /dev/null @@ -1,38 +0,0 @@ -#pragma once -#include - -class GraphicService -{ -private: - - const std::string game_window_title = "Alien Invader"; - - const int game_window_width = 800; - const int game_window_height = 600; - - const int frame_rate = 60; - - const sf::Color window_color = sf::Color::Blue; - - sf::VideoMode* video_mode; // ptr to video mode - sf::RenderWindow* game_window; // ptr to a RenderWindow - - void setVideoMode(); // Method for setting our video mode - void onDestroy(); // method to run when window is deleted - -public: - GraphicService(); - ~GraphicService(); //cleanup - - //method to create the game window. returns a pointer to an instance of the game window - sf::RenderWindow* createGameWindow(); - - - void initialize(); //lifecycle functions - void update(); //.. - void render(); //.. - bool isGameWindowOpen(); //check if the window is open - - sf::RenderWindow* getGameWindow(); //getter for the game window instance - sf::Color getWindowColor();//get the color -}; \ No newline at end of file diff --git a/Space-Invaders/Header/Player/PlayerController.h b/Space-Invaders/Header/Player/PlayerController.h deleted file mode 100644 index 9ea24d95d..000000000 --- a/Space-Invaders/Header/Player/PlayerController.h +++ /dev/null @@ -1,25 +0,0 @@ -#pragma once -#include -#include "../Player/PlayerModel.h" -#include "../Player/PlayerView.h" - -class PlayerController -{ -private: - PlayerView* player_view; - PlayerModel* player_model; - - void processPlayerInput(); - void moveLeft(); - void moveRight(); - -public: - PlayerController(); - ~PlayerController(); - - void initialize(); - void update(); - void render(); - - sf::Vector2f getPlayerPosition(); -}; \ No newline at end of file diff --git a/Space-Invaders/Header/Player/PlayerModel.h b/Space-Invaders/Header/Player/PlayerModel.h deleted file mode 100644 index cf048eca5..000000000 --- a/Space-Invaders/Header/Player/PlayerModel.h +++ /dev/null @@ -1,43 +0,0 @@ -#pragma once -#include - -enum class PlayerState //Our Enum -{ - ALIVE, - DEAD, - // we will add more states later -}; - -class PlayerModel -{ -private: - const sf::Vector2f initial_player_position = sf::Vector2f(500.f, 500.f); - - sf::Vector2f player_position; - PlayerState player_state; //Declaration - int player_score; - -public: - const sf::Vector2f left_most_position = sf::Vector2f(50.f, 0.f); - const sf::Vector2f right_most_position = sf::Vector2f(700.f, 0.f); - - const float player_movement_speed = 200.0f; - - PlayerModel(); - ~PlayerModel(); - - void initialize(); - void reset(); - - sf::Vector2f getPlayerPosition(); - void setPlayerPosition(sf::Vector2f position); - - int getPlayerScore(); - void setPlayerScore(int score); - - //new getter and setter - PlayerState getPlayerState(); - void setPlayerState(PlayerState state); - - -}; diff --git a/Space-Invaders/Header/Player/PlayerView.h b/Space-Invaders/Header/Player/PlayerView.h deleted file mode 100644 index 8a1aa85e9..000000000 --- a/Space-Invaders/Header/Player/PlayerView.h +++ /dev/null @@ -1,31 +0,0 @@ -#pragma once -#include -#include "../../Header/Player/PlayerController.h" - -class PlayerView -{ -private: - - const sf::String player_texture_path = "assets/textures/player_ship.png"; - const float player_sprite_width = 60.f; - const float player_sprite_height = 60.f; - - sf::RenderWindow* game_window; - - sf::Texture player_texture; - sf::Sprite player_sprite; - - void initializePlayerSprite(); - void scalePlayerSprite(); - - PlayerController* player_controller; // ptr to player controller - -public: - PlayerView(); - ~PlayerView(); - - void initialize(); - void update(); - void render(); - void initialize(PlayerController* controller); -}; \ No newline at end of file diff --git a/Space-Invaders/Header/PlayerService.h b/Space-Invaders/Header/PlayerService.h deleted file mode 100644 index 2f46d4894..000000000 --- a/Space-Invaders/Header/PlayerService.h +++ /dev/null @@ -1,16 +0,0 @@ -#pragma once -#include "../../Header/Player/PlayerController.h" - -class PlayerService -{ -private: - PlayerController* player_controller; - -public: - PlayerService(); - ~PlayerService(); - - void initialize(); - void update(); - void render(); -}; diff --git a/Space-Invaders/Header/ServiceLocator.h b/Space-Invaders/Header/ServiceLocator.h deleted file mode 100644 index df101d414..000000000 --- a/Space-Invaders/Header/ServiceLocator.h +++ /dev/null @@ -1,41 +0,0 @@ -#pragma once -#include "../Header/GraphicService.h" -#include "../Header/EventService.h" -#include "../Header/PlayerService.h" -#include "../Header/TimeService.h" - -// ServiceLocator Class Summary: This class manages access to various services in the application. -// include relevant headers files - -class ServiceLocator -{ -private: - - // Private Attributes: - GraphicService* graphic_service; - EventService* event_service; - PlayerService* player_service; - TimeService* time_service; - - // Public Methods - ServiceLocator(); - ~ServiceLocator(); - - // Private Methods: - void createServices(); - void clearAllServices(); - -public: - - // Public Methods: - static ServiceLocator* getInstance(); - void initialize(); // Initializes the ServiceLocator. - void update(); // Updates all services. - void render(); // Renders using the services. - - // Methods to Get Specific Services: - EventService* getEventService(); // Retrieve the EventService instance - GraphicService* getGraphicService(); // Retrieve the GraphicService instance - PlayerService* getPlayerService(); // Retrieve the PlayerService instance - TimeService* getTimeService(); // Retrieve the TimeService instance -}; \ No newline at end of file diff --git a/Space-Invaders/Header/TimeService.h b/Space-Invaders/Header/TimeService.h deleted file mode 100644 index 24ddec14a..000000000 --- a/Space-Invaders/Header/TimeService.h +++ /dev/null @@ -1,28 +0,0 @@ -#pragma once -#include - - // The TimeService class helps keep track of time in game and calculate delta time. - // Utilizes the library to calculate delta time. -class TimeService -{ -private: - - // A point in time which indicates the starting time of previous frame. - std::chrono::time_point previous_time; - - float delta_time; //to store the detla time - - void updateDeltaTime(); // method to update time - float calculateDeltaTime(); //calculate time by subtracting the previous time from the current time - void updatePreviousTime(); // finally update the current time to be previous time - -public: - - //lifecycle methods - void initialize(); - void update(); - - //getter - float getDeltaTime(); -}; - From 4f64943e274206d11bea0b7811998b1380e34743 Mon Sep 17 00:00:00 2001 From: Rishi Saxena Date: Thu, 1 Aug 2024 14:30:57 +0530 Subject: [PATCH 24/56] Delete Space-Invaders/Source directory --- Space-Invaders/Source/EventService.cpp | 44 ------------ Space-Invaders/Source/GameService.cpp | 59 --------------- Space-Invaders/Source/GraphicService.cpp | 56 --------------- .../Source/Player/PlayerController.cpp | 72 ------------------- Space-Invaders/Source/Player/PlayerModel.cpp | 45 ------------ Space-Invaders/Source/Player/PlayerView.cpp | 50 ------------- Space-Invaders/Source/PlayerService.cpp | 27 ------- Space-Invaders/Source/ServiceLocator.cpp | 65 ----------------- Space-Invaders/Source/TimeService.cpp | 39 ---------- 9 files changed, 457 deletions(-) delete mode 100644 Space-Invaders/Source/EventService.cpp delete mode 100644 Space-Invaders/Source/GameService.cpp delete mode 100644 Space-Invaders/Source/GraphicService.cpp delete mode 100644 Space-Invaders/Source/Player/PlayerController.cpp delete mode 100644 Space-Invaders/Source/Player/PlayerModel.cpp delete mode 100644 Space-Invaders/Source/Player/PlayerView.cpp delete mode 100644 Space-Invaders/Source/PlayerService.cpp delete mode 100644 Space-Invaders/Source/ServiceLocator.cpp delete mode 100644 Space-Invaders/Source/TimeService.cpp diff --git a/Space-Invaders/Source/EventService.cpp b/Space-Invaders/Source/EventService.cpp deleted file mode 100644 index 6f2941e93..000000000 --- a/Space-Invaders/Source/EventService.cpp +++ /dev/null @@ -1,44 +0,0 @@ -#include "../Header/EventService.h" -#include "../Header/GameService.h" -#include "../Header/GraphicService.h" - -EventService::EventService() { game_window = nullptr; } - -EventService::~EventService() = default; //calls the default destructor - -void EventService::initialize() -{ - game_window = ServiceLocator::getInstance()->getGraphicService()->getGameWindow(); -} - -void EventService::update() -{ - //for later -} - -void EventService::processEvents() -{ - if (isGameWindowOpen()) { - while (game_window->pollEvent(game_event)) { - // Check for window closure - if (gameWindowWasClosed() || hasQuitGame()) - { - game_window->close(); - } - } - } -} - -bool EventService::hasQuitGame() { return (isKeyboardEvent() && pressedEscapeKey()); } // only true if the ESC key is pressed and a keyboard event has been registered - -//checks for if a keyboard key has been pressed -bool EventService::isKeyboardEvent() { return game_event.type == sf::Event::KeyPressed; } - -//control click on the SFML functions to see what they do internally -bool EventService::pressedEscapeKey() { return game_event.key.code == sf::Keyboard::Escape; } -bool EventService::isGameWindowOpen() { return game_window != nullptr; } -bool EventService::gameWindowWasClosed() { return game_event.type == sf::Event::Closed; } - -// Player inputs -bool EventService::pressedLeftKey() { return game_event.key.code == sf::Keyboard::Left; } -bool EventService::pressedRightKey() { return game_event.key.code == sf::Keyboard::Right; } \ No newline at end of file diff --git a/Space-Invaders/Source/GameService.cpp b/Space-Invaders/Source/GameService.cpp deleted file mode 100644 index e0fe519e8..000000000 --- a/Space-Invaders/Source/GameService.cpp +++ /dev/null @@ -1,59 +0,0 @@ -#include "../Header/GameService.h" -#include "../Header/GraphicService.h" - -// Constructor: Initializes pointers to null. -GameService::GameService() { - service_locator = nullptr; // Set service locator to null - game_window = nullptr; // Set game window to null -} - -// Destructor: Calls the destroy function to clean up resources. -GameService::~GameService() { - destroy(); // Clean up and release resources -} - -// Prepares the game service for use by obtaining the service locator instance and initializing services. -void GameService::ignite() { - service_locator = ServiceLocator::getInstance(); // Get ServiceLocator - initialize(); // Initialize services. -} - -//initialize service locator and other variables -void GameService::initialize() -{ - service_locator->initialize(); - initializeVariables(); -} - -void GameService::initializeVariables() -{ - game_window = service_locator->getGraphicService()->getGameWindow(); //set game window (it was null before this) -} - -void GameService::destroy() -{ - // don't need to do anything here for now. -} - -// Updates the game logic by delegating to the service locator's update method. -void GameService::update() { - - service_locator->getEventService()->processEvents(); - - service_locator->update(); // Call update on the service locator which then updates all its managed services -} - -// Clears the window then display it. -void GameService::render() { - // Clears the game window with the background color provided by the graphic service - game_window->clear(service_locator->getGraphicService()->getWindowColor()); - service_locator->render(); // Render the current frame using the service locator - game_window->display(); // Display the rendered frame on the game window -} - -// Checks if the game is still running by querying the graphic service's window open status. -bool GameService::isRunning() { - // Returns true if the game window is open, indicating the game is still running - return service_locator->getGraphicService()->isGameWindowOpen(); -} - diff --git a/Space-Invaders/Source/GraphicService.cpp b/Space-Invaders/Source/GraphicService.cpp deleted file mode 100644 index 2cfef211f..000000000 --- a/Space-Invaders/Source/GraphicService.cpp +++ /dev/null @@ -1,56 +0,0 @@ -#include "../Header/GraphicService.h" - -// Constructor: Initializes game window and video mode pointers to null. -GraphicService::GraphicService() { - game_window = nullptr; // Initializes game window pointer to null - video_mode = nullptr; // Initializes video mode pointer to null -} - -// Destructor: Cleans up resources by calling onDestroy. -GraphicService::~GraphicService() { - onDestroy(); // Calls onDestroy method to clean up resources -} - -// Initializes the graphic service by creating a new game window. -void GraphicService::initialize() { - game_window = createGameWindow(); // Assigns a new game window - game_window->setFramerateLimit(frame_rate); // setting a frame rate limit -} - -// Creates a new SFML RenderWindow object with specified video mode and title. -sf::RenderWindow* GraphicService::createGameWindow() { - setVideoMode(); // Sets up the video mode for the window - return new sf::RenderWindow(*video_mode, game_window_title); // Creates and returns a new RenderWindow object -} - -// Sets up the video mode for the game window using specified dimensions and system's color depth. -void GraphicService::setVideoMode() { - video_mode = new sf::VideoMode(game_window_width, game_window_height, sf::VideoMode::getDesktopMode().bitsPerPixel); // Allocates and sets the video mode -} - -// Cleans up allocated memory for video mode and game window to avoid memory leaks. -void GraphicService::onDestroy() { - delete(video_mode); // Deletes the video mode object - delete(game_window); // Deletes the game window object -} - -// Placeholder function for game update logic. -void GraphicService::update() { } - -// Placeholder function for game rendering logic. -void GraphicService::render() { } - -// Checks if the game window is currently open. -bool GraphicService::isGameWindowOpen() { - return game_window->isOpen(); // Returns the open status of the game window -} - -// Returns a pointer to the game window object. -sf::RenderWindow* GraphicService::getGameWindow() { - return game_window; -} - -// Returns the configured window background color. -sf::Color GraphicService::getWindowColor() { - return window_color; -} \ No newline at end of file diff --git a/Space-Invaders/Source/Player/PlayerController.cpp b/Space-Invaders/Source/Player/PlayerController.cpp deleted file mode 100644 index 19181c698..000000000 --- a/Space-Invaders/Source/Player/PlayerController.cpp +++ /dev/null @@ -1,72 +0,0 @@ -#include "../../Header/Player/PlayerController.h" -#include "../../Header/EventService.h" -#include "../../Header/ServiceLocator.h" -#include - -PlayerController::PlayerController() -{ - player_view = new PlayerView(); - player_model = new PlayerModel(); -} - -PlayerController::~PlayerController() -{ - delete (player_view); - delete (player_model); -} -//the controller is responsible for calling the lifecycle methods for the other two -void PlayerController::initialize() -{ - player_model->initialize(); - - //This will give an error right now since we haven't included the controller in the view. - player_view->initialize(this); // 'this' refers to the class we are currently inside -} - -void PlayerController::update() -{ - processPlayerInput(); - player_view->update(); // we update() the view -} - -void PlayerController::render() -{ - player_view->render(); // render the view -} - -sf::Vector2f PlayerController::getPlayerPosition() -{ - return player_model->getPlayerPosition(); -} - -void PlayerController::processPlayerInput() -{ - // we will move this to event service at a later time - if ((sf::Keyboard::isKeyPressed(sf::Keyboard::Left))) - { - moveLeft(); - } - // we will move this to event service at a later time - if ((sf::Keyboard::isKeyPressed(sf::Keyboard::Right))) - { - moveRight(); - } -} - -void PlayerController::moveLeft() -{ - sf::Vector2f currentPosition = player_model->getPlayerPosition(); - currentPosition.x -= player_model->player_movement_speed * ServiceLocator::getInstance()->getTimeService()->getDeltaTime(); - - currentPosition.x = std::max(currentPosition.x, player_model->left_most_position.x); - player_model->setPlayerPosition(currentPosition); -} - -void PlayerController::moveRight() -{ - sf::Vector2f currentPosition = player_model->getPlayerPosition(); - currentPosition.x += player_model->player_movement_speed * ServiceLocator::getInstance()->getTimeService()->getDeltaTime(); - - currentPosition.x = std::min(currentPosition.x, player_model->right_most_position.x); - player_model->setPlayerPosition(currentPosition); -} \ No newline at end of file diff --git a/Space-Invaders/Source/Player/PlayerModel.cpp b/Space-Invaders/Source/Player/PlayerModel.cpp deleted file mode 100644 index 0d51db820..000000000 --- a/Space-Invaders/Source/Player/PlayerModel.cpp +++ /dev/null @@ -1,45 +0,0 @@ -#include "../../Header/Player/PlayerModel.h" - -PlayerModel::PlayerModel() { } - -PlayerModel::~PlayerModel() { } - -void PlayerModel::initialize() { reset(); } // remember to call reset() - -void PlayerModel::reset() -{ - player_state = PlayerState::ALIVE; // set state to alive - player_position = initial_player_position; - player_score = 0; -} - -sf::Vector2f PlayerModel::getPlayerPosition() -{ - return player_position; -} - -void PlayerModel::setPlayerPosition(sf::Vector2f position) -{ - player_position = position; -} - -int PlayerModel::getPlayerScore() -{ - return player_score; -} - -void PlayerModel::setPlayerScore(int score) -{ - player_score = score; -} - -//.. -PlayerState PlayerModel::getPlayerState() -{ - return player_state; -} - -void PlayerModel::setPlayerState(PlayerState state) -{ - player_state = state; -} \ No newline at end of file diff --git a/Space-Invaders/Source/Player/PlayerView.cpp b/Space-Invaders/Source/Player/PlayerView.cpp deleted file mode 100644 index 93762cd15..000000000 --- a/Space-Invaders/Source/Player/PlayerView.cpp +++ /dev/null @@ -1,50 +0,0 @@ -#include "../../Header/Player/PlayerView.h" -#include "../../Header/ServiceLocator.h" - -PlayerView::PlayerView() { } - -PlayerView::~PlayerView() { } - -void PlayerView::initialize() -{ - - game_window = ServiceLocator::getInstance()->getGraphicService()->getGameWindow(); - initializePlayerSprite(); -} - -void PlayerView::initialize(PlayerController* controller) -{ - player_controller = controller; //to later use it for setting position - game_window = ServiceLocator::getInstance()->getGraphicService()->getGameWindow(); - initializePlayerSprite(); -} - -void PlayerView::initializePlayerSprite() -{ - if (player_texture.loadFromFile(player_texture_path)) - { - player_sprite.setTexture(player_texture); - scalePlayerSprite(); - } -} - -void PlayerView::scalePlayerSprite() -{ - // setScale is an inbuilt method of the sprite class that takes two floats to scale the sprite. it scales the sprite to our desired height - player_sprite.setScale( - //Here we find the factor to scale our sprites with. Ignore the static_cast for now, we will discuss it later. - static_cast(player_sprite_width) / player_sprite.getTexture()->getSize().x, - static_cast(player_sprite_height) / player_sprite.getTexture()->getSize().y - ); -} - -void PlayerView::update() -{ - //set the updated position before we render - player_sprite.setPosition(player_controller->getPlayerPosition()); -} - -void PlayerView::render() -{ - game_window->draw(player_sprite); -} \ No newline at end of file diff --git a/Space-Invaders/Source/PlayerService.cpp b/Space-Invaders/Source/PlayerService.cpp deleted file mode 100644 index 8b19d77f9..000000000 --- a/Space-Invaders/Source/PlayerService.cpp +++ /dev/null @@ -1,27 +0,0 @@ -#include "../Header/PlayerService.h" -#include "../Header/Player/PlayerController.h" - -PlayerService::PlayerService() -{ - player_controller = new PlayerController(); -} - -PlayerService::~PlayerService() -{ - delete (player_controller); -} - -void PlayerService::initialize() -{ - player_controller->initialize(); -} - -void PlayerService::update() -{ - player_controller->update(); -} - -void PlayerService::render() -{ - player_controller->render(); -} \ No newline at end of file diff --git a/Space-Invaders/Source/ServiceLocator.cpp b/Space-Invaders/Source/ServiceLocator.cpp deleted file mode 100644 index a8fbc2d90..000000000 --- a/Space-Invaders/Source/ServiceLocator.cpp +++ /dev/null @@ -1,65 +0,0 @@ -#include "../Header/ServiceLocator.h" - -ServiceLocator::ServiceLocator() -{ - graphic_service = nullptr; - event_service = nullptr; - player_service = nullptr; - time_service = nullptr; - createServices(); -} -ServiceLocator::~ServiceLocator() -{ - clearAllServices(); -} - -void ServiceLocator::createServices() -{ - graphic_service = new GraphicService(); - event_service = new EventService(); - player_service = new PlayerService(); - time_service = new TimeService(); -} - -void ServiceLocator::clearAllServices() -{ - delete(graphic_service); - delete(event_service); - delete(player_service); - delete(time_service); -} - -ServiceLocator* ServiceLocator::getInstance() -{ - static ServiceLocator instance; - return &instance; -} - -void ServiceLocator::initialize() -{ - graphic_service->initialize(); - event_service->initialize(); - player_service->initialize(); - time_service->initialize(); -} - -void ServiceLocator::update() -{ - graphic_service->update(); - event_service->update(); - player_service->update(); - time_service->update(); -} - -void ServiceLocator::render() -{ - graphic_service->render(); - player_service->render(); - //no event service because nothing to render - //no time service -} - -GraphicService* ServiceLocator::getGraphicService() { return graphic_service; } -EventService* ServiceLocator::getEventService() { return event_service; } -PlayerService* ServiceLocator::getPlayerService() { return player_service; } -TimeService* ServiceLocator::getTimeService() { return time_service; } diff --git a/Space-Invaders/Source/TimeService.cpp b/Space-Invaders/Source/TimeService.cpp deleted file mode 100644 index 7ede82971..000000000 --- a/Space-Invaders/Source/TimeService.cpp +++ /dev/null @@ -1,39 +0,0 @@ -#include "../Header/TimeService.h" - -void TimeService::initialize() -{ - previous_time = std::chrono::steady_clock::now(); - delta_time = 0; -} - -void TimeService::update() -{ - updateDeltaTime(); -} - -float TimeService::getDeltaTime() -{ - return delta_time; -} - -void TimeService::updateDeltaTime() -{ - delta_time = calculateDeltaTime(); - updatePreviousTime(); -} - -float TimeService::calculateDeltaTime() -{ - // Calculate time difference in microseconds between the current and previous frame. - int delta = std::chrono::duration_cast( - std::chrono::steady_clock::now() - previous_time).count(); - - // The cast is used to convert delta time from microseconds into seconds. - return static_cast(delta) / static_cast(1000000); -} - -// Update previous_time to the current time -void TimeService::updatePreviousTime() -{ - previous_time = std::chrono::steady_clock::now(); -} From 2f3005b0ede7ff9f3f92f26b6f482523ac09116f Mon Sep 17 00:00:00 2001 From: Rishi Saxena Date: Thu, 1 Aug 2024 15:53:18 +0530 Subject: [PATCH 25/56] Added Namespaces --- Space-Invaders/Header/Event/EventService.h | 40 +++--- Space-Invaders/Header/Global/ServiceLocator.h | 65 +++++----- .../Header/Graphic/GraphicService.h | 51 ++++---- Space-Invaders/Header/Main/GameService.h | 37 +++--- .../Header/Player/PlayerController.h | 43 +++--- Space-Invaders/Header/Player/PlayerModel.h | 59 +++++---- Space-Invaders/Header/Player/PlayerService.h | 23 ++-- Space-Invaders/Header/Player/PlayerView.h | 41 +++--- Space-Invaders/Header/Time/TimeService.h | 36 +++--- Space-Invaders/Source/Event/EventService.cpp | 65 +++++----- .../Source/Global/ServiceLocator.cpp | 122 ++++++++++-------- .../Source/Graphic/GraphicService.cpp | 109 ++++++++-------- Space-Invaders/Source/Main/GameService.cpp | 96 +++++++------- .../Source/Player/PlayerController.cpp | 109 ++++++++-------- Space-Invaders/Source/Player/PlayerModel.cpp | 85 ++++++------ .../Source/Player/PlayerService.cpp | 39 +++--- Space-Invaders/Source/Player/PlayerView.cpp | 78 +++++------ Space-Invaders/Source/Time/TimeService.cpp | 61 ++++----- Space-Invaders/main.cpp | 97 +------------- 19 files changed, 624 insertions(+), 632 deletions(-) diff --git a/Space-Invaders/Header/Event/EventService.h b/Space-Invaders/Header/Event/EventService.h index ce9882ddc..6f5924392 100644 --- a/Space-Invaders/Header/Event/EventService.h +++ b/Space-Invaders/Header/Event/EventService.h @@ -3,28 +3,32 @@ #include #include -class EventService +namespace Event { -private: - sf::Event game_event; //event var - sf::RenderWindow* game_window; //ptr to our game window + class EventService + { + private: + sf::Event game_event; //event var + sf::RenderWindow* game_window; //ptr to our game window - bool isGameWindowOpen(); - bool gameWindowWasClosed(); //for the condition we already had - the title bar cross. - bool hasQuitGame(); //for our new 'ESC' condition + bool isGameWindowOpen(); + bool gameWindowWasClosed(); //for the condition we already had - the title bar cross. + bool hasQuitGame(); //for our new 'ESC' condition -public: - EventService(); - ~EventService(); + public: + EventService(); + ~EventService(); - void initialize(); - void update(); - void processEvents(); // while window is open we will check for events - bool pressedEscapeKey(); - bool isKeyboardEvent(); - bool pressedLeftKey(); // getting inputs for the player - bool pressedRightKey(); + void initialize(); + void update(); + void processEvents(); // while window is open we will check for events + bool pressedEscapeKey(); + bool isKeyboardEvent(); + bool pressedLeftKey(); // getting inputs for the player + bool pressedRightKey(); + + }; +} -}; \ No newline at end of file diff --git a/Space-Invaders/Header/Global/ServiceLocator.h b/Space-Invaders/Header/Global/ServiceLocator.h index 332e1549f..a10386a92 100644 --- a/Space-Invaders/Header/Global/ServiceLocator.h +++ b/Space-Invaders/Header/Global/ServiceLocator.h @@ -7,35 +7,38 @@ // ServiceLocator Class Summary: This class manages access to various services in the application. // include relevant headers files -class ServiceLocator +namespace Global { -private: - - // Private Attributes: - GraphicService* graphic_service; - EventService* event_service; - PlayerService* player_service; - TimeService* time_service; - - // Public Methods - ServiceLocator(); - ~ServiceLocator(); - - // Private Methods: - void createServices(); - void clearAllServices(); - -public: - - // Public Methods: - static ServiceLocator* getInstance(); - void initialize(); // Initializes the ServiceLocator. - void update(); // Updates all services. - void render(); // Renders using the services. - - // Methods to Get Specific Services: - EventService* getEventService(); // Retrieve the EventService instance - GraphicService* getGraphicService(); // Retrieve the GraphicService instance - PlayerService* getPlayerService(); // Retrieve the PlayerService instance - TimeService* getTimeService(); // Retrieve the TimeService instance -}; \ No newline at end of file + class ServiceLocator + { + private: + + // Private Attributes: + Graphics::GraphicService* graphic_service; + Event::EventService* event_service; + Player::PlayerService* player_service; + Time::TimeService* time_service; + + // Public Methods + ServiceLocator(); + ~ServiceLocator(); + + // Private Methods: + void createServices(); + void clearAllServices(); + + public: + + // Public Methods: + static ServiceLocator* getInstance(); + void initialize(); // Initializes the ServiceLocator. + void update(); // Updates all services. + void render(); // Renders using the services. + + // Methods to Get Specific Services: + Event::EventService* getEventService(); // Retrieve the EventService instance + Graphics::GraphicService* getGraphicService(); // Retrieve the GraphicService instance + Player::PlayerService* getPlayerService(); // Retrieve the PlayerService instance + Time::TimeService* getTimeService(); // Retrieve the TimeService instance + }; +} \ No newline at end of file diff --git a/Space-Invaders/Header/Graphic/GraphicService.h b/Space-Invaders/Header/Graphic/GraphicService.h index 83674fde3..c87153f16 100644 --- a/Space-Invaders/Header/Graphic/GraphicService.h +++ b/Space-Invaders/Header/Graphic/GraphicService.h @@ -1,38 +1,41 @@ #pragma once #include -class GraphicService +namespace Graphics { -private: + class GraphicService + { + private: - const std::string game_window_title = "Alien Invader"; + const std::string game_window_title = "Alien Invader"; - const int game_window_width = 800; - const int game_window_height = 600; - - const int frame_rate = 60; + const int game_window_width = 800; + const int game_window_height = 600; - const sf::Color window_color = sf::Color::Black; + const int frame_rate = 60; - sf::VideoMode* video_mode; // ptr to video mode - sf::RenderWindow* game_window; // ptr to a RenderWindow + const sf::Color window_color = sf::Color::Black; - void setVideoMode(); // Method for setting our video mode - void onDestroy(); // method to run when window is deleted + sf::VideoMode* video_mode; // ptr to video mode + sf::RenderWindow* game_window; // ptr to a RenderWindow -public: - GraphicService(); - ~GraphicService(); //cleanup + void setVideoMode(); // Method for setting our video mode + void onDestroy(); // method to run when window is deleted - //method to create the game window. returns a pointer to an instance of the game window - sf::RenderWindow* createGameWindow(); + public: + GraphicService(); + ~GraphicService(); //cleanup + //method to create the game window. returns a pointer to an instance of the game window + sf::RenderWindow* createGameWindow(); - void initialize(); //lifecycle functions - void update(); //.. - void render(); //.. - bool isGameWindowOpen(); //check if the window is open - sf::RenderWindow* getGameWindow(); //getter for the game window instance - sf::Color getWindowColor();//get the color -}; \ No newline at end of file + void initialize(); //lifecycle functions + void update(); //.. + void render(); //.. + bool isGameWindowOpen(); //check if the window is open + + sf::RenderWindow* getGameWindow(); //getter for the game window instance + sf::Color getWindowColor();//get the color + }; +} \ No newline at end of file diff --git a/Space-Invaders/Header/Main/GameService.h b/Space-Invaders/Header/Main/GameService.h index 53f95bee5..a4bc449c7 100644 --- a/Space-Invaders/Header/Main/GameService.h +++ b/Space-Invaders/Header/Main/GameService.h @@ -1,25 +1,30 @@ #pragma once #include -#include "../../Header/Global/ServiceLocator.h" +#include "../../header/Global/ServiceLocator.h" -class GameService +namespace Main { -private: + class ServiceLocator; - ServiceLocator* service_locator; - sf::RenderWindow* game_window; + class GameService + { + private: + Global::ServiceLocator* service_locator; + sf::RenderWindow* game_window; - void initialize(); // Handles game initialization. - void initializeVariables();// Handles game initialization. - void destroy(); // Handles cleanup tasks. -public: - GameService(); // Constructor for initializing the GameService object. - ~GameService(); // Destructor for cleaning up resources upon object deletion. + void initialize(); // Handles game initialization. + void initializeVariables();// Handles game initialization. + void destroy(); // Handles cleanup tasks. - void ignite(); // Initiates the game. - void update(); // Updates the game logic and game state. - void render(); // Renders each frame of the game. - bool isRunning(); // Checks if the game is currently running. -}; \ No newline at end of file + public: + GameService(); // Constructor for initializing the GameService object. + ~GameService(); // Destructor for cleaning up resources upon object deletion. + + void ignite(); // Initiates the game. + void update(); // Updates the game logic and game state. + void render(); // Renders each frame of the game. + bool isRunning(); // Checks if the game is currently running. + }; +} \ No newline at end of file diff --git a/Space-Invaders/Header/Player/PlayerController.h b/Space-Invaders/Header/Player/PlayerController.h index 36fda230a..c3a12b538 100644 --- a/Space-Invaders/Header/Player/PlayerController.h +++ b/Space-Invaders/Header/Player/PlayerController.h @@ -1,28 +1,31 @@ #pragma once #include -enum class PlayerState; -class PlayerView; -class PlayerModel; - -class PlayerController +namespace Player { -private: - - PlayerView* player_view; - PlayerModel* player_model; + class PlayerView; + class PlayerModel; + enum class PlayerState; + + class PlayerController + { + private: + + PlayerView* player_view; + PlayerModel* player_model; - void processPlayerInput(); - void moveLeft(); - void moveRight(); + void processPlayerInput(); + void moveLeft(); + void moveRight(); -public: - PlayerController(); - ~PlayerController(); + public: + PlayerController(); + ~PlayerController(); - void initialize(); - void update(); - void render(); + void initialize(); + void update(); + void render(); - sf::Vector2f getPlayerPosition(); -}; \ No newline at end of file + sf::Vector2f getPlayerPosition(); + }; +} \ No newline at end of file diff --git a/Space-Invaders/Header/Player/PlayerModel.h b/Space-Invaders/Header/Player/PlayerModel.h index 13d61e0ea..b76424d92 100644 --- a/Space-Invaders/Header/Player/PlayerModel.h +++ b/Space-Invaders/Header/Player/PlayerModel.h @@ -1,43 +1,46 @@ #pragma once #include -enum class PlayerState //Our Enum +namespace Player { - ALIVE, - DEAD, - // we will add more states later -}; + enum class PlayerState //Our Enum + { + ALIVE, + DEAD, + // we will add more states later + }; -class PlayerModel -{ -private: - const sf::Vector2f initial_player_position = sf::Vector2f(400.f, 400.f); + class PlayerModel + { + private: + const sf::Vector2f initial_player_position = sf::Vector2f(400.f, 400.f); - sf::Vector2f player_position; - PlayerState player_state; //Declaration - int player_score; + sf::Vector2f player_position; + PlayerState player_state; //Declaration + int player_score; -public: - const sf::Vector2f left_most_position = sf::Vector2f(50.f, 0.f); - const sf::Vector2f right_most_position = sf::Vector2f(700.f, 0.f); + public: + const sf::Vector2f left_most_position = sf::Vector2f(50.f, 0.f); + const sf::Vector2f right_most_position = sf::Vector2f(700.f, 0.f); - const float player_movement_speed = 300.0f; + const float player_movement_speed = 300.0f; - PlayerModel(); - ~PlayerModel(); + PlayerModel(); + ~PlayerModel(); - void initialize(); - void reset(); + void initialize(); + void reset(); - sf::Vector2f getPlayerPosition(); - void setPlayerPosition(sf::Vector2f position); + sf::Vector2f getPlayerPosition(); + void setPlayerPosition(sf::Vector2f position); - int getPlayerScore(); - void setPlayerScore(int score); + int getPlayerScore(); + void setPlayerScore(int score); - //new getter and setter - PlayerState getPlayerState(); - void setPlayerState(PlayerState state); + //new getter and setter + PlayerState getPlayerState(); + void setPlayerState(PlayerState state); -}; + }; +} diff --git a/Space-Invaders/Header/Player/PlayerService.h b/Space-Invaders/Header/Player/PlayerService.h index 2f46d4894..a978d53c5 100644 --- a/Space-Invaders/Header/Player/PlayerService.h +++ b/Space-Invaders/Header/Player/PlayerService.h @@ -1,16 +1,19 @@ #pragma once #include "../../Header/Player/PlayerController.h" -class PlayerService +namespace Player { -private: - PlayerController* player_controller; + class PlayerService + { + private: + PlayerController* player_controller; -public: - PlayerService(); - ~PlayerService(); + public: + PlayerService(); + ~PlayerService(); - void initialize(); - void update(); - void render(); -}; + void initialize(); + void update(); + void render(); + }; +} diff --git a/Space-Invaders/Header/Player/PlayerView.h b/Space-Invaders/Header/Player/PlayerView.h index 8a1aa85e9..8e901f3f4 100644 --- a/Space-Invaders/Header/Player/PlayerView.h +++ b/Space-Invaders/Header/Player/PlayerView.h @@ -2,30 +2,33 @@ #include #include "../../Header/Player/PlayerController.h" -class PlayerView +namespace Player { -private: + class PlayerView + { + private: - const sf::String player_texture_path = "assets/textures/player_ship.png"; - const float player_sprite_width = 60.f; - const float player_sprite_height = 60.f; + const sf::String player_texture_path = "assets/textures/player_ship.png"; + const float player_sprite_width = 60.f; + const float player_sprite_height = 60.f; - sf::RenderWindow* game_window; + sf::RenderWindow* game_window; - sf::Texture player_texture; - sf::Sprite player_sprite; + sf::Texture player_texture; + sf::Sprite player_sprite; - void initializePlayerSprite(); - void scalePlayerSprite(); + void initializePlayerSprite(); + void scalePlayerSprite(); - PlayerController* player_controller; // ptr to player controller + PlayerController* player_controller; // ptr to player controller -public: - PlayerView(); - ~PlayerView(); + public: + PlayerView(); + ~PlayerView(); - void initialize(); - void update(); - void render(); - void initialize(PlayerController* controller); -}; \ No newline at end of file + void initialize(); + void update(); + void render(); + void initialize(PlayerController* controller); + }; +} \ No newline at end of file diff --git a/Space-Invaders/Header/Time/TimeService.h b/Space-Invaders/Header/Time/TimeService.h index 24ddec14a..71184c46e 100644 --- a/Space-Invaders/Header/Time/TimeService.h +++ b/Space-Invaders/Header/Time/TimeService.h @@ -3,26 +3,30 @@ // The TimeService class helps keep track of time in game and calculate delta time. // Utilizes the library to calculate delta time. -class TimeService + +namespace Time { -private: + class TimeService + { + private: + + // A point in time which indicates the starting time of previous frame. + std::chrono::time_point previous_time; - // A point in time which indicates the starting time of previous frame. - std::chrono::time_point previous_time; - - float delta_time; //to store the detla time + float delta_time; //to store the detla time - void updateDeltaTime(); // method to update time - float calculateDeltaTime(); //calculate time by subtracting the previous time from the current time - void updatePreviousTime(); // finally update the current time to be previous time + void updateDeltaTime(); // method to update time + float calculateDeltaTime(); //calculate time by subtracting the previous time from the current time + void updatePreviousTime(); // finally update the current time to be previous time -public: + public: - //lifecycle methods - void initialize(); - void update(); + //lifecycle methods + void initialize(); + void update(); - //getter - float getDeltaTime(); -}; + //getter + float getDeltaTime(); + }; +} diff --git a/Space-Invaders/Source/Event/EventService.cpp b/Space-Invaders/Source/Event/EventService.cpp index 9be3a667d..f1622bcd5 100644 --- a/Space-Invaders/Source/Event/EventService.cpp +++ b/Space-Invaders/Source/Event/EventService.cpp @@ -1,44 +1,51 @@ #include "../../Header/Event/EventService.h" #include "../../Header/Main/GameService.h" #include "../../Header/Graphic/GraphicService.h" +#include "../../Header/Global/ServiceLocator.h" -EventService::EventService() { game_window = nullptr; } +namespace Event +{ -EventService::~EventService() = default; //calls the default destructor + EventService::EventService() { game_window = nullptr; } -void EventService::initialize() -{ - game_window = ServiceLocator::getInstance()->getGraphicService()->getGameWindow(); -} + EventService::~EventService() = default; //calls the default destructor -void EventService::update() -{ - //for later -} + using namespace Global; -void EventService::processEvents() -{ - if (isGameWindowOpen()) { - while (game_window->pollEvent(game_event)) { - // Check for window closure - if (gameWindowWasClosed() || hasQuitGame()) - { - game_window->close(); + void EventService::initialize() + { + game_window = ServiceLocator::getInstance()->getGraphicService()->getGameWindow(); + } + + void EventService::update() + { + //for later + } + + void EventService::processEvents() + { + if (isGameWindowOpen()) { + while (game_window->pollEvent(game_event)) { + // Check for window closure + if (gameWindowWasClosed() || hasQuitGame()) + { + game_window->close(); + } } } } -} -bool EventService::hasQuitGame() { return (isKeyboardEvent() && pressedEscapeKey()); } // only true if the ESC key is pressed and a keyboard event has been registered + bool EventService::hasQuitGame() { return (isKeyboardEvent() && pressedEscapeKey()); } // only true if the ESC key is pressed and a keyboard event has been registered -//checks for if a keyboard key has been pressed -bool EventService::isKeyboardEvent() { return game_event.type == sf::Event::KeyPressed; } + //checks for if a keyboard key has been pressed + bool EventService::isKeyboardEvent() { return game_event.type == sf::Event::KeyPressed; } -//control click on the SFML functions to see what they do internally -bool EventService::pressedEscapeKey() { return game_event.key.code == sf::Keyboard::Escape; } -bool EventService::isGameWindowOpen() { return game_window != nullptr; } -bool EventService::gameWindowWasClosed() { return game_event.type == sf::Event::Closed; } + //control click on the SFML functions to see what they do internally + bool EventService::pressedEscapeKey() { return game_event.key.code == sf::Keyboard::Escape; } + bool EventService::isGameWindowOpen() { return game_window != nullptr; } + bool EventService::gameWindowWasClosed() { return game_event.type == sf::Event::Closed; } -// Player inputs -bool EventService::pressedLeftKey() { return game_event.key.code == sf::Keyboard::Left; } -bool EventService::pressedRightKey() { return game_event.key.code == sf::Keyboard::Right; } \ No newline at end of file + // Player inputs + bool EventService::pressedLeftKey() { return game_event.key.code == sf::Keyboard::Left; } + bool EventService::pressedRightKey() { return game_event.key.code == sf::Keyboard::Right; } +} \ No newline at end of file diff --git a/Space-Invaders/Source/Global/ServiceLocator.cpp b/Space-Invaders/Source/Global/ServiceLocator.cpp index 4c239d74b..e4fe451ee 100644 --- a/Space-Invaders/Source/Global/ServiceLocator.cpp +++ b/Space-Invaders/Source/Global/ServiceLocator.cpp @@ -1,65 +1,77 @@ #include "../../Header/Global/ServiceLocator.h" +#include "../../header/Main/GameService.h" -ServiceLocator::ServiceLocator() +namespace Global { - graphic_service = nullptr; - event_service = nullptr; - player_service = nullptr; - time_service = nullptr; - createServices(); -} -ServiceLocator::~ServiceLocator() -{ - clearAllServices(); -} + using namespace Main; + using namespace Graphics; + using namespace Event; + using namespace Time; + using namespace Player; + -void ServiceLocator::createServices() -{ - graphic_service = new GraphicService(); - event_service = new EventService(); - player_service = new PlayerService(); - time_service = new TimeService(); -} + ServiceLocator::ServiceLocator() + { + graphic_service = nullptr; + event_service = nullptr; + player_service = nullptr; + time_service = nullptr; + createServices(); + } + ServiceLocator::~ServiceLocator() + { + clearAllServices(); + } -void ServiceLocator::clearAllServices() -{ - delete(graphic_service); - delete(event_service); - delete(player_service); - delete(time_service); -} + void ServiceLocator::createServices() + { + graphic_service = new GraphicService(); + event_service = new EventService(); + player_service = new PlayerService(); + time_service = new TimeService(); + } -ServiceLocator* ServiceLocator::getInstance() -{ - static ServiceLocator instance; - return &instance; -} + void ServiceLocator::clearAllServices() + { + delete(graphic_service); + delete(event_service); + delete(player_service); + delete(time_service); + } -void ServiceLocator::initialize() -{ - graphic_service->initialize(); - event_service->initialize(); - player_service->initialize(); - time_service->initialize(); -} + ServiceLocator* ServiceLocator::getInstance() + { + static ServiceLocator instance; + return &instance; + } -void ServiceLocator::update() -{ - graphic_service->update(); - event_service->update(); - player_service->update(); - time_service->update(); -} + void ServiceLocator::initialize() + { + graphic_service->initialize(); + event_service->initialize(); + player_service->initialize(); + time_service->initialize(); + } -void ServiceLocator::render() -{ - graphic_service->render(); - player_service->render(); - //no event service because nothing to render - //no time service -} + void ServiceLocator::update() + { + graphic_service->update(); + event_service->update(); + player_service->update(); + time_service->update(); + } + + void ServiceLocator::render() + { + graphic_service->render(); + player_service->render(); + //no event service because nothing to render + //no time service + } + + GraphicService* ServiceLocator::getGraphicService() { return graphic_service; } + EventService* ServiceLocator::getEventService() { return event_service; } + PlayerService* ServiceLocator::getPlayerService() { return player_service; } + TimeService* ServiceLocator::getTimeService() { return time_service; } -GraphicService* ServiceLocator::getGraphicService() { return graphic_service; } -EventService* ServiceLocator::getEventService() { return event_service; } -PlayerService* ServiceLocator::getPlayerService() { return player_service; } -TimeService* ServiceLocator::getTimeService() { return time_service; } +} \ No newline at end of file diff --git a/Space-Invaders/Source/Graphic/GraphicService.cpp b/Space-Invaders/Source/Graphic/GraphicService.cpp index 4c8bb04ab..b10897d5d 100644 --- a/Space-Invaders/Source/Graphic/GraphicService.cpp +++ b/Space-Invaders/Source/Graphic/GraphicService.cpp @@ -1,56 +1,59 @@ #include "../../Header/Graphic/GraphicService.h" -// Constructor: Initializes game window and video mode pointers to null. -GraphicService::GraphicService() { - game_window = nullptr; // Initializes game window pointer to null - video_mode = nullptr; // Initializes video mode pointer to null -} - -// Destructor: Cleans up resources by calling onDestroy. -GraphicService::~GraphicService() { - onDestroy(); // Calls onDestroy method to clean up resources -} - -// Initializes the graphic service by creating a new game window. -void GraphicService::initialize() { - game_window = createGameWindow(); // Assigns a new game window - game_window->setFramerateLimit(frame_rate); // setting a frame rate limit -} - -// Creates a new SFML RenderWindow object with specified video mode and title. -sf::RenderWindow* GraphicService::createGameWindow() { - setVideoMode(); // Sets up the video mode for the window - return new sf::RenderWindow(*video_mode, game_window_title); // Creates and returns a new RenderWindow object -} - -// Sets up the video mode for the game window using specified dimensions and system's color depth. -void GraphicService::setVideoMode() { - video_mode = new sf::VideoMode(game_window_width, game_window_height, sf::VideoMode::getDesktopMode().bitsPerPixel); // Allocates and sets the video mode -} - -// Cleans up allocated memory for video mode and game window to avoid memory leaks. -void GraphicService::onDestroy() { - delete(video_mode); // Deletes the video mode object - delete(game_window); // Deletes the game window object -} - -// Placeholder function for game update logic. -void GraphicService::update() { } - -// Placeholder function for game rendering logic. -void GraphicService::render() { } - -// Checks if the game window is currently open. -bool GraphicService::isGameWindowOpen() { - return game_window->isOpen(); // Returns the open status of the game window -} - -// Returns a pointer to the game window object. -sf::RenderWindow* GraphicService::getGameWindow() { - return game_window; -} - -// Returns the configured window background color. -sf::Color GraphicService::getWindowColor() { - return window_color; +namespace Graphics +{ + // Constructor: Initializes game window and video mode pointers to null. + GraphicService::GraphicService() { + game_window = nullptr; // Initializes game window pointer to null + video_mode = nullptr; // Initializes video mode pointer to null + } + + // Destructor: Cleans up resources by calling onDestroy. + GraphicService::~GraphicService() { + onDestroy(); // Calls onDestroy method to clean up resources + } + + // Initializes the graphic service by creating a new game window. + void GraphicService::initialize() { + game_window = createGameWindow(); // Assigns a new game window + game_window->setFramerateLimit(frame_rate); // setting a frame rate limit + } + + // Creates a new SFML RenderWindow object with specified video mode and title. + sf::RenderWindow* GraphicService::createGameWindow() { + setVideoMode(); // Sets up the video mode for the window + return new sf::RenderWindow(*video_mode, game_window_title); // Creates and returns a new RenderWindow object + } + + // Sets up the video mode for the game window using specified dimensions and system's color depth. + void GraphicService::setVideoMode() { + video_mode = new sf::VideoMode(game_window_width, game_window_height, sf::VideoMode::getDesktopMode().bitsPerPixel); // Allocates and sets the video mode + } + + // Cleans up allocated memory for video mode and game window to avoid memory leaks. + void GraphicService::onDestroy() { + delete(video_mode); // Deletes the video mode object + delete(game_window); // Deletes the game window object + } + + // Placeholder function for game update logic. + void GraphicService::update() { } + + // Placeholder function for game rendering logic. + void GraphicService::render() { } + + // Checks if the game window is currently open. + bool GraphicService::isGameWindowOpen() { + return game_window->isOpen(); // Returns the open status of the game window + } + + // Returns a pointer to the game window object. + sf::RenderWindow* GraphicService::getGameWindow() { + return game_window; + } + + // Returns the configured window background color. + sf::Color GraphicService::getWindowColor() { + return window_color; + } } \ No newline at end of file diff --git a/Space-Invaders/Source/Main/GameService.cpp b/Space-Invaders/Source/Main/GameService.cpp index 12918afe4..d61c57973 100644 --- a/Space-Invaders/Source/Main/GameService.cpp +++ b/Space-Invaders/Source/Main/GameService.cpp @@ -1,59 +1,67 @@ #include "../../Header/Main/GameService.h" #include "../../Header/Graphic/GraphicService.h" +#include "../../Header/Global/ServiceLocator.h" -// Constructor: Initializes pointers to null. -GameService::GameService() { - service_locator = nullptr; // Set service locator to null - game_window = nullptr; // Set game window to null -} +namespace Main +{ + using namespace Global; + using namespace Graphics; + using namespace Event; + // Constructor: Initializes pointers to null. + GameService::GameService() { + service_locator = nullptr; // Set service locator to null + game_window = nullptr; // Set game window to null + } -// Destructor: Calls the destroy function to clean up resources. -GameService::~GameService() { - destroy(); // Clean up and release resources -} + // Destructor: Calls the destroy function to clean up resources. + GameService::~GameService() { + destroy(); // Clean up and release resources + } -// Prepares the game service for use by obtaining the service locator instance and initializing services. -void GameService::ignite() { - service_locator = ServiceLocator::getInstance(); // Get ServiceLocator - initialize(); // Initialize services. -} + // Prepares the game service for use by obtaining the service locator instance and initializing services. + void GameService::ignite() { + service_locator = Global::ServiceLocator::getInstance(); // Get ServiceLocator + initialize(); // Initialize services. + } -//initialize service locator and other variables -void GameService::initialize() -{ - service_locator->initialize(); - initializeVariables(); -} + //initialize service locator and other variables + void GameService::initialize() + { + service_locator->initialize(); + initializeVariables(); + } -void GameService::initializeVariables() -{ - game_window = service_locator->getGraphicService()->getGameWindow(); //set game window (it was null before this) -} + void GameService::initializeVariables() + { + game_window = service_locator->getGraphicService()->getGameWindow(); //set game window (it was null before this) + } -void GameService::destroy() -{ - // don't need to do anything here for now. -} + void GameService::destroy() + { + // don't need to do anything here for now. + } -// Updates the game logic by delegating to the service locator's update method. -void GameService::update() { + // Updates the game logic by delegating to the service locator's update method. + void GameService::update() { - service_locator->getEventService()->processEvents(); + service_locator->getEventService()->processEvents(); - service_locator->update(); // Call update on the service locator which then updates all its managed services -} + service_locator->update(); // Call update on the service locator which then updates all its managed services + } -// Clears the window then display it. -void GameService::render() { - // Clears the game window with the background color provided by the graphic service - game_window->clear(service_locator->getGraphicService()->getWindowColor()); - service_locator->render(); // Render the current frame using the service locator - game_window->display(); // Display the rendered frame on the game window -} + // Clears the window then display it. + void GameService::render() { + // Clears the game window with the background color provided by the graphic service + game_window->clear(service_locator->getGraphicService()->getWindowColor()); + service_locator->render(); // Render the current frame using the service locator + game_window->display(); // Display the rendered frame on the game window + } -// Checks if the game is still running by querying the graphic service's window open status. -bool GameService::isRunning() { - // Returns true if the game window is open, indicating the game is still running - return service_locator->getGraphicService()->isGameWindowOpen(); + // Checks if the game is still running by querying the graphic service's window open status. + bool GameService::isRunning() { + // Returns true if the game window is open, indicating the game is still running + return service_locator->getGraphicService()->isGameWindowOpen(); + } } + diff --git a/Space-Invaders/Source/Player/PlayerController.cpp b/Space-Invaders/Source/Player/PlayerController.cpp index 14b9754c9..534114f48 100644 --- a/Space-Invaders/Source/Player/PlayerController.cpp +++ b/Space-Invaders/Source/Player/PlayerController.cpp @@ -5,70 +5,77 @@ #include "../../Header/Global/ServiceLocator.h" #include -PlayerController::PlayerController() +namespace Player { - player_view = new PlayerView(); - player_model = new PlayerModel(); -} + using namespace Global; + using namespace Event; + using namespace Time; -PlayerController::~PlayerController() -{ - delete (player_view); - delete (player_model); -} -//the controller is responsible for calling the lifecycle methods for the other two -void PlayerController::initialize() -{ - player_model->initialize(); + PlayerController::PlayerController() + { + player_view = new PlayerView(); + player_model = new PlayerModel(); + } - //This will give an error right now since we haven't included the controller in the view. - player_view->initialize(this); // 'this' refers to the class we are currently inside -} + PlayerController::~PlayerController() + { + delete (player_view); + delete (player_model); + } + //the controller is responsible for calling the lifecycle methods for the other two + void PlayerController::initialize() + { + player_model->initialize(); -void PlayerController::update() -{ - processPlayerInput(); - player_view->update(); // we update() the view -} + //This will give an error right now since we haven't included the controller in the view. + player_view->initialize(this); // 'this' refers to the class we are currently inside + } -void PlayerController::render() -{ - player_view->render(); // render the view -} + void PlayerController::update() + { + processPlayerInput(); + player_view->update(); // we update() the view + } -sf::Vector2f PlayerController::getPlayerPosition() -{ - return player_model->getPlayerPosition(); -} + void PlayerController::render() + { + player_view->render(); // render the view + } -void PlayerController::processPlayerInput() -{ - // we will move this to event service at a later time - if ((sf::Keyboard::isKeyPressed(sf::Keyboard::Left))) + sf::Vector2f PlayerController::getPlayerPosition() { - moveLeft(); + return player_model->getPlayerPosition(); } - // we will move this to event service at a later time - if ((sf::Keyboard::isKeyPressed(sf::Keyboard::Right))) + + void PlayerController::processPlayerInput() { - moveRight(); + // we will move this to event service at a later time + if ((sf::Keyboard::isKeyPressed(sf::Keyboard::Left))) + { + moveLeft(); + } + // we will move this to event service at a later time + if ((sf::Keyboard::isKeyPressed(sf::Keyboard::Right))) + { + moveRight(); + } } -} -void PlayerController::moveLeft() -{ - sf::Vector2f currentPosition = player_model->getPlayerPosition(); - currentPosition.x -= player_model->player_movement_speed * ServiceLocator::getInstance()->getTimeService()->getDeltaTime(); + void PlayerController::moveLeft() + { + sf::Vector2f currentPosition = player_model->getPlayerPosition(); + currentPosition.x -= player_model->player_movement_speed * ServiceLocator::getInstance()->getTimeService()->getDeltaTime(); - currentPosition.x = std::max(currentPosition.x, player_model->left_most_position.x); - player_model->setPlayerPosition(currentPosition); -} + currentPosition.x = std::max(currentPosition.x, player_model->left_most_position.x); + player_model->setPlayerPosition(currentPosition); + } -void PlayerController::moveRight() -{ - sf::Vector2f currentPosition = player_model->getPlayerPosition(); - currentPosition.x += player_model->player_movement_speed * ServiceLocator::getInstance()->getTimeService()->getDeltaTime(); + void PlayerController::moveRight() + { + sf::Vector2f currentPosition = player_model->getPlayerPosition(); + currentPosition.x += player_model->player_movement_speed * ServiceLocator::getInstance()->getTimeService()->getDeltaTime(); - currentPosition.x = std::min(currentPosition.x, player_model->right_most_position.x); - player_model->setPlayerPosition(currentPosition); + currentPosition.x = std::min(currentPosition.x, player_model->right_most_position.x); + player_model->setPlayerPosition(currentPosition); + } } \ No newline at end of file diff --git a/Space-Invaders/Source/Player/PlayerModel.cpp b/Space-Invaders/Source/Player/PlayerModel.cpp index 0d51db820..3f519eb06 100644 --- a/Space-Invaders/Source/Player/PlayerModel.cpp +++ b/Space-Invaders/Source/Player/PlayerModel.cpp @@ -1,45 +1,48 @@ #include "../../Header/Player/PlayerModel.h" -PlayerModel::PlayerModel() { } - -PlayerModel::~PlayerModel() { } - -void PlayerModel::initialize() { reset(); } // remember to call reset() - -void PlayerModel::reset() -{ - player_state = PlayerState::ALIVE; // set state to alive - player_position = initial_player_position; - player_score = 0; -} - -sf::Vector2f PlayerModel::getPlayerPosition() -{ - return player_position; -} - -void PlayerModel::setPlayerPosition(sf::Vector2f position) -{ - player_position = position; -} - -int PlayerModel::getPlayerScore() -{ - return player_score; -} - -void PlayerModel::setPlayerScore(int score) -{ - player_score = score; -} - -//.. -PlayerState PlayerModel::getPlayerState() -{ - return player_state; -} - -void PlayerModel::setPlayerState(PlayerState state) +namespace Player { - player_state = state; + PlayerModel::PlayerModel() { } + + PlayerModel::~PlayerModel() { } + + void PlayerModel::initialize() { reset(); } // remember to call reset() + + void PlayerModel::reset() + { + player_state = PlayerState::ALIVE; // set state to alive + player_position = initial_player_position; + player_score = 0; + } + + sf::Vector2f PlayerModel::getPlayerPosition() + { + return player_position; + } + + void PlayerModel::setPlayerPosition(sf::Vector2f position) + { + player_position = position; + } + + int PlayerModel::getPlayerScore() + { + return player_score; + } + + void PlayerModel::setPlayerScore(int score) + { + player_score = score; + } + + //.. + PlayerState PlayerModel::getPlayerState() + { + return player_state; + } + + void PlayerModel::setPlayerState(PlayerState state) + { + player_state = state; + } } \ No newline at end of file diff --git a/Space-Invaders/Source/Player/PlayerService.cpp b/Space-Invaders/Source/Player/PlayerService.cpp index af4e3d1e8..e5ccd9d05 100644 --- a/Space-Invaders/Source/Player/PlayerService.cpp +++ b/Space-Invaders/Source/Player/PlayerService.cpp @@ -1,27 +1,30 @@ #include "../../Header/Player/PlayerService.h" #include "../../Header/Player/PlayerController.h" -PlayerService::PlayerService() +namespace Player { - player_controller = new PlayerController(); -} + PlayerService::PlayerService() + { + player_controller = new PlayerController(); + } -PlayerService::~PlayerService() -{ - delete (player_controller); -} + PlayerService::~PlayerService() + { + delete (player_controller); + } -void PlayerService::initialize() -{ - player_controller->initialize(); -} + void PlayerService::initialize() + { + player_controller->initialize(); + } -void PlayerService::update() -{ - player_controller->update(); -} + void PlayerService::update() + { + player_controller->update(); + } -void PlayerService::render() -{ - player_controller->render(); + void PlayerService::render() + { + player_controller->render(); + } } \ No newline at end of file diff --git a/Space-Invaders/Source/Player/PlayerView.cpp b/Space-Invaders/Source/Player/PlayerView.cpp index b3abf9070..bab4189cc 100644 --- a/Space-Invaders/Source/Player/PlayerView.cpp +++ b/Space-Invaders/Source/Player/PlayerView.cpp @@ -1,50 +1,54 @@ #include "../../Header/Player/PlayerView.h" #include "../../Header/Global/ServiceLocator.h" -PlayerView::PlayerView() { } +namespace Player +{ + using namespace Global; + PlayerView::PlayerView() { } -PlayerView::~PlayerView() { } + PlayerView::~PlayerView() { } -void PlayerView::initialize() -{ + void PlayerView::initialize() + { - game_window = ServiceLocator::getInstance()->getGraphicService()->getGameWindow(); - initializePlayerSprite(); -} + game_window = ServiceLocator::getInstance()->getGraphicService()->getGameWindow(); + initializePlayerSprite(); + } -void PlayerView::initialize(PlayerController* controller) -{ - player_controller = controller; //to later use it for setting position - game_window = ServiceLocator::getInstance()->getGraphicService()->getGameWindow(); - initializePlayerSprite(); -} + void PlayerView::initialize(PlayerController* controller) + { + player_controller = controller; //to later use it for setting position + game_window = ServiceLocator::getInstance()->getGraphicService()->getGameWindow(); + initializePlayerSprite(); + } -void PlayerView::initializePlayerSprite() -{ - if (player_texture.loadFromFile(player_texture_path)) + void PlayerView::initializePlayerSprite() { - player_sprite.setTexture(player_texture); - scalePlayerSprite(); + if (player_texture.loadFromFile(player_texture_path)) + { + player_sprite.setTexture(player_texture); + scalePlayerSprite(); + } } -} -void PlayerView::scalePlayerSprite() -{ - // setScale is an inbuilt method of the sprite class that takes two floats to scale the sprite. it scales the sprite to our desired height - player_sprite.setScale( - //Here we find the factor to scale our sprites with. Ignore the static_cast for now, we will discuss it later. - static_cast(player_sprite_width) / player_sprite.getTexture()->getSize().x, - static_cast(player_sprite_height) / player_sprite.getTexture()->getSize().y - ); -} - -void PlayerView::update() -{ - //set the updated position before we render - player_sprite.setPosition(player_controller->getPlayerPosition()); -} + void PlayerView::scalePlayerSprite() + { + // setScale is an inbuilt method of the sprite class that takes two floats to scale the sprite. it scales the sprite to our desired height + player_sprite.setScale( + //Here we find the factor to scale our sprites with. Ignore the static_cast for now, we will discuss it later. + static_cast(player_sprite_width) / player_sprite.getTexture()->getSize().x, + static_cast(player_sprite_height) / player_sprite.getTexture()->getSize().y + ); + } -void PlayerView::render() -{ - game_window->draw(player_sprite); + void PlayerView::update() + { + //set the updated position before we render + player_sprite.setPosition(player_controller->getPlayerPosition()); + } + + void PlayerView::render() + { + game_window->draw(player_sprite); + } } \ No newline at end of file diff --git a/Space-Invaders/Source/Time/TimeService.cpp b/Space-Invaders/Source/Time/TimeService.cpp index 0bfc0d679..718d1fa8c 100644 --- a/Space-Invaders/Source/Time/TimeService.cpp +++ b/Space-Invaders/Source/Time/TimeService.cpp @@ -1,39 +1,42 @@ #include "../../Header/Time/TimeService.h" -void TimeService::initialize() +namespace Time { - previous_time = std::chrono::steady_clock::now(); - delta_time = 0; -} + void TimeService::initialize() + { + previous_time = std::chrono::steady_clock::now(); + delta_time = 0; + } -void TimeService::update() -{ - updateDeltaTime(); -} + void TimeService::update() + { + updateDeltaTime(); + } -float TimeService::getDeltaTime() -{ - return delta_time; -} + float TimeService::getDeltaTime() + { + return delta_time; + } -void TimeService::updateDeltaTime() -{ - delta_time = calculateDeltaTime(); - updatePreviousTime(); -} + void TimeService::updateDeltaTime() + { + delta_time = calculateDeltaTime(); + updatePreviousTime(); + } -float TimeService::calculateDeltaTime() -{ - // Calculate time difference in microseconds between the current and previous frame. - int delta = std::chrono::duration_cast( - std::chrono::steady_clock::now() - previous_time).count(); + float TimeService::calculateDeltaTime() + { + // Calculate time difference in microseconds between the current and previous frame. + int delta = std::chrono::duration_cast( + std::chrono::steady_clock::now() - previous_time).count(); - // The cast is used to convert delta time from microseconds into seconds. - return static_cast(delta) / static_cast(1000000); -} + // The cast is used to convert delta time from microseconds into seconds. + return static_cast(delta) / static_cast(1000000); + } -// Update previous_time to the current time -void TimeService::updatePreviousTime() -{ - previous_time = std::chrono::steady_clock::now(); + // Update previous_time to the current time + void TimeService::updatePreviousTime() + { + previous_time = std::chrono::steady_clock::now(); + } } diff --git a/Space-Invaders/main.cpp b/Space-Invaders/main.cpp index 434cdaeb5..db819e86b 100644 --- a/Space-Invaders/main.cpp +++ b/Space-Invaders/main.cpp @@ -1,101 +1,10 @@ -#include -#include -#include "Header/Main/GameService.h" - - -/*class Player -{ -private: - - // Private Properties - int health = 3; - sf::Vector2f position = sf::Vector2f(200.0f, 100.0f); - int movement_speed = 1; - int player_score = 0; - -public: - - // Public Properties - sf::Texture player_texture; - sf::Sprite player_sprite; - - //Public Functions, Getter & Setter methods - void move(float offsetX) { - position.x += offsetX; - } - - int getMoveSpeed() { - return movement_speed; - } - - int getScore() { - return player_score; - }; - - void setScore(int newScore) { - player_score = newScore; - }; - - sf::Vector2f getPosition() { - return position; - } - - void setPosition(sf::Vector2f newPosition) { - position = newPosition; - } - - //New methods to be added - void takeDamage() {}; - void move() {}; - void shootBullets() {}; -};*/ +#include "../../header/Main/GameService.h" int main() { - /* - // Define the video mode (dimensions) - sf::VideoMode videoMode = sf::VideoMode(800, 600); - - // Create a window object with specific dimensions and a title - sf::RenderWindow window(videoMode, "My SFML Window"); - - //Player object - Player player; - - //Load Textures and sprite - player.player_texture.loadFromFile("assets/textures/player_ship.png"); - - player.player_sprite.setTexture(player.player_texture); + using namespace Main; - while (window.isOpen()) { - sf::Event event; - while (window.pollEvent(event)) { - // Check for window closure - if (event.type == sf::Event::Closed) - window.close(); - } - - // Handle keyboard input - if (sf::Keyboard::isKeyPressed(sf::Keyboard::Left)) { - player.move(-1.0f* player.getMoveSpeed()); - } - if (sf::Keyboard::isKeyPressed(sf::Keyboard::Right)) { - player.move(1.0f * player.getMoveSpeed()); - } - - // Clear the window--- - window.clear(sf::Color::Black); - - // Set and draw player - player.player_sprite.setPosition(player.getPosition()); - - window.draw(player.player_sprite); - - // Display whatever you draw - window.display(); - }*/ GameService* game_service = new GameService(); - game_service->ignite(); while (game_service->isRunning()) @@ -103,4 +12,6 @@ int main() game_service->update(); game_service->render(); } + + return 0; } From ff152f2b860f7e3137b179e6b15b4982e2678647 Mon Sep 17 00:00:00 2001 From: Rishi Saxena Date: Fri, 2 Aug 2024 13:09:58 +0530 Subject: [PATCH 26/56] Game State added --- Space-Invaders/Header/Main/GameService.h | 10 ++++++++++ Space-Invaders/Source/Main/GameService.cpp | 9 +++++++++ 2 files changed, 19 insertions(+) diff --git a/Space-Invaders/Header/Main/GameService.h b/Space-Invaders/Header/Main/GameService.h index a4bc449c7..a20e216dc 100644 --- a/Space-Invaders/Header/Main/GameService.h +++ b/Space-Invaders/Header/Main/GameService.h @@ -4,12 +4,20 @@ namespace Main { + enum class GameState + { + BOOT, + MAIN_MENU, + GAMEPLAY, + }; + class ServiceLocator; class GameService { private: + static GameState current_state; Global::ServiceLocator* service_locator; sf::RenderWindow* game_window; @@ -26,5 +34,7 @@ namespace Main void update(); // Updates the game logic and game state. void render(); // Renders each frame of the game. bool isRunning(); // Checks if the game is currently running. + static void setGameState(GameState new_state); + static GameState getGameState(); }; } \ No newline at end of file diff --git a/Space-Invaders/Source/Main/GameService.cpp b/Space-Invaders/Source/Main/GameService.cpp index d61c57973..6153c00b6 100644 --- a/Space-Invaders/Source/Main/GameService.cpp +++ b/Space-Invaders/Source/Main/GameService.cpp @@ -7,6 +7,9 @@ namespace Main using namespace Global; using namespace Graphics; using namespace Event; + + GameState GameService::current_state = GameState::BOOT; + // Constructor: Initializes pointers to null. GameService::GameService() { service_locator = nullptr; // Set service locator to null @@ -62,6 +65,12 @@ namespace Main // Returns true if the game window is open, indicating the game is still running return service_locator->getGraphicService()->isGameWindowOpen(); } + + // Setter function foro the game state + void GameService::setGameState(GameState new_state) { current_state = new_state; } + + // Getter function for the current game state + GameState GameService::getGameState() { return current_state; } } From 6601dac47b8e3856bd78e9ff49472505043b4809 Mon Sep 17 00:00:00 2001 From: Rishi Saxena Date: Fri, 2 Aug 2024 15:15:06 +0530 Subject: [PATCH 27/56] Added Main Menu and lifecycle --- Space-Invaders/Header/Global/ServiceLocator.h | 3 + .../Header/Graphic/GraphicService.h | 4 +- Space-Invaders/Header/Main/GameService.h | 1 + Space-Invaders/Header/Player/PlayerModel.h | 8 +- .../Header/UI/MainMenu/MainMenuUIController.h | 55 +++++++++ Space-Invaders/Header/UI/UIService.h | 23 ++++ .../Source/Global/ServiceLocator.cpp | 10 +- .../Source/Graphic/GraphicService.cpp | 2 +- .../UI/MainMenu/MainMenuUIController.cpp | 105 ++++++++++++++++++ Space-Invaders/Source/UI/UIService.cpp | 51 +++++++++ 10 files changed, 254 insertions(+), 8 deletions(-) create mode 100644 Space-Invaders/Header/UI/MainMenu/MainMenuUIController.h create mode 100644 Space-Invaders/Header/UI/UIService.h create mode 100644 Space-Invaders/Source/UI/MainMenu/MainMenuUIController.cpp create mode 100644 Space-Invaders/Source/UI/UIService.cpp diff --git a/Space-Invaders/Header/Global/ServiceLocator.h b/Space-Invaders/Header/Global/ServiceLocator.h index a10386a92..fe2ccf055 100644 --- a/Space-Invaders/Header/Global/ServiceLocator.h +++ b/Space-Invaders/Header/Global/ServiceLocator.h @@ -3,6 +3,7 @@ #include "../../Header/Event/EventService.h" #include "../../Header/Player/PlayerService.h" #include "../../Header/Time/TimeService.h" +#include "../../Header/UI/UIService.h" // ServiceLocator Class Summary: This class manages access to various services in the application. // include relevant headers files @@ -18,6 +19,7 @@ namespace Global Event::EventService* event_service; Player::PlayerService* player_service; Time::TimeService* time_service; + UI::UIService* ui_service; // Public Methods ServiceLocator(); @@ -40,5 +42,6 @@ namespace Global Graphics::GraphicService* getGraphicService(); // Retrieve the GraphicService instance Player::PlayerService* getPlayerService(); // Retrieve the PlayerService instance Time::TimeService* getTimeService(); // Retrieve the TimeService instance + UI::UIService* getUIService(); // Retrive the UIService instance }; } \ No newline at end of file diff --git a/Space-Invaders/Header/Graphic/GraphicService.h b/Space-Invaders/Header/Graphic/GraphicService.h index c87153f16..a0514d024 100644 --- a/Space-Invaders/Header/Graphic/GraphicService.h +++ b/Space-Invaders/Header/Graphic/GraphicService.h @@ -9,8 +9,8 @@ namespace Graphics const std::string game_window_title = "Alien Invader"; - const int game_window_width = 800; - const int game_window_height = 600; + const int game_window_width = 1920; + const int game_window_height = 1080; const int frame_rate = 60; diff --git a/Space-Invaders/Header/Main/GameService.h b/Space-Invaders/Header/Main/GameService.h index a20e216dc..123bf325a 100644 --- a/Space-Invaders/Header/Main/GameService.h +++ b/Space-Invaders/Header/Main/GameService.h @@ -18,6 +18,7 @@ namespace Main private: static GameState current_state; + Global::ServiceLocator* service_locator; sf::RenderWindow* game_window; diff --git a/Space-Invaders/Header/Player/PlayerModel.h b/Space-Invaders/Header/Player/PlayerModel.h index b76424d92..43e8ec35f 100644 --- a/Space-Invaders/Header/Player/PlayerModel.h +++ b/Space-Invaders/Header/Player/PlayerModel.h @@ -13,17 +13,17 @@ namespace Player class PlayerModel { private: - const sf::Vector2f initial_player_position = sf::Vector2f(400.f, 400.f); + const sf::Vector2f initial_player_position = sf::Vector2f(950.f, 950.f); sf::Vector2f player_position; PlayerState player_state; //Declaration int player_score; public: - const sf::Vector2f left_most_position = sf::Vector2f(50.f, 0.f); - const sf::Vector2f right_most_position = sf::Vector2f(700.f, 0.f); + const sf::Vector2f left_most_position = sf::Vector2f(50.f, 950.f); + const sf::Vector2f right_most_position = sf::Vector2f(1800.f, 950.f); - const float player_movement_speed = 300.0f; + const float player_movement_speed = 600.0f; PlayerModel(); ~PlayerModel(); diff --git a/Space-Invaders/Header/UI/MainMenu/MainMenuUIController.h b/Space-Invaders/Header/UI/MainMenu/MainMenuUIController.h new file mode 100644 index 000000000..32dc26439 --- /dev/null +++ b/Space-Invaders/Header/UI/MainMenu/MainMenuUIController.h @@ -0,0 +1,55 @@ +#pragma once +#include + +namespace UI +{ + namespace MainMenu + { + class MainMenuUIController + { + + private: + const sf::String background_texture_path = "assets/textures/space_invaders_bg.png"; + const sf::String play_button_texture_path = "assets/textures/play_button.png"; + const sf::String instructions_button_texture_path = "assets/textures/instructions_button.png"; + const sf::String quit_button_texture_path = "assets/textures/quit_button.png"; + + // Constants: + const float button_width = 400.f; + const float button_height = 140.f; + + sf::RenderWindow* game_window; + + // Textures: + sf::Texture background_texture; + sf::Sprite background_sprite; + + sf::Texture play_button_texture; + sf::Sprite play_button_sprite; + + sf::Texture instructions_button_texture; + sf::Sprite instructions_button_sprite; + + sf::Texture quit_button_texture; + sf::Sprite quit_button_sprite; + + // Buttons and scaling + void initializeBackgroundImage(); + void scaleBackgroundImage(); + void initializeButtons(); + bool loadButtonTexturesFromFile(); + void setButtonSprites(); + void scaleAllButttons(); + void scaleButton(sf::Sprite* button_to_scale); + void positionButtons(); + + public: + MainMenuUIController(); + + void initialize(); + void update(); + void render(); + + }; + } +} \ No newline at end of file diff --git a/Space-Invaders/Header/UI/UIService.h b/Space-Invaders/Header/UI/UIService.h new file mode 100644 index 000000000..2f8856ee3 --- /dev/null +++ b/Space-Invaders/Header/UI/UIService.h @@ -0,0 +1,23 @@ +#pragma once +#include "../../Header/UI/MainMenu/MainMenuUIController.h" + +namespace UI +{ + class UIService + { + private: + MainMenu::MainMenuUIController* main_menu_controller; + + void createControllers(); + void initializeControllers(); + void destroy(); + + public: + UIService(); + ~UIService(); + + void initialize(); + void update(); + void render(); + }; +} \ No newline at end of file diff --git a/Space-Invaders/Source/Global/ServiceLocator.cpp b/Space-Invaders/Source/Global/ServiceLocator.cpp index e4fe451ee..9983889db 100644 --- a/Space-Invaders/Source/Global/ServiceLocator.cpp +++ b/Space-Invaders/Source/Global/ServiceLocator.cpp @@ -8,6 +8,7 @@ namespace Global using namespace Event; using namespace Time; using namespace Player; + using namespace UI; ServiceLocator::ServiceLocator() @@ -16,6 +17,7 @@ namespace Global event_service = nullptr; player_service = nullptr; time_service = nullptr; + ui_service = nullptr; createServices(); } ServiceLocator::~ServiceLocator() @@ -29,6 +31,7 @@ namespace Global event_service = new EventService(); player_service = new PlayerService(); time_service = new TimeService(); + ui_service = new UIService(); } void ServiceLocator::clearAllServices() @@ -37,6 +40,7 @@ namespace Global delete(event_service); delete(player_service); delete(time_service); + delete(ui_service); } ServiceLocator* ServiceLocator::getInstance() @@ -51,6 +55,7 @@ namespace Global event_service->initialize(); player_service->initialize(); time_service->initialize(); + ui_service->initialize(); } void ServiceLocator::update() @@ -59,19 +64,22 @@ namespace Global event_service->update(); player_service->update(); time_service->update(); + ui_service->update(); } void ServiceLocator::render() { graphic_service->render(); player_service->render(); + ui_service->render(); //no event service because nothing to render - //no time service + //no time service } GraphicService* ServiceLocator::getGraphicService() { return graphic_service; } EventService* ServiceLocator::getEventService() { return event_service; } PlayerService* ServiceLocator::getPlayerService() { return player_service; } TimeService* ServiceLocator::getTimeService() { return time_service; } + UIService* ServiceLocator::getUIService() { return ui_service; } } \ No newline at end of file diff --git a/Space-Invaders/Source/Graphic/GraphicService.cpp b/Space-Invaders/Source/Graphic/GraphicService.cpp index b10897d5d..98ab5cc20 100644 --- a/Space-Invaders/Source/Graphic/GraphicService.cpp +++ b/Space-Invaders/Source/Graphic/GraphicService.cpp @@ -22,7 +22,7 @@ namespace Graphics // Creates a new SFML RenderWindow object with specified video mode and title. sf::RenderWindow* GraphicService::createGameWindow() { setVideoMode(); // Sets up the video mode for the window - return new sf::RenderWindow(*video_mode, game_window_title); // Creates and returns a new RenderWindow object + return new sf::RenderWindow(*video_mode, game_window_title, sf::Style::Fullscreen); // Creates and returns a new RenderWindow object } // Sets up the video mode for the game window using specified dimensions and system's color depth. diff --git a/Space-Invaders/Source/UI/MainMenu/MainMenuUIController.cpp b/Space-Invaders/Source/UI/MainMenu/MainMenuUIController.cpp new file mode 100644 index 000000000..e5accf6e4 --- /dev/null +++ b/Space-Invaders/Source/UI/MainMenu/MainMenuUIController.cpp @@ -0,0 +1,105 @@ +#include "../../Header/UI/MainMenu/MainMenuUIController.h" +#include "../../Header/UI/MainMenu/MainMenuUIController.h" +#include "../../Header/Main/GameService.h" +#include "../../Header/Global/ServiceLocator.h" +#include "../../Header/Graphic/GraphicService.h" + +namespace UI +{ + namespace MainMenu //nested namespace since everything in MainMenu exists inside UI + { + using namespace Global; + using namespace Main; + using namespace Graphics; + using namespace Event; + + MainMenuUIController::MainMenuUIController() { game_window = nullptr; } + + void MainMenuUIController::initialize() + { + game_window = Global::ServiceLocator::getInstance()->getGraphicService()->getGameWindow();// added global to access + initializeBackgroundImage(); + initializeButtons(); + } + + void MainMenuUIController::initializeBackgroundImage() + { //check if a texture loaded properly + if (background_texture.loadFromFile(background_texture_path)) + { //if it did then set the bg image and scale it + background_sprite.setTexture(background_texture); + scaleBackgroundImage(); + } + } + + void MainMenuUIController::scaleBackgroundImage() + { + background_sprite.setScale( + static_cast(game_window->getSize().x) / background_sprite.getTexture()->getSize().x, + static_cast(game_window->getSize().y) / background_sprite.getTexture()->getSize().y + ); + } + + void MainMenuUIController::initializeButtons() + { + // check if the tectures loaded + if (loadButtonTexturesFromFile()) + { + // order of function calls matter + setButtonSprites(); + scaleAllButttons(); + positionButtons(); + } + } + // only returns true if all tectures are loaded + bool MainMenuUIController::loadButtonTexturesFromFile() + { + return play_button_texture.loadFromFile(play_button_texture_path) && + instructions_button_texture.loadFromFile(instructions_button_texture_path) && + quit_button_texture.loadFromFile(quit_button_texture_path); + } + + void MainMenuUIController::setButtonSprites() + { + play_button_sprite.setTexture(play_button_texture); + instructions_button_sprite.setTexture(instructions_button_texture); + quit_button_sprite.setTexture(quit_button_texture); + } + + + void MainMenuUIController::scaleAllButttons() + { + scaleButton(&play_button_sprite); + scaleButton(&instructions_button_sprite); + scaleButton(&quit_button_sprite); + } + + void MainMenuUIController::scaleButton(sf::Sprite* button_to_scale) + { + button_to_scale->setScale( + button_width / button_to_scale->getTexture()->getSize().x, + button_height / button_to_scale->getTexture()->getSize().y + ); + } + + void MainMenuUIController::positionButtons() + { + float x_position = (static_cast(game_window->getSize().x) / 2) - button_width / 2; + + play_button_sprite.setPosition({ x_position, 500.f }); + instructions_button_sprite.setPosition({ x_position, 700.f }); + quit_button_sprite.setPosition({ x_position, 900.f }); + } + + void MainMenuUIController::update() + { + } + + void MainMenuUIController::render() + { + game_window->draw(background_sprite); + game_window->draw(play_button_sprite); + game_window->draw(instructions_button_sprite); + game_window->draw(quit_button_sprite); + } + } +} \ No newline at end of file diff --git a/Space-Invaders/Source/UI/UIService.cpp b/Space-Invaders/Source/UI/UIService.cpp new file mode 100644 index 000000000..33b445b99 --- /dev/null +++ b/Space-Invaders/Source/UI/UIService.cpp @@ -0,0 +1,51 @@ +#include "../../Header/UI/UIService.h" +#include "../../Header/Main/GameService.h" + +namespace UI +{ + using namespace Main; + using namespace MainMenu; + + UIService::UIService() + { + main_menu_controller = nullptr; + + createControllers(); + } + + void UIService::createControllers() + { + main_menu_controller = new MainMenuUIController(); + } + + UIService::~UIService() + { + destroy(); + } + + void UIService::initialize() + { + initializeControllers(); + + } + + void UIService::update() + { + main_menu_controller->update(); + } + + void UIService::render() + { + main_menu_controller->render(); + } + + void UIService::initializeControllers() + { + main_menu_controller->initialize(); + } + + void UIService::destroy() + { + delete(main_menu_controller); + } +} \ No newline at end of file From 50e219cd90c8baeaf764a50ca776ce476458a60f Mon Sep 17 00:00:00 2001 From: Rishi Saxena Date: Fri, 2 Aug 2024 15:49:04 +0530 Subject: [PATCH 28/56] Added new control functions --- Space-Invaders/Header/Event/EventService.h | 22 ++++++ Space-Invaders/Header/Main/GameService.h | 1 + .../Header/UI/MainMenu/MainMenuUIController.h | 3 + Space-Invaders/Source/Event/EventService.cpp | 73 ++++++++++++++++++- Space-Invaders/Source/Main/GameService.cpp | 7 ++ .../Source/Player/PlayerController.cpp | 10 ++- .../UI/MainMenu/MainMenuUIController.cpp | 25 +++++++ Space-Invaders/Source/UI/UIService.cpp | 14 +++- 8 files changed, 146 insertions(+), 9 deletions(-) diff --git a/Space-Invaders/Header/Event/EventService.h b/Space-Invaders/Header/Event/EventService.h index 6f5924392..ebecfd5d6 100644 --- a/Space-Invaders/Header/Event/EventService.h +++ b/Space-Invaders/Header/Event/EventService.h @@ -5,6 +5,13 @@ namespace Event { + enum class ButtonState + { + PRESSED, + HELD, + RELEASED, + }; + class EventService { private: @@ -15,6 +22,17 @@ namespace Event bool gameWindowWasClosed(); //for the condition we already had - the title bar cross. bool hasQuitGame(); //for our new 'ESC' condition + //Button States + ButtonState left_mouse_button_state; + ButtonState right_mouse_button_state; + ButtonState left_arrow_button_state; + ButtonState right_arrow_button_state; + ButtonState A_button_state; + ButtonState D_button_state; + + //Button and mouse state functions + void updateMouseButtonsState(ButtonState& current_button_state, sf::Mouse::Button mouse_button); + void updateKeyboardButtonsState(ButtonState& current_button_state, sf::Keyboard::Key keyboard_button); public: @@ -28,6 +46,10 @@ namespace Event bool isKeyboardEvent(); bool pressedLeftKey(); // getting inputs for the player bool pressedRightKey(); + bool pressedLeftMouseButton(); // Mouse inputs for the player + bool pressedRightMouseButton(); + bool pressedAKey(); // AD held check + bool pressedDKey(); }; } diff --git a/Space-Invaders/Header/Main/GameService.h b/Space-Invaders/Header/Main/GameService.h index 123bf325a..5671190cb 100644 --- a/Space-Invaders/Header/Main/GameService.h +++ b/Space-Invaders/Header/Main/GameService.h @@ -26,6 +26,7 @@ namespace Main void initialize(); // Handles game initialization. void initializeVariables();// Handles game initialization. void destroy(); // Handles cleanup tasks. + void showMainMenu(); public: GameService(); // Constructor for initializing the GameService object. diff --git a/Space-Invaders/Header/UI/MainMenu/MainMenuUIController.h b/Space-Invaders/Header/UI/MainMenu/MainMenuUIController.h index 32dc26439..0b811811c 100644 --- a/Space-Invaders/Header/UI/MainMenu/MainMenuUIController.h +++ b/Space-Invaders/Header/UI/MainMenu/MainMenuUIController.h @@ -42,6 +42,9 @@ namespace UI void scaleAllButttons(); void scaleButton(sf::Sprite* button_to_scale); void positionButtons(); + // Which button and function + void processButtonInteractions(); + bool clickedButton(sf::Sprite*, sf::Vector2f); public: MainMenuUIController(); diff --git a/Space-Invaders/Source/Event/EventService.cpp b/Space-Invaders/Source/Event/EventService.cpp index f1622bcd5..cd456eff0 100644 --- a/Space-Invaders/Source/Event/EventService.cpp +++ b/Space-Invaders/Source/Event/EventService.cpp @@ -19,7 +19,12 @@ namespace Event void EventService::update() { - //for later + updateMouseButtonsState(left_mouse_button_state, sf::Mouse::Left); + updateMouseButtonsState(right_mouse_button_state, sf::Mouse::Right); + updateKeyboardButtonsState(left_arrow_button_state, sf::Keyboard::Left); + updateKeyboardButtonsState(right_arrow_button_state, sf::Keyboard::Right); + updateKeyboardButtonsState(A_button_state, sf::Keyboard::A); + updateKeyboardButtonsState(D_button_state, sf::Keyboard::D); } void EventService::processEvents() @@ -35,6 +40,46 @@ namespace Event } } + void EventService::updateMouseButtonsState(ButtonState& current_button_state, sf::Mouse::Button mouse_button) + { + if (sf::Mouse::isButtonPressed(mouse_button)) + { + switch (current_button_state) + { + case ButtonState::RELEASED: + current_button_state = ButtonState::PRESSED; + break; + case ButtonState::PRESSED: + current_button_state = ButtonState::HELD; + break; + } + } + else + { + current_button_state = ButtonState::RELEASED; + } + } + + void EventService::updateKeyboardButtonsState(ButtonState& current_button_state, sf::Keyboard::Key keyboard_button) + { + if (sf::Keyboard::isKeyPressed(keyboard_button)) + { + switch (current_button_state) + { + case ButtonState::RELEASED: + current_button_state = ButtonState::PRESSED; + break; + case ButtonState::PRESSED: + current_button_state = ButtonState::HELD; + break; + } + } + else + { + current_button_state = ButtonState::RELEASED; + } + } + bool EventService::hasQuitGame() { return (isKeyboardEvent() && pressedEscapeKey()); } // only true if the ESC key is pressed and a keyboard event has been registered //checks for if a keyboard key has been pressed @@ -45,7 +90,29 @@ namespace Event bool EventService::isGameWindowOpen() { return game_window != nullptr; } bool EventService::gameWindowWasClosed() { return game_event.type == sf::Event::Closed; } - // Player inputs - bool EventService::pressedLeftKey() { return game_event.key.code == sf::Keyboard::Left; } + // Player inputs + bool EventService::pressedLeftKey() { return left_arrow_button_state == ButtonState::HELD; } + + bool EventService::pressedRightKey() { return right_arrow_button_state == ButtonState::HELD; } + + bool EventService::pressedAKey() { return A_button_state == ButtonState::HELD; } + + bool EventService::pressedDKey() { return D_button_state == ButtonState::HELD; } + + bool EventService::pressedLeftMouseButton() { return left_mouse_button_state == ButtonState::PRESSED; } + + bool EventService::pressedRightMouseButton() { return right_mouse_button_state == ButtonState::PRESSED; } + + /*bool EventService::pressedLeftKey() { return game_event.key.code == sf::Keyboard::Left; } bool EventService::pressedRightKey() { return game_event.key.code == sf::Keyboard::Right; } + bool EventService::pressedLeftMouseButton() + { + // check if a mouse button was pressed and which mouse button it was + return game_event.type == sf::Event::MouseButtonPressed && game_event.mouseButton.button == sf::Mouse::Left; + } + + bool EventService::pressedRightMouseButton() + { + return game_event.type == sf::Event::MouseButtonPressed && game_event.mouseButton.button == sf::Mouse::Right; + }*/ } \ No newline at end of file diff --git a/Space-Invaders/Source/Main/GameService.cpp b/Space-Invaders/Source/Main/GameService.cpp index 6153c00b6..0118a4dab 100644 --- a/Space-Invaders/Source/Main/GameService.cpp +++ b/Space-Invaders/Source/Main/GameService.cpp @@ -32,6 +32,8 @@ namespace Main { service_locator->initialize(); initializeVariables(); + // set the gamestate to main menu + showMainMenu(); } void GameService::initializeVariables() @@ -44,6 +46,11 @@ namespace Main // don't need to do anything here for now. } + void GameService::showMainMenu() + { + setGameState(GameState::MAIN_MENU); + } + // Updates the game logic by delegating to the service locator's update method. void GameService::update() { diff --git a/Space-Invaders/Source/Player/PlayerController.cpp b/Space-Invaders/Source/Player/PlayerController.cpp index 534114f48..d84805283 100644 --- a/Space-Invaders/Source/Player/PlayerController.cpp +++ b/Space-Invaders/Source/Player/PlayerController.cpp @@ -49,13 +49,15 @@ namespace Player void PlayerController::processPlayerInput() { - // we will move this to event service at a later time - if ((sf::Keyboard::isKeyPressed(sf::Keyboard::Left))) + + EventService* event_service = ServiceLocator::getInstance()->getEventService(); + + if (event_service->pressedLeftKey() || event_service->pressedAKey()) { moveLeft(); } - // we will move this to event service at a later time - if ((sf::Keyboard::isKeyPressed(sf::Keyboard::Right))) + + if (event_service->pressedRightKey() || event_service->pressedDKey()) { moveRight(); } diff --git a/Space-Invaders/Source/UI/MainMenu/MainMenuUIController.cpp b/Space-Invaders/Source/UI/MainMenu/MainMenuUIController.cpp index e5accf6e4..37b309a04 100644 --- a/Space-Invaders/Source/UI/MainMenu/MainMenuUIController.cpp +++ b/Space-Invaders/Source/UI/MainMenu/MainMenuUIController.cpp @@ -90,8 +90,33 @@ namespace UI quit_button_sprite.setPosition({ x_position, 900.f }); } + void MainMenuUIController::processButtonInteractions() + { + sf::Vector2f mouse_position = sf::Vector2f(sf::Mouse::getPosition(*game_window)); + + if (clickedButton(&play_button_sprite, mouse_position)) + { + GameService::setGameState(GameState::GAMEPLAY); + } + + if (clickedButton(&instructions_button_sprite, mouse_position)) + { + printf("Clicked Instruction Button \\n"); + } + + if (clickedButton(&quit_button_sprite, mouse_position)) + game_window->close(); + } + + bool MainMenuUIController::clickedButton(sf::Sprite* button_sprite, sf::Vector2f mouse_position) + { + EventService* event_service = Global::ServiceLocator::getInstance()->getEventService(); + return event_service->pressedLeftMouseButton() && button_sprite->getGlobalBounds().contains(mouse_position); + } + void MainMenuUIController::update() { + processButtonInteractions(); } void MainMenuUIController::render() diff --git a/Space-Invaders/Source/UI/UIService.cpp b/Space-Invaders/Source/UI/UIService.cpp index 33b445b99..3e60dec73 100644 --- a/Space-Invaders/Source/UI/UIService.cpp +++ b/Space-Invaders/Source/UI/UIService.cpp @@ -31,12 +31,22 @@ namespace UI void UIService::update() { - main_menu_controller->update(); + switch (GameService::getGameState()) + { + case GameState::MAIN_MENU: + return main_menu_controller->update();; + break; + } } void UIService::render() { - main_menu_controller->render(); + switch (GameService::getGameState()) + { + case GameState::MAIN_MENU: + return main_menu_controller->render(); + break; + } } void UIService::initializeControllers() From 35c51f603645dd87677c99587fd3ef437e55a480 Mon Sep 17 00:00:00 2001 From: Rishi Saxena Date: Sun, 4 Aug 2024 13:44:00 +0530 Subject: [PATCH 29/56] Added EnemyService // enemy_ship.png - zapper.png --- Space-Invaders/Header/Enemy/EnemyController.h | 27 ++++++++++ Space-Invaders/Header/Enemy/EnemyModel.h | 25 ++++++++++ Space-Invaders/Header/Enemy/EnemyService.h | 25 ++++++++++ Space-Invaders/Header/Enemy/EnemyView.h | 34 +++++++++++++ Space-Invaders/Header/Global/ServiceLocator.h | 3 ++ .../Source/Enemy/EnemyController.cpp | 42 ++++++++++++++++ Space-Invaders/Source/Enemy/EnemyModel.cpp | 34 +++++++++++++ Space-Invaders/Source/Enemy/EnemyService.cpp | 43 ++++++++++++++++ Space-Invaders/Source/Enemy/EnemyView.cpp | 49 +++++++++++++++++++ .../Source/Global/ServiceLocator.cpp | 28 +++++++++-- 10 files changed, 305 insertions(+), 5 deletions(-) create mode 100644 Space-Invaders/Header/Enemy/EnemyController.h create mode 100644 Space-Invaders/Header/Enemy/EnemyModel.h create mode 100644 Space-Invaders/Header/Enemy/EnemyService.h create mode 100644 Space-Invaders/Header/Enemy/EnemyView.h create mode 100644 Space-Invaders/Source/Enemy/EnemyController.cpp create mode 100644 Space-Invaders/Source/Enemy/EnemyModel.cpp create mode 100644 Space-Invaders/Source/Enemy/EnemyService.cpp create mode 100644 Space-Invaders/Source/Enemy/EnemyView.cpp diff --git a/Space-Invaders/Header/Enemy/EnemyController.h b/Space-Invaders/Header/Enemy/EnemyController.h new file mode 100644 index 000000000..7910db832 --- /dev/null +++ b/Space-Invaders/Header/Enemy/EnemyController.h @@ -0,0 +1,27 @@ +#pragma once + +#include + +namespace Enemy +{ + class EnemyView; + class EnemyModel; + + class EnemyController + { + private: + + EnemyView* enemy_view; + EnemyModel* enemy_model; + + public: + EnemyController(); + ~EnemyController(); + + void initialize(); + void update(); + void render(); + + sf::Vector2f getEnemyPosition(); + }; +} \ No newline at end of file diff --git a/Space-Invaders/Header/Enemy/EnemyModel.h b/Space-Invaders/Header/Enemy/EnemyModel.h new file mode 100644 index 000000000..19f6f84ef --- /dev/null +++ b/Space-Invaders/Header/Enemy/EnemyModel.h @@ -0,0 +1,25 @@ +#pragma once +#include + +namespace Enemy +{ + class EnemyModel + { + private: + sf::Vector2f reference_position = sf::Vector2f(100.f, 100.f); + sf::Vector2f enemy_position; + + public: + EnemyModel(); + ~EnemyModel(); + + void initialize(); + + sf::Vector2f getEnemyPosition(); + void setEnemyPosition(sf::Vector2f position); + + sf::Vector2f getReferencePosition(); + void setReferencePosition(sf::Vector2f position); + + }; +} \ No newline at end of file diff --git a/Space-Invaders/Header/Enemy/EnemyService.h b/Space-Invaders/Header/Enemy/EnemyService.h new file mode 100644 index 000000000..7ade420ca --- /dev/null +++ b/Space-Invaders/Header/Enemy/EnemyService.h @@ -0,0 +1,25 @@ +#pragma once +namespace Enemy +{ + class EnemyController; + + class EnemyService + { + private: + + void Destroy(); // function to delete enemy + + EnemyController* enemy; // enemy controller ptr + + public: + EnemyService(); + virtual ~EnemyService(); + + void initialize(); + void update(); + void render(); + + EnemyController* spawnEnemy(); // Function to spawn enemy + + }; +} \ No newline at end of file diff --git a/Space-Invaders/Header/Enemy/EnemyView.h b/Space-Invaders/Header/Enemy/EnemyView.h new file mode 100644 index 000000000..a2e91275a --- /dev/null +++ b/Space-Invaders/Header/Enemy/EnemyView.h @@ -0,0 +1,34 @@ +#pragma once + +#include + +namespace Enemy +{ + class EnemyController; + + class EnemyView + { + private: + const sf::String enemy_texture_path = "assets/textures/zapper.png"; // cureent ship - zapper + + const float enemy_sprite_width = 60.f; + const float enemy_sprite_height = 60.f; + + EnemyController* enemy_controller; + + sf::RenderWindow* game_window; + sf::Texture enemy_texture; + sf::Sprite enemy_sprite; + + void initializeEnemySprite(); + void scaleEnemySprite(); + + public: + EnemyView(); + ~EnemyView(); + + void initialize(EnemyController* controller); + void update(); + void render(); + }; +} \ No newline at end of file diff --git a/Space-Invaders/Header/Global/ServiceLocator.h b/Space-Invaders/Header/Global/ServiceLocator.h index fe2ccf055..445b2cd3e 100644 --- a/Space-Invaders/Header/Global/ServiceLocator.h +++ b/Space-Invaders/Header/Global/ServiceLocator.h @@ -4,6 +4,7 @@ #include "../../Header/Player/PlayerService.h" #include "../../Header/Time/TimeService.h" #include "../../Header/UI/UIService.h" +#include "../../Header/Enemy/EnemyService.h" // ServiceLocator Class Summary: This class manages access to various services in the application. // include relevant headers files @@ -20,6 +21,7 @@ namespace Global Player::PlayerService* player_service; Time::TimeService* time_service; UI::UIService* ui_service; + Enemy::EnemyService* enemy_service; // Public Methods ServiceLocator(); @@ -43,5 +45,6 @@ namespace Global Player::PlayerService* getPlayerService(); // Retrieve the PlayerService instance Time::TimeService* getTimeService(); // Retrieve the TimeService instance UI::UIService* getUIService(); // Retrive the UIService instance + Enemy::EnemyService* getEnemyService(); // Retrive the EnemyService instance }; } \ No newline at end of file diff --git a/Space-Invaders/Source/Enemy/EnemyController.cpp b/Space-Invaders/Source/Enemy/EnemyController.cpp new file mode 100644 index 000000000..646dd18d3 --- /dev/null +++ b/Space-Invaders/Source/Enemy/EnemyController.cpp @@ -0,0 +1,42 @@ +#include "../../Header/Enemy/EnemyController.h" +#include "../../Header/Enemy/EnemyView.h" +#include "../../Header/Enemy/EnemyModel.h" +#include "../../Header/Global/ServiceLocator.h" + +namespace Enemy +{ + using namespace Global; + + EnemyController::EnemyController() + { + enemy_view = new EnemyView(); + enemy_model = new EnemyModel(); + } + + EnemyController::~EnemyController() + { + delete (enemy_view); + delete (enemy_model); + } + + void EnemyController::initialize() + { + enemy_model->initialize(); + enemy_view->initialize(this); // we will discuss this soon + } + + void EnemyController::update() + { + enemy_view->update(); + } + + void EnemyController::render() + { + enemy_view->render(); + } + + sf::Vector2f EnemyController::getEnemyPosition() + { + return enemy_model->getEnemyPosition(); + } +} diff --git a/Space-Invaders/Source/Enemy/EnemyModel.cpp b/Space-Invaders/Source/Enemy/EnemyModel.cpp new file mode 100644 index 000000000..56bbdba7c --- /dev/null +++ b/Space-Invaders/Source/Enemy/EnemyModel.cpp @@ -0,0 +1,34 @@ +#include "../../Header/Enemy/EnemyModel.h" + +namespace Enemy +{ + EnemyModel::EnemyModel() { } + + EnemyModel::~EnemyModel() { } + + void EnemyModel::initialize() + { + enemy_position = reference_position; + } + + sf::Vector2f EnemyModel::getEnemyPosition() + { + return enemy_position; + } + + void EnemyModel::setEnemyPosition(sf::Vector2f position) + { + enemy_position = position; + } + + sf::Vector2f EnemyModel::getReferencePosition() + { + return reference_position; + } + + void EnemyModel::setReferencePosition(sf::Vector2f position) + { + reference_position = position; + } + +} \ No newline at end of file diff --git a/Space-Invaders/Source/Enemy/EnemyService.cpp b/Space-Invaders/Source/Enemy/EnemyService.cpp new file mode 100644 index 000000000..44548a8d7 --- /dev/null +++ b/Space-Invaders/Source/Enemy/EnemyService.cpp @@ -0,0 +1,43 @@ +#include "../../Header/Enemy/EnemyService.h" +#include "../../Header/Enemy/EnemyController.h" +#include "../../Header/Global/ServiceLocator.h" + +namespace Enemy +{ + using namespace Global; + + + EnemyService::EnemyService() { enemy = nullptr; } + + EnemyService::~EnemyService() { Destroy(); } + + void EnemyService::initialize() + { + //Spawn Enemy + spawnEnemy(); + } + + void EnemyService::update() + { + } + + void EnemyService::render() + { + enemy->render(); + } + + EnemyController* EnemyService::spawnEnemy() + { + //creates and intis an enemy controller + enemy = new EnemyController(); + enemy->initialize(); + + return enemy; + } + + void EnemyService::Destroy() + { + //deallocate memory + delete(enemy); + } +} \ No newline at end of file diff --git a/Space-Invaders/Source/Enemy/EnemyView.cpp b/Space-Invaders/Source/Enemy/EnemyView.cpp new file mode 100644 index 000000000..02c0dddd4 --- /dev/null +++ b/Space-Invaders/Source/Enemy/EnemyView.cpp @@ -0,0 +1,49 @@ +#include "../../Header/Enemy/EnemyView.h" +#include "../../Header/Global/ServiceLocator.h" +#include "../../Header/Graphic/GraphicService.h" +#include "../../Header/Enemy/EnemyController.h" + +namespace Enemy +{ + using namespace Global; + using namespace Graphics; + + EnemyView::EnemyView() { } + + EnemyView::~EnemyView() { } + + void EnemyView::initialize(EnemyController* controller) + { + enemy_controller = controller; + game_window = ServiceLocator::getInstance()->getGraphicService()->getGameWindow(); + initializeEnemySprite(); + } + + void EnemyView::initializeEnemySprite() + { + if (enemy_texture.loadFromFile(enemy_texture_path)) //check if the texture loaded + { + enemy_sprite.setTexture(enemy_texture); //set the sprite + scaleEnemySprite(); // call the method to scale the sprite + } + } + + void EnemyView::scaleEnemySprite() + { + // method to scale the Sprite according to our set dimensions. Don't worry about the static_cast, that will be discussed later. + enemy_sprite.setScale( + static_cast(enemy_sprite_width) / enemy_sprite.getTexture()->getSize().x, + static_cast(enemy_sprite_height) / enemy_sprite.getTexture()->getSize().y + ); + } + + void EnemyView::update() + { + enemy_sprite.setPosition(enemy_controller->getEnemyPosition()); + } + + void EnemyView::render() + { + game_window->draw(enemy_sprite); + } +} \ No newline at end of file diff --git a/Space-Invaders/Source/Global/ServiceLocator.cpp b/Space-Invaders/Source/Global/ServiceLocator.cpp index 9983889db..4385177fe 100644 --- a/Space-Invaders/Source/Global/ServiceLocator.cpp +++ b/Space-Invaders/Source/Global/ServiceLocator.cpp @@ -9,6 +9,7 @@ namespace Global using namespace Time; using namespace Player; using namespace UI; + using namespace Enemy; ServiceLocator::ServiceLocator() @@ -18,6 +19,7 @@ namespace Global player_service = nullptr; time_service = nullptr; ui_service = nullptr; + enemy_service = nullptr; createServices(); } ServiceLocator::~ServiceLocator() @@ -32,6 +34,7 @@ namespace Global player_service = new PlayerService(); time_service = new TimeService(); ui_service = new UIService(); + enemy_service = new EnemyService(); } void ServiceLocator::clearAllServices() @@ -41,6 +44,7 @@ namespace Global delete(player_service); delete(time_service); delete(ui_service); + delete(enemy_service); } ServiceLocator* ServiceLocator::getInstance() @@ -56,24 +60,37 @@ namespace Global player_service->initialize(); time_service->initialize(); ui_service->initialize(); + enemy_service->initialize(); } void ServiceLocator::update() { graphic_service->update(); - event_service->update(); - player_service->update(); time_service->update(); - ui_service->update(); + event_service->update(); + + if (GameService::getGameState() == GameState::GAMEPLAY) + { + player_service->update(); + enemy_service->update(); + } + + ui_service->update(); } void ServiceLocator::render() { graphic_service->render(); - player_service->render(); + + if (GameService::getGameState() == GameState::GAMEPLAY) + { + player_service->render(); + enemy_service->render(); + } + ui_service->render(); //no event service because nothing to render - //no time service + //no time service because nothing to render } GraphicService* ServiceLocator::getGraphicService() { return graphic_service; } @@ -81,5 +98,6 @@ namespace Global PlayerService* ServiceLocator::getPlayerService() { return player_service; } TimeService* ServiceLocator::getTimeService() { return time_service; } UIService* ServiceLocator::getUIService() { return ui_service; } + EnemyService* ServiceLocator::getEnemyService() { return enemy_service; } } \ No newline at end of file From f515f61003233cc65aa1d47a308aa437acb97da2 Mon Sep 17 00:00:00 2001 From: Rishi Saxena Date: Sun, 4 Aug 2024 14:15:14 +0530 Subject: [PATCH 30/56] Added movement --- Space-Invaders/Header/Enemy/EnemyController.h | 6 ++ Space-Invaders/Header/Enemy/EnemyModel.h | 19 ++++++ .../Source/Enemy/EnemyController.cpp | 60 +++++++++++++++++++ Space-Invaders/Source/Enemy/EnemyModel.cpp | 12 ++++ Space-Invaders/Source/Enemy/EnemyService.cpp | 1 + 5 files changed, 98 insertions(+) diff --git a/Space-Invaders/Header/Enemy/EnemyController.h b/Space-Invaders/Header/Enemy/EnemyController.h index 7910db832..4ebb4e266 100644 --- a/Space-Invaders/Header/Enemy/EnemyController.h +++ b/Space-Invaders/Header/Enemy/EnemyController.h @@ -14,6 +14,12 @@ namespace Enemy EnemyView* enemy_view; EnemyModel* enemy_model; + // manage movement methods + void move(); + void moveLeft(); + void moveRight(); + void moveDown(); + public: EnemyController(); ~EnemyController(); diff --git a/Space-Invaders/Header/Enemy/EnemyModel.h b/Space-Invaders/Header/Enemy/EnemyModel.h index 19f6f84ef..037d2dced 100644 --- a/Space-Invaders/Header/Enemy/EnemyModel.h +++ b/Space-Invaders/Header/Enemy/EnemyModel.h @@ -3,23 +3,42 @@ namespace Enemy { + enum class MovementDirection + { + LEFT, + RIGHT, + DOWN, + }; + class EnemyModel { private: sf::Vector2f reference_position = sf::Vector2f(100.f, 100.f); sf::Vector2f enemy_position; + MovementDirection movement_direction; public: EnemyModel(); ~EnemyModel(); + //const settings for enemy + const sf::Vector2f left_most_position = sf::Vector2f(50.f, 950.f); + const sf::Vector2f right_most_position = sf::Vector2f(1800.f, 950.f); + + const float vertical_travel_distance = 100.f; + const float enemy_movement_speed = 250.0f; + void initialize(); + // Getters and Setters sf::Vector2f getEnemyPosition(); void setEnemyPosition(sf::Vector2f position); sf::Vector2f getReferencePosition(); void setReferencePosition(sf::Vector2f position); + MovementDirection getMovementDirection(); + void setMovementDirection(MovementDirection direction); + }; } \ No newline at end of file diff --git a/Space-Invaders/Source/Enemy/EnemyController.cpp b/Space-Invaders/Source/Enemy/EnemyController.cpp index 646dd18d3..b7dd7c979 100644 --- a/Space-Invaders/Source/Enemy/EnemyController.cpp +++ b/Space-Invaders/Source/Enemy/EnemyController.cpp @@ -7,6 +7,65 @@ namespace Enemy { using namespace Global; + void EnemyController::move() + { + switch (enemy_model->getMovementDirection()) + { + case::Enemy::MovementDirection::LEFT: + moveLeft(); + break; + + case::Enemy::MovementDirection::RIGHT: + moveRight(); + break; + + case::Enemy::MovementDirection::DOWN: + moveDown(); + break; + } + } + + void EnemyController::moveLeft() + { + sf::Vector2f currentPosition = enemy_model->getEnemyPosition(); //get enemy pos + currentPosition.x += enemy_model->enemy_movement_speed * ServiceLocator::getInstance()->getTimeService()->getDeltaTime(); //move + + if (currentPosition.x >= enemy_model->left_most_position.x) //check if we reached right most pos + { + enemy_model->setMovementDirection(MovementDirection::DOWN); // move + enemy_model->setReferencePosition(currentPosition);// set ref pos + } + else enemy_model->setEnemyPosition(currentPosition); + } + + void EnemyController::moveRight() + { + sf::Vector2f currentPosition = enemy_model->getEnemyPosition(); //get enemy pos + currentPosition.x += enemy_model->enemy_movement_speed * ServiceLocator::getInstance()->getTimeService()->getDeltaTime(); //move + + if (currentPosition.x >= enemy_model->right_most_position.x) //check if we reached right most pos + { + enemy_model->setMovementDirection(MovementDirection::DOWN); // move + enemy_model->setReferencePosition(currentPosition);// set ref pos + } + else enemy_model->setEnemyPosition(currentPosition); + } + + void EnemyController::moveDown() + { + sf::Vector2f currentPosition = enemy_model->getEnemyPosition(); + currentPosition.y += enemy_model->enemy_movement_speed * ServiceLocator::getInstance()->getTimeService()->getDeltaTime(); + + //check if enemy has moved the specified distance downwards + if (currentPosition.y >= enemy_model->getReferencePosition().y + enemy_model->vertical_travel_distance) + { + //check where to move them based on position + if (enemy_model->getReferencePosition().x <= enemy_model->left_most_position.x) enemy_model->setMovementDirection(MovementDirection::RIGHT); + else enemy_model->setMovementDirection(MovementDirection::LEFT); + } + else enemy_model->setEnemyPosition(currentPosition); + } + EnemyController::EnemyController() { enemy_view = new EnemyView(); @@ -27,6 +86,7 @@ namespace Enemy void EnemyController::update() { + move(); // has all directional moves enemy_view->update(); } diff --git a/Space-Invaders/Source/Enemy/EnemyModel.cpp b/Space-Invaders/Source/Enemy/EnemyModel.cpp index 56bbdba7c..1b5eb8b9f 100644 --- a/Space-Invaders/Source/Enemy/EnemyModel.cpp +++ b/Space-Invaders/Source/Enemy/EnemyModel.cpp @@ -8,6 +8,8 @@ namespace Enemy void EnemyModel::initialize() { + // Starts from the right position + movement_direction = MovementDirection::RIGHT; enemy_position = reference_position; } @@ -31,4 +33,14 @@ namespace Enemy reference_position = position; } + MovementDirection EnemyModel::getMovementDirection() + { + return movement_direction; + } + + void EnemyModel::setMovementDirection(MovementDirection direction) + { + movement_direction = direction; + } + } \ No newline at end of file diff --git a/Space-Invaders/Source/Enemy/EnemyService.cpp b/Space-Invaders/Source/Enemy/EnemyService.cpp index 44548a8d7..63d5b5bc2 100644 --- a/Space-Invaders/Source/Enemy/EnemyService.cpp +++ b/Space-Invaders/Source/Enemy/EnemyService.cpp @@ -19,6 +19,7 @@ namespace Enemy void EnemyService::update() { + enemy->update(); } void EnemyService::render() From fb6f2c47698d0fab7ac457481eb6e62c5a437cc5 Mon Sep 17 00:00:00 2001 From: Rishi Saxena Date: Sun, 4 Aug 2024 14:45:07 +0530 Subject: [PATCH 31/56] fixed move and multiple enemies --- Space-Invaders/Header/Enemy/EnemyController.h | 10 +- Space-Invaders/Header/Enemy/EnemyModel.h | 1 + Space-Invaders/Header/Enemy/EnemyService.h | 14 ++- .../Source/Enemy/EnemyController.cpp | 99 ++++++++++--------- Space-Invaders/Source/Enemy/EnemyService.cpp | 44 ++++++--- 5 files changed, 98 insertions(+), 70 deletions(-) diff --git a/Space-Invaders/Header/Enemy/EnemyController.h b/Space-Invaders/Header/Enemy/EnemyController.h index 4ebb4e266..2cd1d2e75 100644 --- a/Space-Invaders/Header/Enemy/EnemyController.h +++ b/Space-Invaders/Header/Enemy/EnemyController.h @@ -1,5 +1,4 @@ #pragma once - #include namespace Enemy @@ -7,14 +6,20 @@ namespace Enemy class EnemyView; class EnemyModel; + enum class EnemyState; + class EnemyController { private: + const sf::Vector2f left_most_position = sf::Vector2f(50.f, 950.f); + const sf::Vector2f right_most_position = sf::Vector2f(1800.f, 950.f); + + const float vertical_travel_distance = 100.f; + const float enemy_movement_speed = 250.0f; EnemyView* enemy_view; EnemyModel* enemy_model; - // manage movement methods void move(); void moveLeft(); void moveRight(); @@ -29,5 +34,6 @@ namespace Enemy void render(); sf::Vector2f getEnemyPosition(); + EnemyState getEnemyState(); }; } \ No newline at end of file diff --git a/Space-Invaders/Header/Enemy/EnemyModel.h b/Space-Invaders/Header/Enemy/EnemyModel.h index 037d2dced..884a19d29 100644 --- a/Space-Invaders/Header/Enemy/EnemyModel.h +++ b/Space-Invaders/Header/Enemy/EnemyModel.h @@ -40,5 +40,6 @@ namespace Enemy MovementDirection getMovementDirection(); void setMovementDirection(MovementDirection direction); + }; } \ No newline at end of file diff --git a/Space-Invaders/Header/Enemy/EnemyService.h b/Space-Invaders/Header/Enemy/EnemyService.h index 7ade420ca..17de6dfe3 100644 --- a/Space-Invaders/Header/Enemy/EnemyService.h +++ b/Space-Invaders/Header/Enemy/EnemyService.h @@ -1,4 +1,6 @@ #pragma once +#include + namespace Enemy { class EnemyController; @@ -7,9 +9,14 @@ namespace Enemy { private: - void Destroy(); // function to delete enemy + const float spawn_interval = 3.f; + + std::vector enemy_list; + float spawn_timer; - EnemyController* enemy; // enemy controller ptr + void updateSpawnTimer(); + void processEnemySpawn(); + void destroy(); public: EnemyService(); @@ -18,8 +25,7 @@ namespace Enemy void initialize(); void update(); void render(); - - EnemyController* spawnEnemy(); // Function to spawn enemy + void spawnEnemy(); // Function to spawn enemy }; } \ No newline at end of file diff --git a/Space-Invaders/Source/Enemy/EnemyController.cpp b/Space-Invaders/Source/Enemy/EnemyController.cpp index b7dd7c979..600361c3c 100644 --- a/Space-Invaders/Source/Enemy/EnemyController.cpp +++ b/Space-Invaders/Source/Enemy/EnemyController.cpp @@ -1,11 +1,43 @@ -#include "../../Header/Enemy/EnemyController.h" -#include "../../Header/Enemy/EnemyView.h" -#include "../../Header/Enemy/EnemyModel.h" -#include "../../Header/Global/ServiceLocator.h" +#include "../../header/Enemy/EnemyController.h" +#include "../../header/Enemy/EnemyView.h" +#include "../../header/Enemy/EnemyModel.h" +#include "../../header/Global/ServiceLocator.h" +#include "../../header/Event/EventService.h" namespace Enemy { using namespace Global; + using namespace Event; + using namespace Time; + + EnemyController::EnemyController() + { + enemy_view = new EnemyView(); + enemy_model = new EnemyModel(); + } + + EnemyController::~EnemyController() + { + delete (enemy_view); + delete (enemy_model); + } + + void EnemyController::initialize() + { + enemy_model->initialize(); + enemy_view->initialize(this); + } + + void EnemyController::update() + { + move(); + enemy_view->update(); + } + + void EnemyController::render() + { + enemy_view->render(); + } void EnemyController::move() { @@ -27,26 +59,26 @@ namespace Enemy void EnemyController::moveLeft() { - sf::Vector2f currentPosition = enemy_model->getEnemyPosition(); //get enemy pos - currentPosition.x += enemy_model->enemy_movement_speed * ServiceLocator::getInstance()->getTimeService()->getDeltaTime(); //move + sf::Vector2f currentPosition = enemy_model->getEnemyPosition(); + currentPosition.x -= enemy_movement_speed * ServiceLocator::getInstance()->getTimeService()->getDeltaTime(); - if (currentPosition.x >= enemy_model->left_most_position.x) //check if we reached right most pos + if (currentPosition.x <= left_most_position.x) { - enemy_model->setMovementDirection(MovementDirection::DOWN); // move - enemy_model->setReferencePosition(currentPosition);// set ref pos + enemy_model->setMovementDirection(MovementDirection::DOWN); + enemy_model->setReferencePosition(currentPosition); } else enemy_model->setEnemyPosition(currentPosition); } void EnemyController::moveRight() { - sf::Vector2f currentPosition = enemy_model->getEnemyPosition(); //get enemy pos - currentPosition.x += enemy_model->enemy_movement_speed * ServiceLocator::getInstance()->getTimeService()->getDeltaTime(); //move + sf::Vector2f currentPosition = enemy_model->getEnemyPosition(); + currentPosition.x += enemy_movement_speed * ServiceLocator::getInstance()->getTimeService()->getDeltaTime(); - if (currentPosition.x >= enemy_model->right_most_position.x) //check if we reached right most pos + if (currentPosition.x >= right_most_position.x) { - enemy_model->setMovementDirection(MovementDirection::DOWN); // move - enemy_model->setReferencePosition(currentPosition);// set ref pos + enemy_model->setMovementDirection(MovementDirection::DOWN); + enemy_model->setReferencePosition(currentPosition); } else enemy_model->setEnemyPosition(currentPosition); } @@ -54,49 +86,18 @@ namespace Enemy void EnemyController::moveDown() { sf::Vector2f currentPosition = enemy_model->getEnemyPosition(); - currentPosition.y += enemy_model->enemy_movement_speed * ServiceLocator::getInstance()->getTimeService()->getDeltaTime(); + currentPosition.y += enemy_movement_speed * ServiceLocator::getInstance()->getTimeService()->getDeltaTime(); - //check if enemy has moved the specified distance downwards - if (currentPosition.y >= enemy_model->getReferencePosition().y + enemy_model->vertical_travel_distance) + if (currentPosition.y >= enemy_model->getReferencePosition().y + vertical_travel_distance) { - //check where to move them based on position - if (enemy_model->getReferencePosition().x <= enemy_model->left_most_position.x) enemy_model->setMovementDirection(MovementDirection::RIGHT); + if (enemy_model->getReferencePosition().x <= left_most_position.x) enemy_model->setMovementDirection(MovementDirection::RIGHT); else enemy_model->setMovementDirection(MovementDirection::LEFT); } else enemy_model->setEnemyPosition(currentPosition); } - EnemyController::EnemyController() - { - enemy_view = new EnemyView(); - enemy_model = new EnemyModel(); - } - - EnemyController::~EnemyController() - { - delete (enemy_view); - delete (enemy_model); - } - - void EnemyController::initialize() - { - enemy_model->initialize(); - enemy_view->initialize(this); // we will discuss this soon - } - - void EnemyController::update() - { - move(); // has all directional moves - enemy_view->update(); - } - - void EnemyController::render() - { - enemy_view->render(); - } - sf::Vector2f EnemyController::getEnemyPosition() { return enemy_model->getEnemyPosition(); } -} +} \ No newline at end of file diff --git a/Space-Invaders/Source/Enemy/EnemyService.cpp b/Space-Invaders/Source/Enemy/EnemyService.cpp index 63d5b5bc2..ebe71d130 100644 --- a/Space-Invaders/Source/Enemy/EnemyService.cpp +++ b/Space-Invaders/Source/Enemy/EnemyService.cpp @@ -1,44 +1,58 @@ #include "../../Header/Enemy/EnemyService.h" #include "../../Header/Enemy/EnemyController.h" #include "../../Header/Global/ServiceLocator.h" +#include "../../Header/Time/TimeService.h" namespace Enemy { using namespace Global; + using namespace Time; + EnemyService::EnemyService() { } - EnemyService::EnemyService() { enemy = nullptr; } - - EnemyService::~EnemyService() { Destroy(); } + EnemyService::~EnemyService() { destroy(); } void EnemyService::initialize() { - //Spawn Enemy - spawnEnemy(); + spawn_timer = spawn_interval; } void EnemyService::update() { - enemy->update(); + updateSpawnTimer(); + processEnemySpawn(); + + for (int i = 0; i < enemy_list.size(); i++) enemy_list[i]->update(); } void EnemyService::render() { - enemy->render(); + for (int i = 0; i < enemy_list.size(); i++) enemy_list[i]->render(); } - EnemyController* EnemyService::spawnEnemy() + void EnemyService::spawnEnemy() { - //creates and intis an enemy controller - enemy = new EnemyController(); - enemy->initialize(); + EnemyController* enemy_controller = new EnemyController(); + enemy_controller->initialize(); + enemy_list.push_back(enemy_controller); + } - return enemy; + void EnemyService::updateSpawnTimer() + { + spawn_timer += ServiceLocator::getInstance()->getTimeService()->getDeltaTime(); // increase timer + } + + void EnemyService::processEnemySpawn() + { + if (spawn_timer >= spawn_interval) + { + spawnEnemy(); //spawn + spawn_timer = 0.0f; // reset + } } - void EnemyService::Destroy() + void EnemyService::destroy() { - //deallocate memory - delete(enemy); + for (int i = 0; i < enemy_list.size(); i++) delete (enemy_list[i]); //delete all enemies } } \ No newline at end of file From c2cf915abfc0bb04b507f1e90efaa654aff63b70 Mon Sep 17 00:00:00 2001 From: Rishi Saxena Date: Sun, 4 Aug 2024 15:13:03 +0530 Subject: [PATCH 32/56] Added Gameplay Services --- .../Header/Gameplay/GameplayController.h | 21 ++++++++++ .../Header/Gameplay/GameplayService.h | 19 +++++++++ Space-Invaders/Header/Gameplay/GameplayView.h | 26 ++++++++++++ Space-Invaders/Header/Global/ServiceLocator.h | 3 ++ .../Source/Gameplay/GameplayController.cpp | 15 +++++++ .../Source/Gameplay/GameplayService.cpp | 15 +++++++ .../Source/Gameplay/GameplayView.cpp | 40 +++++++++++++++++++ .../Source/Global/ServiceLocator.cpp | 8 ++++ 8 files changed, 147 insertions(+) create mode 100644 Space-Invaders/Header/Gameplay/GameplayController.h create mode 100644 Space-Invaders/Header/Gameplay/GameplayService.h create mode 100644 Space-Invaders/Header/Gameplay/GameplayView.h create mode 100644 Space-Invaders/Source/Gameplay/GameplayController.cpp create mode 100644 Space-Invaders/Source/Gameplay/GameplayService.cpp create mode 100644 Space-Invaders/Source/Gameplay/GameplayView.cpp diff --git a/Space-Invaders/Header/Gameplay/GameplayController.h b/Space-Invaders/Header/Gameplay/GameplayController.h new file mode 100644 index 000000000..76b6fcf24 --- /dev/null +++ b/Space-Invaders/Header/Gameplay/GameplayController.h @@ -0,0 +1,21 @@ +#pragma once +#include + +namespace Gameplay +{ + class GameplayView; + + class GameplayController + { + private: + GameplayView* gameplay_view; + + public: + GameplayController(); + ~GameplayController(); + + void initialize(); + void update(); + void render(); + }; +} \ No newline at end of file diff --git a/Space-Invaders/Header/Gameplay/GameplayService.h b/Space-Invaders/Header/Gameplay/GameplayService.h new file mode 100644 index 000000000..53efd34a5 --- /dev/null +++ b/Space-Invaders/Header/Gameplay/GameplayService.h @@ -0,0 +1,19 @@ +#pragma once +namespace Gameplay +{ + class GameplayController; + + class GameplayService + { + private: + GameplayController* gameplay_controller; + + public: + GameplayService(); + ~GameplayService(); + + void initialize(); + void update(); + void render(); + }; +} \ No newline at end of file diff --git a/Space-Invaders/Header/Gameplay/GameplayView.h b/Space-Invaders/Header/Gameplay/GameplayView.h new file mode 100644 index 000000000..96ecc2163 --- /dev/null +++ b/Space-Invaders/Header/Gameplay/GameplayView.h @@ -0,0 +1,26 @@ +#pragma once +#include + +namespace Gameplay +{ + class GameplayView + { + private: + const sf::String background_texture_path = "assets/textures/space_invaders_bg.png"; + + sf::RenderWindow* game_window; + sf::Texture background_texture; + sf::Sprite background_sprite; + + void initializeBackgroundSprite(); + void scaleBackgroundSprite(); + + public: + GameplayView(); + ~GameplayView(); + + void initialize(); + void update(); + void render(); + }; +} \ No newline at end of file diff --git a/Space-Invaders/Header/Global/ServiceLocator.h b/Space-Invaders/Header/Global/ServiceLocator.h index 445b2cd3e..865b12193 100644 --- a/Space-Invaders/Header/Global/ServiceLocator.h +++ b/Space-Invaders/Header/Global/ServiceLocator.h @@ -5,6 +5,7 @@ #include "../../Header/Time/TimeService.h" #include "../../Header/UI/UIService.h" #include "../../Header/Enemy/EnemyService.h" +#include "../../Header/Gameplay/GameplayService.h" // ServiceLocator Class Summary: This class manages access to various services in the application. // include relevant headers files @@ -22,6 +23,7 @@ namespace Global Time::TimeService* time_service; UI::UIService* ui_service; Enemy::EnemyService* enemy_service; + Gameplay::GameplayService* gameplay_service; // Public Methods ServiceLocator(); @@ -46,5 +48,6 @@ namespace Global Time::TimeService* getTimeService(); // Retrieve the TimeService instance UI::UIService* getUIService(); // Retrive the UIService instance Enemy::EnemyService* getEnemyService(); // Retrive the EnemyService instance + Gameplay::GameplayService* getGameplayService(); // Retrive the GameplayService instance }; } \ No newline at end of file diff --git a/Space-Invaders/Source/Gameplay/GameplayController.cpp b/Space-Invaders/Source/Gameplay/GameplayController.cpp new file mode 100644 index 000000000..ceb231491 --- /dev/null +++ b/Space-Invaders/Source/Gameplay/GameplayController.cpp @@ -0,0 +1,15 @@ +#include "../../header/Gameplay/GameplayController.h" +#include "../../header/Gameplay/GameplayView.h" + +namespace Gameplay +{ + GameplayController::GameplayController() { gameplay_view = new GameplayView(); } + + GameplayController::~GameplayController() { delete (gameplay_view); } + + void GameplayController::initialize() { gameplay_view->initialize(); } + + void GameplayController::update() { gameplay_view->update(); } + + void GameplayController::render() { gameplay_view->render(); } +} diff --git a/Space-Invaders/Source/Gameplay/GameplayService.cpp b/Space-Invaders/Source/Gameplay/GameplayService.cpp new file mode 100644 index 000000000..91b7e9761 --- /dev/null +++ b/Space-Invaders/Source/Gameplay/GameplayService.cpp @@ -0,0 +1,15 @@ +#include "../../header/Gameplay/GameplayService.h" +#include "../../header/Gameplay/GameplayController.h" + +namespace Gameplay +{ + GameplayService::GameplayService() { gameplay_controller = new GameplayController(); } + + GameplayService::~GameplayService() { delete (gameplay_controller); } + + void GameplayService::initialize() { gameplay_controller->initialize(); } + + void GameplayService::update() { gameplay_controller->update(); } + + void GameplayService::render() { gameplay_controller->render(); } +} \ No newline at end of file diff --git a/Space-Invaders/Source/Gameplay/GameplayView.cpp b/Space-Invaders/Source/Gameplay/GameplayView.cpp new file mode 100644 index 000000000..d7c276f92 --- /dev/null +++ b/Space-Invaders/Source/Gameplay/GameplayView.cpp @@ -0,0 +1,40 @@ +#include "../../header/Gameplay/GameplayView.h" +#include "../../header/Global/ServiceLocator.h" +#include "../../header/Graphic/GraphicService.h" + +namespace Gameplay +{ + using namespace Global; + using namespace Graphics; + + GameplayView::GameplayView() { } + + GameplayView::~GameplayView() { } + + void GameplayView::initialize() + { + game_window = ServiceLocator::getInstance()->getGraphicService()->getGameWindow(); + initializeBackgroundSprite(); + } + + void GameplayView::initializeBackgroundSprite() + { + if (background_texture.loadFromFile(background_texture_path)) + { + background_sprite.setTexture(background_texture); + scaleBackgroundSprite(); + } + } + + void GameplayView::scaleBackgroundSprite() + { + background_sprite.setScale( + static_cast(game_window->getSize().x) / background_sprite.getTexture()->getSize().x, + static_cast(game_window->getSize().y) / background_sprite.getTexture()->getSize().y + ); + } + + void GameplayView::update() { } + + void GameplayView::render() { game_window->draw(background_sprite); } +} \ No newline at end of file diff --git a/Space-Invaders/Source/Global/ServiceLocator.cpp b/Space-Invaders/Source/Global/ServiceLocator.cpp index 4385177fe..9a2c46ce5 100644 --- a/Space-Invaders/Source/Global/ServiceLocator.cpp +++ b/Space-Invaders/Source/Global/ServiceLocator.cpp @@ -10,6 +10,7 @@ namespace Global using namespace Player; using namespace UI; using namespace Enemy; + using namespace Gameplay; ServiceLocator::ServiceLocator() @@ -20,6 +21,7 @@ namespace Global time_service = nullptr; ui_service = nullptr; enemy_service = nullptr; + gameplay_service = nullptr; createServices(); } ServiceLocator::~ServiceLocator() @@ -35,6 +37,7 @@ namespace Global time_service = new TimeService(); ui_service = new UIService(); enemy_service = new EnemyService(); + gameplay_service = new GameplayService(); } void ServiceLocator::clearAllServices() @@ -45,6 +48,7 @@ namespace Global delete(time_service); delete(ui_service); delete(enemy_service); + delete(gameplay_service); } ServiceLocator* ServiceLocator::getInstance() @@ -61,6 +65,7 @@ namespace Global time_service->initialize(); ui_service->initialize(); enemy_service->initialize(); + gameplay_service->initialize(); } void ServiceLocator::update() @@ -71,6 +76,7 @@ namespace Global if (GameService::getGameState() == GameState::GAMEPLAY) { + gameplay_service->update(); player_service->update(); enemy_service->update(); } @@ -84,6 +90,7 @@ namespace Global if (GameService::getGameState() == GameState::GAMEPLAY) { + gameplay_service->render(); player_service->render(); enemy_service->render(); } @@ -99,5 +106,6 @@ namespace Global TimeService* ServiceLocator::getTimeService() { return time_service; } UIService* ServiceLocator::getUIService() { return ui_service; } EnemyService* ServiceLocator::getEnemyService() { return enemy_service; } + Gameplay::GameplayService* ServiceLocator::getGameplayService() { return gameplay_service; } } \ No newline at end of file From f3b73832e38221016e20861e7db614e231927d05 Mon Sep 17 00:00:00 2001 From: Rishi Saxena Date: Tue, 6 Aug 2024 13:43:00 +0530 Subject: [PATCH 33/56] Enemy Config --- .../Enemy/Controllers/SubZeroController.h | 15 +++++++++++ .../Enemy/Controllers/ZapperController.h | 15 +++++++++++ Space-Invaders/Header/Enemy/EnemyConfig.h | 26 +++++++++++++++++++ Space-Invaders/Header/Enemy/EnemyController.h | 12 +++++---- Space-Invaders/Header/Enemy/EnemyModel.h | 24 ++++++++--------- .../Enemy/Controllers/SubZeroController.cpp | 1 + .../Enemy/Controllers/ZapperController.cpp | 1 + .../Source/Enemy/EnemyController.cpp | 21 +++++++++++++++ Space-Invaders/Source/Enemy/EnemyModel.cpp | 25 ++++++++++++++++-- 9 files changed, 121 insertions(+), 19 deletions(-) create mode 100644 Space-Invaders/Header/Enemy/Controllers/SubZeroController.h create mode 100644 Space-Invaders/Header/Enemy/Controllers/ZapperController.h create mode 100644 Space-Invaders/Header/Enemy/EnemyConfig.h create mode 100644 Space-Invaders/Source/Enemy/Controllers/SubZeroController.cpp create mode 100644 Space-Invaders/Source/Enemy/Controllers/ZapperController.cpp diff --git a/Space-Invaders/Header/Enemy/Controllers/SubZeroController.h b/Space-Invaders/Header/Enemy/Controllers/SubZeroController.h new file mode 100644 index 000000000..723909059 --- /dev/null +++ b/Space-Invaders/Header/Enemy/Controllers/SubZeroController.h @@ -0,0 +1,15 @@ +#pragma once + +#include "../../header/Enemy/EnemyController.h" + +namespace Enemy +{ + namespace Controller + { + class SubzeroController : public EnemyController + { + private: + + }; + } +} \ No newline at end of file diff --git a/Space-Invaders/Header/Enemy/Controllers/ZapperController.h b/Space-Invaders/Header/Enemy/Controllers/ZapperController.h new file mode 100644 index 000000000..2165ed21a --- /dev/null +++ b/Space-Invaders/Header/Enemy/Controllers/ZapperController.h @@ -0,0 +1,15 @@ +#pragma once + +#include "../../header/Enemy/EnemyController.h" + +namespace Enemy +{ + namespace Controller + { + class ZapperController : public EnemyController + { + private: + + }; + } +} \ No newline at end of file diff --git a/Space-Invaders/Header/Enemy/EnemyConfig.h b/Space-Invaders/Header/Enemy/EnemyConfig.h new file mode 100644 index 000000000..0fff00fae --- /dev/null +++ b/Space-Invaders/Header/Enemy/EnemyConfig.h @@ -0,0 +1,26 @@ +#pragma once + +namespace Enemy +{ + enum class EnemyType + { + ZAPPER, + SUBZERO, + UFO, + THUNDER_SNAKE, + }; + + enum class EnemyState + { + PATROLLING, + ATTACK, + DEAD, + }; + + enum class MovementDirection + { + LEFT, + RIGHT, + DOWN, + }; +} \ No newline at end of file diff --git a/Space-Invaders/Header/Enemy/EnemyController.h b/Space-Invaders/Header/Enemy/EnemyController.h index 2cd1d2e75..a153eff5e 100644 --- a/Space-Invaders/Header/Enemy/EnemyController.h +++ b/Space-Invaders/Header/Enemy/EnemyController.h @@ -20,20 +20,22 @@ namespace Enemy EnemyView* enemy_view; EnemyModel* enemy_model; - void move(); + virtual void move(); void moveLeft(); void moveRight(); void moveDown(); + sf::Vector2f getRandomInitialPosition(); + void handleOutOfBounds(); + public: - EnemyController(); - ~EnemyController(); + EnemyController(EnemyType type); + virtual ~EnemyController(); - void initialize(); + virtual void initialize(); void update(); void render(); sf::Vector2f getEnemyPosition(); - EnemyState getEnemyState(); }; } \ No newline at end of file diff --git a/Space-Invaders/Header/Enemy/EnemyModel.h b/Space-Invaders/Header/Enemy/EnemyModel.h index 884a19d29..148bda095 100644 --- a/Space-Invaders/Header/Enemy/EnemyModel.h +++ b/Space-Invaders/Header/Enemy/EnemyModel.h @@ -3,22 +3,22 @@ namespace Enemy { - enum class MovementDirection - { - LEFT, - RIGHT, - DOWN, - }; + enum class EnemyType; + enum class MovementDirection; + enum class EnemyState; class EnemyModel { private: - sf::Vector2f reference_position = sf::Vector2f(100.f, 100.f); + sf::Vector2f reference_position = sf::Vector2f(50.f, 50.f); sf::Vector2f enemy_position; + MovementDirection movement_direction; + EnemyType enemy_type; + EnemyState enemy_state; public: - EnemyModel(); + EnemyModel(EnemyType type); ~EnemyModel(); //const settings for enemy @@ -33,13 +33,13 @@ namespace Enemy // Getters and Setters sf::Vector2f getEnemyPosition(); void setEnemyPosition(sf::Vector2f position); - sf::Vector2f getReferencePosition(); void setReferencePosition(sf::Vector2f position); - + EnemyState getEnemyState(); + void setEnemyState(EnemyState state); + EnemyType getEnemyType(); + void setEnemyType(EnemyType type); MovementDirection getMovementDirection(); void setMovementDirection(MovementDirection direction); - - }; } \ No newline at end of file diff --git a/Space-Invaders/Source/Enemy/Controllers/SubZeroController.cpp b/Space-Invaders/Source/Enemy/Controllers/SubZeroController.cpp new file mode 100644 index 000000000..1b16e8b66 --- /dev/null +++ b/Space-Invaders/Source/Enemy/Controllers/SubZeroController.cpp @@ -0,0 +1 @@ +#include "../../Header/Enemy/Controllers/SubZeroController.h" diff --git a/Space-Invaders/Source/Enemy/Controllers/ZapperController.cpp b/Space-Invaders/Source/Enemy/Controllers/ZapperController.cpp new file mode 100644 index 000000000..4d7f68d8f --- /dev/null +++ b/Space-Invaders/Source/Enemy/Controllers/ZapperController.cpp @@ -0,0 +1 @@ +#include "../../Header/Enemy/Controllers/ZapperController.h" diff --git a/Space-Invaders/Source/Enemy/EnemyController.cpp b/Space-Invaders/Source/Enemy/EnemyController.cpp index 600361c3c..5ded15ba8 100644 --- a/Space-Invaders/Source/Enemy/EnemyController.cpp +++ b/Space-Invaders/Source/Enemy/EnemyController.cpp @@ -96,6 +96,27 @@ namespace Enemy else enemy_model->setEnemyPosition(currentPosition); } + sf::Vector2f EnemyController::getRandomInitialPosition() + { + float x_offset_distance = (std::rand() % static_cast(enemy_model->right_most_position.x - enemy_model->left_most_position.x)); + float x_position = enemy_model->left_most_position.x + x_offset_distance; + float y_position = enemy_model->left_most_position.y; + + return sf::Vector2f(x_position, y_position); + } + + void EnemyController::handleOutOfBounds() + { + sf::Vector2f enemyPosition = getEnemyPosition(); + sf::Vector2u windowSize = ServiceLocator::getInstance()->getGraphicService()->getGameWindow()->getSize(); + + if (enemyPosition.x < 0 || enemyPosition.x > windowSize.x || + enemyPosition.y < 0 || enemyPosition.y > windowSize.y) + { + ServiceLocator::getInstance()->getEnemyService()->destroyEnemy(this); + } + } + sf::Vector2f EnemyController::getEnemyPosition() { return enemy_model->getEnemyPosition(); diff --git a/Space-Invaders/Source/Enemy/EnemyModel.cpp b/Space-Invaders/Source/Enemy/EnemyModel.cpp index 1b5eb8b9f..052bffabc 100644 --- a/Space-Invaders/Source/Enemy/EnemyModel.cpp +++ b/Space-Invaders/Source/Enemy/EnemyModel.cpp @@ -1,14 +1,15 @@ #include "../../Header/Enemy/EnemyModel.h" +#include "../../Header/Enemy/EnemyConfig.h" namespace Enemy { - EnemyModel::EnemyModel() { } + EnemyModel::EnemyModel(EnemyType type) { enemy_type = type; } EnemyModel::~EnemyModel() { } void EnemyModel::initialize() { - // Starts from the right position + enemy_state = EnemyState::PATROLLING; movement_direction = MovementDirection::RIGHT; enemy_position = reference_position; } @@ -33,6 +34,26 @@ namespace Enemy reference_position = position; } + EnemyState EnemyModel::getEnemyState() + { + return enemy_state; + } + + void EnemyModel::setEnemyState(EnemyState state) + { + enemy_state = state; + } + + EnemyType EnemyModel::getEnemyType() + { + return enemy_type; + } + + void EnemyModel::setEnemyType(EnemyType type) + { + enemy_type = type; + } + MovementDirection EnemyModel::getMovementDirection() { return movement_direction; From 39fdfbec11e51dc3952c20279d44636ad2cff30e Mon Sep 17 00:00:00 2001 From: Rishi Saxena Date: Tue, 6 Aug 2024 15:18:27 +0530 Subject: [PATCH 34/56] Added Zapper and Sub Zero --- .../Enemy/Controllers/SubZeroController.h | 12 ++ .../Enemy/Controllers/ZapperController.h | 14 +++ Space-Invaders/Header/Enemy/EnemyConfig.h | 4 +- Space-Invaders/Header/Enemy/EnemyController.h | 16 +-- Space-Invaders/Header/Enemy/EnemyModel.h | 4 +- Space-Invaders/Header/Enemy/EnemyService.h | 10 +- Space-Invaders/Header/Enemy/EnemyView.h | 6 +- .../Enemy/Controllers/SubZeroController.cpp | 39 ++++++ .../Enemy/Controllers/ZapperController.cpp | 116 ++++++++++++++++++ .../Source/Enemy/EnemyController.cpp | 58 +++------ Space-Invaders/Source/Enemy/EnemyService.cpp | 46 ++++++- Space-Invaders/Source/Enemy/EnemyView.cpp | 23 +++- 12 files changed, 278 insertions(+), 70 deletions(-) diff --git a/Space-Invaders/Header/Enemy/Controllers/SubZeroController.h b/Space-Invaders/Header/Enemy/Controllers/SubZeroController.h index 723909059..51600cb33 100644 --- a/Space-Invaders/Header/Enemy/Controllers/SubZeroController.h +++ b/Space-Invaders/Header/Enemy/Controllers/SubZeroController.h @@ -10,6 +10,18 @@ namespace Enemy { private: + float vertical_movement_speed = 100.f; + + void move() override; + void moveDown(); + + public: + + SubzeroController(EnemyType type); + ~SubzeroController(); + + void initialize() override; + }; } } \ No newline at end of file diff --git a/Space-Invaders/Header/Enemy/Controllers/ZapperController.h b/Space-Invaders/Header/Enemy/Controllers/ZapperController.h index 2165ed21a..cade22a40 100644 --- a/Space-Invaders/Header/Enemy/Controllers/ZapperController.h +++ b/Space-Invaders/Header/Enemy/Controllers/ZapperController.h @@ -10,6 +10,20 @@ namespace Enemy { private: + float vertical_travel_distance = 100.f; + + void move() override; + void moveLeft(); + void moveRight(); + void moveDown(); + + public: + + ZapperController(EnemyType type); + ~ZapperController(); + + void initialize() override; + }; } } \ No newline at end of file diff --git a/Space-Invaders/Header/Enemy/EnemyConfig.h b/Space-Invaders/Header/Enemy/EnemyConfig.h index 0fff00fae..0c54f1ba5 100644 --- a/Space-Invaders/Header/Enemy/EnemyConfig.h +++ b/Space-Invaders/Header/Enemy/EnemyConfig.h @@ -6,8 +6,8 @@ namespace Enemy { ZAPPER, SUBZERO, - UFO, - THUNDER_SNAKE, + //UFO, + //THUNDER_SNAKE, }; enum class EnemyState diff --git a/Space-Invaders/Header/Enemy/EnemyController.h b/Space-Invaders/Header/Enemy/EnemyController.h index a153eff5e..30ce48675 100644 --- a/Space-Invaders/Header/Enemy/EnemyController.h +++ b/Space-Invaders/Header/Enemy/EnemyController.h @@ -6,24 +6,18 @@ namespace Enemy class EnemyView; class EnemyModel; + enum class EnemyType; enum class EnemyState; class EnemyController { - private: - const sf::Vector2f left_most_position = sf::Vector2f(50.f, 950.f); - const sf::Vector2f right_most_position = sf::Vector2f(1800.f, 950.f); - - const float vertical_travel_distance = 100.f; - const float enemy_movement_speed = 250.0f; + protected: + EnemyView* enemy_view; EnemyModel* enemy_model; - virtual void move(); - void moveLeft(); - void moveRight(); - void moveDown(); + virtual void move() = 0; sf::Vector2f getRandomInitialPosition(); void handleOutOfBounds(); @@ -37,5 +31,7 @@ namespace Enemy void render(); sf::Vector2f getEnemyPosition(); + EnemyState getEnemyState(); + EnemyType getEnemyType(); }; } \ No newline at end of file diff --git a/Space-Invaders/Header/Enemy/EnemyModel.h b/Space-Invaders/Header/Enemy/EnemyModel.h index 148bda095..f7a496405 100644 --- a/Space-Invaders/Header/Enemy/EnemyModel.h +++ b/Space-Invaders/Header/Enemy/EnemyModel.h @@ -22,8 +22,8 @@ namespace Enemy ~EnemyModel(); //const settings for enemy - const sf::Vector2f left_most_position = sf::Vector2f(50.f, 950.f); - const sf::Vector2f right_most_position = sf::Vector2f(1800.f, 950.f); + const sf::Vector2f left_most_position = sf::Vector2f(50.f, 50.f); + const sf::Vector2f right_most_position = sf::Vector2f(1800.f, 50.f); const float vertical_travel_distance = 100.f; const float enemy_movement_speed = 250.0f; diff --git a/Space-Invaders/Header/Enemy/EnemyService.h b/Space-Invaders/Header/Enemy/EnemyService.h index 17de6dfe3..8f9dd776f 100644 --- a/Space-Invaders/Header/Enemy/EnemyService.h +++ b/Space-Invaders/Header/Enemy/EnemyService.h @@ -4,28 +4,32 @@ namespace Enemy { class EnemyController; + enum class EnemyType; class EnemyService { private: - const float spawn_interval = 3.f; + const float spawn_interval = 2.f; std::vector enemy_list; float spawn_timer; void updateSpawnTimer(); void processEnemySpawn(); + EnemyType getRandomEnemyType(); + EnemyController* createEnemy(EnemyType enemy_type); void destroy(); public: EnemyService(); - virtual ~EnemyService(); + ~EnemyService(); void initialize(); void update(); void render(); - void spawnEnemy(); // Function to spawn enemy + EnemyController* spawnEnemy(); // Function to spawn enemy + void destroyEnemy(EnemyController* enemy_controller); }; } \ No newline at end of file diff --git a/Space-Invaders/Header/Enemy/EnemyView.h b/Space-Invaders/Header/Enemy/EnemyView.h index a2e91275a..243b63a44 100644 --- a/Space-Invaders/Header/Enemy/EnemyView.h +++ b/Space-Invaders/Header/Enemy/EnemyView.h @@ -1,6 +1,7 @@ #pragma once #include +#include "../../Header/Enemy/EnemyConfig.h" namespace Enemy { @@ -9,7 +10,8 @@ namespace Enemy class EnemyView { private: - const sf::String enemy_texture_path = "assets/textures/zapper.png"; // cureent ship - zapper + const sf::String subzero_texture_path = "assets/textures/subzero.png"; + const sf::String zapper_texture_path = "assets/textures/zapper.png"; const float enemy_sprite_width = 60.f; const float enemy_sprite_height = 60.f; @@ -20,7 +22,7 @@ namespace Enemy sf::Texture enemy_texture; sf::Sprite enemy_sprite; - void initializeEnemySprite(); + void initializeEnemySprite(EnemyType type); void scaleEnemySprite(); public: diff --git a/Space-Invaders/Source/Enemy/Controllers/SubZeroController.cpp b/Space-Invaders/Source/Enemy/Controllers/SubZeroController.cpp index 1b16e8b66..3b212f84c 100644 --- a/Space-Invaders/Source/Enemy/Controllers/SubZeroController.cpp +++ b/Space-Invaders/Source/Enemy/Controllers/SubZeroController.cpp @@ -1 +1,40 @@ #include "../../Header/Enemy/Controllers/SubZeroController.h" +#include "../../Header/Enemy/EnemyModel.h" +#include "../../header/Enemy/EnemyConfig.h" +#include "../../Header/Global/ServiceLocator.h" + +namespace Enemy +{ + using namespace Global; + + namespace Controller + { + SubzeroController::SubzeroController(EnemyType type):EnemyController(type) { } + + SubzeroController::~SubzeroController() { } + + void SubzeroController::initialize() + { + EnemyController::initialize(); + enemy_model->setMovementDirection(MovementDirection::DOWN); + } + + void SubzeroController::move() + { + switch (enemy_model->getMovementDirection()) + { + case::Enemy::MovementDirection::DOWN: + moveDown(); + break; + } + } + + void SubzeroController::moveDown() + { + sf::Vector2f currentPosition = enemy_model->getEnemyPosition(); + currentPosition.y += vertical_movement_speed * ServiceLocator::getInstance()->getTimeService()->getDeltaTime(); + + enemy_model->setEnemyPosition(currentPosition); + } + } +} \ No newline at end of file diff --git a/Space-Invaders/Source/Enemy/Controllers/ZapperController.cpp b/Space-Invaders/Source/Enemy/Controllers/ZapperController.cpp index 4d7f68d8f..ed5dccdf7 100644 --- a/Space-Invaders/Source/Enemy/Controllers/ZapperController.cpp +++ b/Space-Invaders/Source/Enemy/Controllers/ZapperController.cpp @@ -1 +1,117 @@ #include "../../Header/Enemy/Controllers/ZapperController.h" +#include "../../Header/Enemy/EnemyModel.h" +#include "../../Header/Enemy/EnemyConfig.h" +#include "../../Header/Global/ServiceLocator.h" + +namespace Enemy +{ + using namespace Global; + + namespace Controller + { + ZapperController::ZapperController(EnemyType type) : EnemyController(type){ } + + ZapperController::~ZapperController() { } + + void ZapperController::initialize() + { + EnemyController::initialize();; + } + + void ZapperController::move() + { + // Switch statement based on the movement direction of the enemy + switch (enemy_model->getMovementDirection()) + { + // If the movement direction is LEFT + case::Enemy::MovementDirection::LEFT: + moveLeft(); + break; + + // If the movement direction is RIGHT + case::Enemy::MovementDirection::RIGHT: + moveRight(); + break; + + // If the movement direction is DOWN + case::Enemy::MovementDirection::DOWN: + moveDown(); + break; + } + } + + void ZapperController::moveLeft() + { + // Get the current position of the enemy + sf::Vector2f currentPosition = enemy_model->getEnemyPosition(); + + // Update the position to move left + currentPosition.x -= enemy_model->enemy_movement_speed * ServiceLocator::getInstance()->getTimeService()->getDeltaTime(); + + // Check if the enemy reached the leftmost position + if (currentPosition.x <= enemy_model->left_most_position.x) + { + // Set movement direction to DOWN and update reference position + enemy_model->setMovementDirection(MovementDirection::DOWN); + enemy_model->setReferencePosition(currentPosition); + } + else + { + // Update the enemy position + enemy_model->setEnemyPosition(currentPosition); + } + } + + void ZapperController::moveRight() + { + // Get the current position of the enemy + sf::Vector2f currentPosition = enemy_model->getEnemyPosition(); + + // Update the position to move right + currentPosition.x += enemy_model->enemy_movement_speed * ServiceLocator::getInstance()->getTimeService()->getDeltaTime(); + + // Check if the enemy reached the rightmost position + if (currentPosition.x >= enemy_model->right_most_position.x) + { + // Set movement direction to DOWN and update reference position + enemy_model->setMovementDirection(MovementDirection::DOWN); + enemy_model->setReferencePosition(currentPosition); + } + else + { + // Update the enemy position + enemy_model->setEnemyPosition(currentPosition); + } + } + + void ZapperController::moveDown() + { + // Get the current position of the enemy + sf::Vector2f currentPosition = enemy_model->getEnemyPosition(); + + // Update the position to move down + currentPosition.y += enemy_model->enemy_movement_speed * ServiceLocator::getInstance()->getTimeService()->getDeltaTime(); + + // Check if the enemy reached the reference position plus vertical travel distance + if (currentPosition.y >= enemy_model->getReferencePosition().y + vertical_travel_distance) + { + // Check if the enemy reference position is on the left side + if (enemy_model->getReferencePosition().x <= enemy_model->left_most_position.x) + { + // Set movement direction to RIGHT + enemy_model->setMovementDirection(MovementDirection::RIGHT); + } + else + { + // Set movement direction to LEFT + enemy_model->setMovementDirection(MovementDirection::LEFT); + } + } + else + { + // Update the enemy position + enemy_model->setEnemyPosition(currentPosition); + } + } + } +} \ No newline at end of file diff --git a/Space-Invaders/Source/Enemy/EnemyController.cpp b/Space-Invaders/Source/Enemy/EnemyController.cpp index 5ded15ba8..af2cbcd3f 100644 --- a/Space-Invaders/Source/Enemy/EnemyController.cpp +++ b/Space-Invaders/Source/Enemy/EnemyController.cpp @@ -10,10 +10,10 @@ namespace Enemy using namespace Event; using namespace Time; - EnemyController::EnemyController() + EnemyController::EnemyController(EnemyType type) { enemy_view = new EnemyView(); - enemy_model = new EnemyModel(); + enemy_model = new EnemyModel(type); } EnemyController::~EnemyController() @@ -25,6 +25,7 @@ namespace Enemy void EnemyController::initialize() { enemy_model->initialize(); + enemy_model->setEnemyPosition(getRandomInitialPosition()); enemy_view->initialize(this); } @@ -39,7 +40,7 @@ namespace Enemy enemy_view->render(); } - void EnemyController::move() + /*void EnemyController::move() { switch (enemy_model->getMovementDirection()) { @@ -55,46 +56,7 @@ namespace Enemy moveDown(); break; } - } - - void EnemyController::moveLeft() - { - sf::Vector2f currentPosition = enemy_model->getEnemyPosition(); - currentPosition.x -= enemy_movement_speed * ServiceLocator::getInstance()->getTimeService()->getDeltaTime(); - - if (currentPosition.x <= left_most_position.x) - { - enemy_model->setMovementDirection(MovementDirection::DOWN); - enemy_model->setReferencePosition(currentPosition); - } - else enemy_model->setEnemyPosition(currentPosition); - } - - void EnemyController::moveRight() - { - sf::Vector2f currentPosition = enemy_model->getEnemyPosition(); - currentPosition.x += enemy_movement_speed * ServiceLocator::getInstance()->getTimeService()->getDeltaTime(); - - if (currentPosition.x >= right_most_position.x) - { - enemy_model->setMovementDirection(MovementDirection::DOWN); - enemy_model->setReferencePosition(currentPosition); - } - else enemy_model->setEnemyPosition(currentPosition); - } - - void EnemyController::moveDown() - { - sf::Vector2f currentPosition = enemy_model->getEnemyPosition(); - currentPosition.y += enemy_movement_speed * ServiceLocator::getInstance()->getTimeService()->getDeltaTime(); - - if (currentPosition.y >= enemy_model->getReferencePosition().y + vertical_travel_distance) - { - if (enemy_model->getReferencePosition().x <= left_most_position.x) enemy_model->setMovementDirection(MovementDirection::RIGHT); - else enemy_model->setMovementDirection(MovementDirection::LEFT); - } - else enemy_model->setEnemyPosition(currentPosition); - } + }*/ sf::Vector2f EnemyController::getRandomInitialPosition() { @@ -121,4 +83,14 @@ namespace Enemy { return enemy_model->getEnemyPosition(); } + + EnemyState EnemyController::getEnemyState() + { + return enemy_model->getEnemyState(); + } + + EnemyType EnemyController::getEnemyType() + { + return enemy_model->getEnemyType(); + } } \ No newline at end of file diff --git a/Space-Invaders/Source/Enemy/EnemyService.cpp b/Space-Invaders/Source/Enemy/EnemyService.cpp index ebe71d130..4dfff0ffe 100644 --- a/Space-Invaders/Source/Enemy/EnemyService.cpp +++ b/Space-Invaders/Source/Enemy/EnemyService.cpp @@ -2,13 +2,17 @@ #include "../../Header/Enemy/EnemyController.h" #include "../../Header/Global/ServiceLocator.h" #include "../../Header/Time/TimeService.h" +#include "../../Header/Enemy/EnemyConfig.h" +#include "../../Header/Enemy/Controllers/SubZeroController.h" +#include "../../Header/Enemy/Controllers/ZapperController.h" namespace Enemy { using namespace Global; using namespace Time; + using namespace Controller; - EnemyService::EnemyService() { } + EnemyService::EnemyService() { std::srand(static_cast(std::time(nullptr))); } EnemyService::~EnemyService() { destroy(); } @@ -30,11 +34,23 @@ namespace Enemy for (int i = 0; i < enemy_list.size(); i++) enemy_list[i]->render(); } - void EnemyService::spawnEnemy() + EnemyController* EnemyService::spawnEnemy() { - EnemyController* enemy_controller = new EnemyController(); + // The base class pointer will be pointing to a child class object + EnemyController* enemy_controller = createEnemy(getRandomEnemyType()); + enemy_controller->initialize(); enemy_list.push_back(enemy_controller); + + return enemy_controller; + } + + void EnemyService::destroyEnemy(EnemyController* enemy_controller) + { + enemy_list.erase(std::remove(enemy_list.begin(), enemy_list.end(), enemy_controller), enemy_list.end()); + + // Delete the enemy_controller object from memory to free up resources. + delete(enemy_controller); } void EnemyService::updateSpawnTimer() @@ -51,6 +67,30 @@ namespace Enemy } } + EnemyType EnemyService::getRandomEnemyType() + { + int randomType = std::rand() % 2; //since we only have 2 enemies right now + return static_cast(randomType); + } + + EnemyController* EnemyService::createEnemy(EnemyType enemy_type) + { + switch (enemy_type) + { + case::Enemy::EnemyType::ZAPPER: + return new ZapperController(Enemy::EnemyType::ZAPPER); + + /*case::Enemy::EnemyType::THUNDER_SNAKE: + return new ThunderSnakeController(Enemy::EnemyType::THUNDER_SNAKE);*/ + + case::Enemy::EnemyType::SUBZERO: + return new SubzeroController(Enemy::EnemyType::SUBZERO); + + /*case::Enemy::EnemyType::UFO: + return new UFOController(Enemy::EnemyType::UFO);*/ + } + } + void EnemyService::destroy() { for (int i = 0; i < enemy_list.size(); i++) delete (enemy_list[i]); //delete all enemies diff --git a/Space-Invaders/Source/Enemy/EnemyView.cpp b/Space-Invaders/Source/Enemy/EnemyView.cpp index 02c0dddd4..e193c16fc 100644 --- a/Space-Invaders/Source/Enemy/EnemyView.cpp +++ b/Space-Invaders/Source/Enemy/EnemyView.cpp @@ -2,6 +2,7 @@ #include "../../Header/Global/ServiceLocator.h" #include "../../Header/Graphic/GraphicService.h" #include "../../Header/Enemy/EnemyController.h" +#include"../../Header/Enemy/EnemyConfig.h" namespace Enemy { @@ -16,15 +17,27 @@ namespace Enemy { enemy_controller = controller; game_window = ServiceLocator::getInstance()->getGraphicService()->getGameWindow(); - initializeEnemySprite(); + initializeEnemySprite(enemy_controller->getEnemyType()); } - void EnemyView::initializeEnemySprite() + void EnemyView::initializeEnemySprite(EnemyType type) { - if (enemy_texture.loadFromFile(enemy_texture_path)) //check if the texture loaded + switch (type) { - enemy_sprite.setTexture(enemy_texture); //set the sprite - scaleEnemySprite(); // call the method to scale the sprite + case::Enemy::EnemyType::SUBZERO: + if (enemy_texture.loadFromFile(subzero_texture_path)) + { + enemy_sprite.setTexture(enemy_texture); + scaleEnemySprite(); + } + break; + case::Enemy::EnemyType::ZAPPER: + if (enemy_texture.loadFromFile(zapper_texture_path)) + { + enemy_sprite.setTexture(enemy_texture); + scaleEnemySprite(); + } + break; } } From e448b2c74f859cddede4d368128b0848a5727ffa Mon Sep 17 00:00:00 2001 From: Rishi Saxena Date: Tue, 6 Aug 2024 15:49:40 +0530 Subject: [PATCH 35/56] Added Element folder MVC --- Space-Invaders/Header/Element/Bunker/BunkerController.h | 1 + Space-Invaders/Header/Element/Bunker/BunkerModel.h | 1 + Space-Invaders/Header/Element/Bunker/BunkerView.h | 1 + Space-Invaders/Header/Element/ElementService.h | 8 ++++++++ Space-Invaders/Header/Global/ServiceLocator.h | 3 +++ Space-Invaders/Source/Element/Bunker/BunkerController.cpp | 0 Space-Invaders/Source/Element/Bunker/BunkerModel.cpp | 0 Space-Invaders/Source/Element/Bunker/BunkerView.cpp | 0 Space-Invaders/Source/Element/ElementService.cpp | 4 ++++ Space-Invaders/Source/Global/ServiceLocator.cpp | 5 +++++ 10 files changed, 23 insertions(+) create mode 100644 Space-Invaders/Header/Element/Bunker/BunkerController.h create mode 100644 Space-Invaders/Header/Element/Bunker/BunkerModel.h create mode 100644 Space-Invaders/Header/Element/Bunker/BunkerView.h create mode 100644 Space-Invaders/Header/Element/ElementService.h create mode 100644 Space-Invaders/Source/Element/Bunker/BunkerController.cpp create mode 100644 Space-Invaders/Source/Element/Bunker/BunkerModel.cpp create mode 100644 Space-Invaders/Source/Element/Bunker/BunkerView.cpp create mode 100644 Space-Invaders/Source/Element/ElementService.cpp diff --git a/Space-Invaders/Header/Element/Bunker/BunkerController.h b/Space-Invaders/Header/Element/Bunker/BunkerController.h new file mode 100644 index 000000000..50e96676b --- /dev/null +++ b/Space-Invaders/Header/Element/Bunker/BunkerController.h @@ -0,0 +1 @@ +#pragma once diff --git a/Space-Invaders/Header/Element/Bunker/BunkerModel.h b/Space-Invaders/Header/Element/Bunker/BunkerModel.h new file mode 100644 index 000000000..50e96676b --- /dev/null +++ b/Space-Invaders/Header/Element/Bunker/BunkerModel.h @@ -0,0 +1 @@ +#pragma once diff --git a/Space-Invaders/Header/Element/Bunker/BunkerView.h b/Space-Invaders/Header/Element/Bunker/BunkerView.h new file mode 100644 index 000000000..50e96676b --- /dev/null +++ b/Space-Invaders/Header/Element/Bunker/BunkerView.h @@ -0,0 +1 @@ +#pragma once diff --git a/Space-Invaders/Header/Element/ElementService.h b/Space-Invaders/Header/Element/ElementService.h new file mode 100644 index 000000000..8729bb7af --- /dev/null +++ b/Space-Invaders/Header/Element/ElementService.h @@ -0,0 +1,8 @@ +#pragma once +namespace Element +{ + class ElementService + { + + }; +} \ No newline at end of file diff --git a/Space-Invaders/Header/Global/ServiceLocator.h b/Space-Invaders/Header/Global/ServiceLocator.h index 865b12193..cad6fff7a 100644 --- a/Space-Invaders/Header/Global/ServiceLocator.h +++ b/Space-Invaders/Header/Global/ServiceLocator.h @@ -6,6 +6,7 @@ #include "../../Header/UI/UIService.h" #include "../../Header/Enemy/EnemyService.h" #include "../../Header/Gameplay/GameplayService.h" +#include "../../Header/Element/ElementService.h" // ServiceLocator Class Summary: This class manages access to various services in the application. // include relevant headers files @@ -24,6 +25,7 @@ namespace Global UI::UIService* ui_service; Enemy::EnemyService* enemy_service; Gameplay::GameplayService* gameplay_service; + Element::ElementService* element_service; // Public Methods ServiceLocator(); @@ -49,5 +51,6 @@ namespace Global UI::UIService* getUIService(); // Retrive the UIService instance Enemy::EnemyService* getEnemyService(); // Retrive the EnemyService instance Gameplay::GameplayService* getGameplayService(); // Retrive the GameplayService instance + Element::ElementService* getElementService(); // Retrive the ElementService instance }; } \ No newline at end of file diff --git a/Space-Invaders/Source/Element/Bunker/BunkerController.cpp b/Space-Invaders/Source/Element/Bunker/BunkerController.cpp new file mode 100644 index 000000000..e69de29bb diff --git a/Space-Invaders/Source/Element/Bunker/BunkerModel.cpp b/Space-Invaders/Source/Element/Bunker/BunkerModel.cpp new file mode 100644 index 000000000..e69de29bb diff --git a/Space-Invaders/Source/Element/Bunker/BunkerView.cpp b/Space-Invaders/Source/Element/Bunker/BunkerView.cpp new file mode 100644 index 000000000..e69de29bb diff --git a/Space-Invaders/Source/Element/ElementService.cpp b/Space-Invaders/Source/Element/ElementService.cpp new file mode 100644 index 000000000..f8265ca42 --- /dev/null +++ b/Space-Invaders/Source/Element/ElementService.cpp @@ -0,0 +1,4 @@ +namespace Element +{ + +} \ No newline at end of file diff --git a/Space-Invaders/Source/Global/ServiceLocator.cpp b/Space-Invaders/Source/Global/ServiceLocator.cpp index 9a2c46ce5..cb6237fd9 100644 --- a/Space-Invaders/Source/Global/ServiceLocator.cpp +++ b/Space-Invaders/Source/Global/ServiceLocator.cpp @@ -11,6 +11,7 @@ namespace Global using namespace UI; using namespace Enemy; using namespace Gameplay; + using namespace Element; ServiceLocator::ServiceLocator() @@ -22,6 +23,7 @@ namespace Global ui_service = nullptr; enemy_service = nullptr; gameplay_service = nullptr; + element_service = nullptr; createServices(); } ServiceLocator::~ServiceLocator() @@ -38,6 +40,7 @@ namespace Global ui_service = new UIService(); enemy_service = new EnemyService(); gameplay_service = new GameplayService(); + element_service = new ElementService(); } void ServiceLocator::clearAllServices() @@ -49,6 +52,7 @@ namespace Global delete(ui_service); delete(enemy_service); delete(gameplay_service); + delete(element_service); } ServiceLocator* ServiceLocator::getInstance() @@ -107,5 +111,6 @@ namespace Global UIService* ServiceLocator::getUIService() { return ui_service; } EnemyService* ServiceLocator::getEnemyService() { return enemy_service; } Gameplay::GameplayService* ServiceLocator::getGameplayService() { return gameplay_service; } + Element::ElementService* ServiceLocator::getElementService() { return element_service; } } \ No newline at end of file From 446a3a066c13abfe1aedef29e4ad57910f37233e Mon Sep 17 00:00:00 2001 From: Rishi Saxena Date: Wed, 7 Aug 2024 12:30:35 +0530 Subject: [PATCH 36/56] MVC and Bunker --- .../Header/Element/Bunker/BunkerController.h | 27 ++++++++++ .../Header/Element/Bunker/BunkerModel.h | 14 +++++ .../Header/Element/Bunker/BunkerView.h | 35 +++++++++++++ .../Element/Bunker/BunkerController.cpp | 24 +++++++++ .../Source/Element/Bunker/BunkerModel.cpp | 14 +++++ .../Source/Element/Bunker/BunkerView.cpp | 52 +++++++++++++++++++ 6 files changed, 166 insertions(+) diff --git a/Space-Invaders/Header/Element/Bunker/BunkerController.h b/Space-Invaders/Header/Element/Bunker/BunkerController.h index 50e96676b..3370da4b2 100644 --- a/Space-Invaders/Header/Element/Bunker/BunkerController.h +++ b/Space-Invaders/Header/Element/Bunker/BunkerController.h @@ -1 +1,28 @@ #pragma once +#include +#include "../../header/Element/Bunker/BunkerModel.h" + +namespace Element +{ + namespace Bunker + { + class BunkerView; + + class BunkerController + { + private: + BunkerView* bunker_view; + BunkerData bunker_data; + + public: + BunkerController(); + ~BunkerController(); + + void initialize(BunkerData data); + void update(); + void render(); + + sf::Vector2f getBunkerPosition(); + }; + } +} \ No newline at end of file diff --git a/Space-Invaders/Header/Element/Bunker/BunkerModel.h b/Space-Invaders/Header/Element/Bunker/BunkerModel.h index 50e96676b..7ae912814 100644 --- a/Space-Invaders/Header/Element/Bunker/BunkerModel.h +++ b/Space-Invaders/Header/Element/Bunker/BunkerModel.h @@ -1 +1,15 @@ #pragma once +#include + +namespace Element +{ + namespace Bunker + { + struct BunkerData + { + sf::Vector2f position; + BunkerData(); + BunkerData(sf::Vector2f position); + }; + } +} \ No newline at end of file diff --git a/Space-Invaders/Header/Element/Bunker/BunkerView.h b/Space-Invaders/Header/Element/Bunker/BunkerView.h index 50e96676b..cbb63c840 100644 --- a/Space-Invaders/Header/Element/Bunker/BunkerView.h +++ b/Space-Invaders/Header/Element/Bunker/BunkerView.h @@ -1 +1,36 @@ #pragma once +#include + +namespace Element +{ + namespace Bunker + { + class BunkerController; + + class BunkerView + { + private: + const float bunker_sprite_width = 80.f; + const float bunker_sprite_height = 80.f; + + BunkerController* bunker_controller; + sf::RenderWindow* game_window; + + sf::Texture bunker_texture; + sf::Sprite bunker_sprite; + + const sf::String bunker_texture_path = "assets/textures/bunker.png"; + + void scaleSprite(); + void initializeImage(); + + public: + BunkerView(); + ~BunkerView(); + + void initialize(BunkerController* controller); + void update(); + void render(); + }; + } +} \ No newline at end of file diff --git a/Space-Invaders/Source/Element/Bunker/BunkerController.cpp b/Space-Invaders/Source/Element/Bunker/BunkerController.cpp index e69de29bb..8e3d95064 100644 --- a/Space-Invaders/Source/Element/Bunker/BunkerController.cpp +++ b/Space-Invaders/Source/Element/Bunker/BunkerController.cpp @@ -0,0 +1,24 @@ +#include "../../header/Element/Bunker/BunkerController.h" +#include "../../header/Element/Bunker/BunkerView.h" + +namespace Element +{ + namespace Bunker + { + BunkerController::BunkerController() { bunker_view = new BunkerView(); } + + BunkerController::~BunkerController() { delete(bunker_view); } + + void BunkerController::initialize(BunkerData data) + { + bunker_data = data; + bunker_view->initialize(this); + } + + void BunkerController::update() { bunker_view->update(); } + + void BunkerController::render() { bunker_view->render(); } + + sf::Vector2f BunkerController::getBunkerPosition() { return bunker_data.position; } + } +} \ No newline at end of file diff --git a/Space-Invaders/Source/Element/Bunker/BunkerModel.cpp b/Space-Invaders/Source/Element/Bunker/BunkerModel.cpp index e69de29bb..04d29b58d 100644 --- a/Space-Invaders/Source/Element/Bunker/BunkerModel.cpp +++ b/Space-Invaders/Source/Element/Bunker/BunkerModel.cpp @@ -0,0 +1,14 @@ +#include "../../header/Element/Bunker/BunkerModel.h" + +namespace Element +{ + namespace Bunker + { + BunkerData::BunkerData() { }; + + BunkerData::BunkerData(sf::Vector2f position) + { + this->position = position; + } + } +} \ No newline at end of file diff --git a/Space-Invaders/Source/Element/Bunker/BunkerView.cpp b/Space-Invaders/Source/Element/Bunker/BunkerView.cpp index e69de29bb..99a3c5a65 100644 --- a/Space-Invaders/Source/Element/Bunker/BunkerView.cpp +++ b/Space-Invaders/Source/Element/Bunker/BunkerView.cpp @@ -0,0 +1,52 @@ +#include "../../header/Element/Bunker/BunkerView.h" +#include "../../header/Global/ServiceLocator.h" +#include "../../header/Element/Bunker/BunkerController.h" + +namespace Element +{ + namespace Bunker + { + using namespace Global; + + BunkerView::BunkerView() { } + + BunkerView::~BunkerView() { } + + void BunkerView::initialize(BunkerController* controller) + { + bunker_controller = controller; + game_window = ServiceLocator::getInstance()->getGraphicService()->getGameWindow(); + initializeImage(); + } + + void BunkerView::initializeImage() + { + if (bunker_texture.loadFromFile(bunker_texture_path)) + { + bunker_sprite.setTexture(bunker_texture); + scaleSprite(); + } + } + + + void BunkerView::scaleSprite() + { + bunker_sprite.setScale( + static_cast(bunker_sprite_width) / bunker_sprite.getTexture()->getSize().x, + static_cast(bunker_sprite_height) / bunker_sprite.getTexture()->getSize().y + ); + } + + + void BunkerView::update() + { + bunker_sprite.setPosition(bunker_controller->getBunkerPosition()); + } + + void BunkerView::render() + { + game_window->draw(bunker_sprite); + } + + } +} \ No newline at end of file From 9d4ba43fc326b82b2a239aa8e0eea339f94ffd6c Mon Sep 17 00:00:00 2001 From: Rishi Saxena Date: Wed, 7 Aug 2024 13:13:21 +0530 Subject: [PATCH 37/56] Added Config --- .../Header/Element/Bunker/BunkerView.h | 2 +- .../Header/Element/ElementService.h | 26 +++++++++ Space-Invaders/Header/Enemy/EnemyView.h | 4 +- Space-Invaders/Header/Gameplay/GameplayView.h | 2 +- Space-Invaders/Header/Global/Config.h | 39 +++++++++++++ Space-Invaders/Header/Player/PlayerView.h | 2 +- .../Header/UI/MainMenu/MainMenuUIController.h | 8 +-- .../Source/Element/Bunker/BunkerView.cpp | 3 +- .../Source/Element/ElementService.cpp | 30 ++++++++++ Space-Invaders/Source/Enemy/EnemyView.cpp | 5 +- .../Source/Gameplay/GameplayView.cpp | 3 +- Space-Invaders/Source/Global/Config.cpp | 56 +++++++++++++++++++ .../Source/Global/ServiceLocator.cpp | 8 ++- Space-Invaders/Source/Player/PlayerView.cpp | 3 +- .../UI/MainMenu/MainMenuUIController.cpp | 9 +-- 15 files changed, 179 insertions(+), 21 deletions(-) create mode 100644 Space-Invaders/Header/Global/Config.h create mode 100644 Space-Invaders/Source/Global/Config.cpp diff --git a/Space-Invaders/Header/Element/Bunker/BunkerView.h b/Space-Invaders/Header/Element/Bunker/BunkerView.h index cbb63c840..acc163094 100644 --- a/Space-Invaders/Header/Element/Bunker/BunkerView.h +++ b/Space-Invaders/Header/Element/Bunker/BunkerView.h @@ -19,7 +19,7 @@ namespace Element sf::Texture bunker_texture; sf::Sprite bunker_sprite; - const sf::String bunker_texture_path = "assets/textures/bunker.png"; + //const sf::String bunker_texture_path = "assets/textures/bunker.png"; void scaleSprite(); void initializeImage(); diff --git a/Space-Invaders/Header/Element/ElementService.h b/Space-Invaders/Header/Element/ElementService.h index 8729bb7af..e9c4c8719 100644 --- a/Space-Invaders/Header/Element/ElementService.h +++ b/Space-Invaders/Header/Element/ElementService.h @@ -1,8 +1,34 @@ #pragma once +#include +#include +#include "../../header/Element/Bunker/BunkerController.h" +#include "../../header/Element/Bunker/BunkerModel.h" + namespace Element { + class BunkerController; + class ElementService { + private: + //const vector so that the default values will not be changed down the road by mistake. + const std::vector bunker_data_list = { Bunker::BunkerData(sf::Vector2f(130.f, 800.f)), + Bunker::BunkerData(sf::Vector2f(430.0f, 800.f)), + Bunker::BunkerData(sf::Vector2f(730.0f, 800.f)), + Bunker::BunkerData(sf::Vector2f(1130.0f, 800.f)), + Bunker::BunkerData(sf::Vector2f(1430.0f, 800.f)), + Bunker::BunkerData(sf::Vector2f(1730.0f, 800.f)) }; + + std::vector bunker_list; + + void destroy(); + + public: + ElementService(); + virtual ~ElementService(); + void initialize(); + void update(); + void render(); }; } \ No newline at end of file diff --git a/Space-Invaders/Header/Enemy/EnemyView.h b/Space-Invaders/Header/Enemy/EnemyView.h index 243b63a44..b89b046a7 100644 --- a/Space-Invaders/Header/Enemy/EnemyView.h +++ b/Space-Invaders/Header/Enemy/EnemyView.h @@ -10,8 +10,8 @@ namespace Enemy class EnemyView { private: - const sf::String subzero_texture_path = "assets/textures/subzero.png"; - const sf::String zapper_texture_path = "assets/textures/zapper.png"; + //const sf::String subzero_texture_path = "assets/textures/subzero.png"; + //const sf::String zapper_texture_path = "assets/textures/zapper.png"; const float enemy_sprite_width = 60.f; const float enemy_sprite_height = 60.f; diff --git a/Space-Invaders/Header/Gameplay/GameplayView.h b/Space-Invaders/Header/Gameplay/GameplayView.h index 96ecc2163..e6675b5db 100644 --- a/Space-Invaders/Header/Gameplay/GameplayView.h +++ b/Space-Invaders/Header/Gameplay/GameplayView.h @@ -6,7 +6,7 @@ namespace Gameplay class GameplayView { private: - const sf::String background_texture_path = "assets/textures/space_invaders_bg.png"; + //const sf::String background_texture_path = "assets/textures/space_invaders_bg.png"; sf::RenderWindow* game_window; sf::Texture background_texture; diff --git a/Space-Invaders/Header/Global/Config.h b/Space-Invaders/Header/Global/Config.h new file mode 100644 index 000000000..385d119df --- /dev/null +++ b/Space-Invaders/Header/Global/Config.h @@ -0,0 +1,39 @@ +#pragma once +#include + +namespace Global +{ + class Config + { + public: + static const sf::String outscal_logo_texture_path; + static const sf::String background_texture_path; + static const sf::String player_texture_path; + + static const sf::String zapper_texture_path; + static const sf::String thunder_snake_texture_path; + static const sf::String subzero_texture_path; + static const sf::String ufo_texture_path; + static const sf::String bunker_texture_path; + + static const sf::String shield_texture_path; + static const sf::String tripple_laser_texture_path; + static const sf::String rapid_fire_texture_path; + static const sf::String outscal_bomb_texture_path; + + static const sf::String laser_bullet_texture_path; + static const sf::String torpedoe_texture_path; + static const sf::String frost_beam_texture_path; + + static const sf::String play_button_texture_path; + static const sf::String instructions_button_texture_path; + static const sf::String quit_button_texture_path; + static const sf::String menu_button_texture_path; + + static const sf::String bubble_bobble_font_path; + static const sf::String DS_DIGIB_font_path; + + static const sf::String background_music_path; + static const sf::String button_click_sound_path; + }; +} diff --git a/Space-Invaders/Header/Player/PlayerView.h b/Space-Invaders/Header/Player/PlayerView.h index 8e901f3f4..00fd6efa6 100644 --- a/Space-Invaders/Header/Player/PlayerView.h +++ b/Space-Invaders/Header/Player/PlayerView.h @@ -8,7 +8,7 @@ namespace Player { private: - const sf::String player_texture_path = "assets/textures/player_ship.png"; + //const sf::String player_texture_path = "assets/textures/player_ship.png"; const float player_sprite_width = 60.f; const float player_sprite_height = 60.f; diff --git a/Space-Invaders/Header/UI/MainMenu/MainMenuUIController.h b/Space-Invaders/Header/UI/MainMenu/MainMenuUIController.h index 0b811811c..daa45b4bf 100644 --- a/Space-Invaders/Header/UI/MainMenu/MainMenuUIController.h +++ b/Space-Invaders/Header/UI/MainMenu/MainMenuUIController.h @@ -9,10 +9,10 @@ namespace UI { private: - const sf::String background_texture_path = "assets/textures/space_invaders_bg.png"; - const sf::String play_button_texture_path = "assets/textures/play_button.png"; - const sf::String instructions_button_texture_path = "assets/textures/instructions_button.png"; - const sf::String quit_button_texture_path = "assets/textures/quit_button.png"; + //const sf::String background_texture_path = "assets/textures/space_invaders_bg.png"; + //const sf::String play_button_texture_path = "assets/textures/play_button.png"; + //const sf::String instructions_button_texture_path = "assets/textures/instructions_button.png"; + //const sf::String quit_button_texture_path = "assets/textures/quit_button.png"; // Constants: const float button_width = 400.f; diff --git a/Space-Invaders/Source/Element/Bunker/BunkerView.cpp b/Space-Invaders/Source/Element/Bunker/BunkerView.cpp index 99a3c5a65..5cd03623a 100644 --- a/Space-Invaders/Source/Element/Bunker/BunkerView.cpp +++ b/Space-Invaders/Source/Element/Bunker/BunkerView.cpp @@ -1,6 +1,7 @@ #include "../../header/Element/Bunker/BunkerView.h" #include "../../header/Global/ServiceLocator.h" #include "../../header/Element/Bunker/BunkerController.h" +#include "../../Header/Global/Config.h" namespace Element { @@ -21,7 +22,7 @@ namespace Element void BunkerView::initializeImage() { - if (bunker_texture.loadFromFile(bunker_texture_path)) + if (bunker_texture.loadFromFile(Config::bunker_texture_path)) { bunker_sprite.setTexture(bunker_texture); scaleSprite(); diff --git a/Space-Invaders/Source/Element/ElementService.cpp b/Space-Invaders/Source/Element/ElementService.cpp index f8265ca42..1aeff50b4 100644 --- a/Space-Invaders/Source/Element/ElementService.cpp +++ b/Space-Invaders/Source/Element/ElementService.cpp @@ -1,4 +1,34 @@ +#include "../../header/Element/ElementService.h" + namespace Element { + ElementService::ElementService() { } + + ElementService::~ElementService() { destroy(); } + + void ElementService::initialize() + { + for (int i = 0; i < bunker_data_list.size(); i++) + { + Bunker::BunkerController* bunker_controller = new Bunker::BunkerController(); + + bunker_controller->initialize(bunker_data_list[i]); + bunker_list.push_back(bunker_controller); + } + } + + void ElementService::update() + { + for (int i = 0; i < bunker_list.size(); i++) bunker_list[i]->update(); + } + + void ElementService::render() + { + for (int i = 0; i < bunker_list.size(); i++) bunker_list[i]->render(); + } + void ElementService::destroy() + { + for (int i = 0; i < bunker_list.size(); i++) delete(bunker_list[i]); + } } \ No newline at end of file diff --git a/Space-Invaders/Source/Enemy/EnemyView.cpp b/Space-Invaders/Source/Enemy/EnemyView.cpp index e193c16fc..70e3cd142 100644 --- a/Space-Invaders/Source/Enemy/EnemyView.cpp +++ b/Space-Invaders/Source/Enemy/EnemyView.cpp @@ -3,6 +3,7 @@ #include "../../Header/Graphic/GraphicService.h" #include "../../Header/Enemy/EnemyController.h" #include"../../Header/Enemy/EnemyConfig.h" +#include "../../Header/Global/Config.h" namespace Enemy { @@ -25,14 +26,14 @@ namespace Enemy switch (type) { case::Enemy::EnemyType::SUBZERO: - if (enemy_texture.loadFromFile(subzero_texture_path)) + if (enemy_texture.loadFromFile(Config::subzero_texture_path)) { enemy_sprite.setTexture(enemy_texture); scaleEnemySprite(); } break; case::Enemy::EnemyType::ZAPPER: - if (enemy_texture.loadFromFile(zapper_texture_path)) + if (enemy_texture.loadFromFile(Config::zapper_texture_path)) { enemy_sprite.setTexture(enemy_texture); scaleEnemySprite(); diff --git a/Space-Invaders/Source/Gameplay/GameplayView.cpp b/Space-Invaders/Source/Gameplay/GameplayView.cpp index d7c276f92..48af47575 100644 --- a/Space-Invaders/Source/Gameplay/GameplayView.cpp +++ b/Space-Invaders/Source/Gameplay/GameplayView.cpp @@ -1,6 +1,7 @@ #include "../../header/Gameplay/GameplayView.h" #include "../../header/Global/ServiceLocator.h" #include "../../header/Graphic/GraphicService.h" +#include "../../Header/Global/Config.h" namespace Gameplay { @@ -19,7 +20,7 @@ namespace Gameplay void GameplayView::initializeBackgroundSprite() { - if (background_texture.loadFromFile(background_texture_path)) + if (background_texture.loadFromFile(Config::background_texture_path)) { background_sprite.setTexture(background_texture); scaleBackgroundSprite(); diff --git a/Space-Invaders/Source/Global/Config.cpp b/Space-Invaders/Source/Global/Config.cpp new file mode 100644 index 000000000..bc8151e53 --- /dev/null +++ b/Space-Invaders/Source/Global/Config.cpp @@ -0,0 +1,56 @@ +#include "../../header/Global/Config.h" + +namespace Global +{ + const sf::String Config::outscal_logo_texture_path = "assets/textures/outscal_logo.png"; + + const sf::String Config::background_texture_path = "assets/textures/space_invaders_bg.png"; + + const sf::String Config::player_texture_path = "assets/textures/player_ship.png"; + + + const sf::String Config::zapper_texture_path = "assets/textures/zapper.png"; + + const sf::String Config::thunder_snake_texture_path = "assets/textures/thunder_snake.png"; + + const sf::String Config::subzero_texture_path = "assets/textures/subzero.png"; + + const sf::String Config::ufo_texture_path = "assets/textures/ufo.png"; + + const sf::String Config::bunker_texture_path = "assets/textures/bunker.png"; + + + const sf::String Config::shield_texture_path = "assets/textures/shield.png"; + + const sf::String Config::tripple_laser_texture_path = "assets/textures/tripple_laser.png"; + + const sf::String Config::rapid_fire_texture_path = "assets/textures/rapid_fire.png"; + + const sf::String Config::outscal_bomb_texture_path = "assets/textures/outscal_bomb.png"; + + + const sf::String Config::laser_bullet_texture_path = "assets/textures/laser_bullet.png"; + + const sf::String Config::torpedoe_texture_path = "assets/textures/torpedoe.png"; + + const sf::String Config::frost_beam_texture_path = "assets/textures/frost_beam.png"; + + + const sf::String Config::play_button_texture_path = "assets/textures/play_button.png"; + + const sf::String Config::instructions_button_texture_path = "assets/textures/instructions_button.png"; + + const sf::String Config::quit_button_texture_path = "assets/textures/quit_button.png"; + + const sf::String Config::menu_button_texture_path = "assets/textures/menu_button.png"; + + + const sf::String Config::bubble_bobble_font_path = "assets/fonts/bubbleBobble.ttf"; + + const sf::String Config::DS_DIGIB_font_path = "assets/fonts/DS_DIGIB.ttf"; + + + const sf::String Config::background_music_path = "assets/sounds/background_music.mp3"; + + const sf::String Config::button_click_sound_path = "assets/sounds/button_click_sound.wav"; +} \ No newline at end of file diff --git a/Space-Invaders/Source/Global/ServiceLocator.cpp b/Space-Invaders/Source/Global/ServiceLocator.cpp index cb6237fd9..dbb31fa5f 100644 --- a/Space-Invaders/Source/Global/ServiceLocator.cpp +++ b/Space-Invaders/Source/Global/ServiceLocator.cpp @@ -70,6 +70,7 @@ namespace Global ui_service->initialize(); enemy_service->initialize(); gameplay_service->initialize(); + element_service->initialize(); } void ServiceLocator::update() @@ -83,6 +84,7 @@ namespace Global gameplay_service->update(); player_service->update(); enemy_service->update(); + element_service->update(); } ui_service->update(); @@ -97,6 +99,7 @@ namespace Global gameplay_service->render(); player_service->render(); enemy_service->render(); + element_service->render(); } ui_service->render(); @@ -110,7 +113,6 @@ namespace Global TimeService* ServiceLocator::getTimeService() { return time_service; } UIService* ServiceLocator::getUIService() { return ui_service; } EnemyService* ServiceLocator::getEnemyService() { return enemy_service; } - Gameplay::GameplayService* ServiceLocator::getGameplayService() { return gameplay_service; } - Element::ElementService* ServiceLocator::getElementService() { return element_service; } - + GameplayService* ServiceLocator::getGameplayService() { return gameplay_service; } + ElementService* ServiceLocator::getElementService() { return element_service; } } \ No newline at end of file diff --git a/Space-Invaders/Source/Player/PlayerView.cpp b/Space-Invaders/Source/Player/PlayerView.cpp index bab4189cc..96e287e72 100644 --- a/Space-Invaders/Source/Player/PlayerView.cpp +++ b/Space-Invaders/Source/Player/PlayerView.cpp @@ -1,5 +1,6 @@ #include "../../Header/Player/PlayerView.h" #include "../../Header/Global/ServiceLocator.h" +#include "../../Header/Global/Config.h" namespace Player { @@ -24,7 +25,7 @@ namespace Player void PlayerView::initializePlayerSprite() { - if (player_texture.loadFromFile(player_texture_path)) + if (player_texture.loadFromFile(Config::player_texture_path)) { player_sprite.setTexture(player_texture); scalePlayerSprite(); diff --git a/Space-Invaders/Source/UI/MainMenu/MainMenuUIController.cpp b/Space-Invaders/Source/UI/MainMenu/MainMenuUIController.cpp index 37b309a04..18a847f1a 100644 --- a/Space-Invaders/Source/UI/MainMenu/MainMenuUIController.cpp +++ b/Space-Invaders/Source/UI/MainMenu/MainMenuUIController.cpp @@ -3,6 +3,7 @@ #include "../../Header/Main/GameService.h" #include "../../Header/Global/ServiceLocator.h" #include "../../Header/Graphic/GraphicService.h" +#include "../../Header/Global/Config.h" namespace UI { @@ -24,7 +25,7 @@ namespace UI void MainMenuUIController::initializeBackgroundImage() { //check if a texture loaded properly - if (background_texture.loadFromFile(background_texture_path)) + if (background_texture.loadFromFile(Config::background_texture_path)) { //if it did then set the bg image and scale it background_sprite.setTexture(background_texture); scaleBackgroundImage(); @@ -53,9 +54,9 @@ namespace UI // only returns true if all tectures are loaded bool MainMenuUIController::loadButtonTexturesFromFile() { - return play_button_texture.loadFromFile(play_button_texture_path) && - instructions_button_texture.loadFromFile(instructions_button_texture_path) && - quit_button_texture.loadFromFile(quit_button_texture_path); + return play_button_texture.loadFromFile(Config::play_button_texture_path) && + instructions_button_texture.loadFromFile(Config::instructions_button_texture_path) && + quit_button_texture.loadFromFile(Config::quit_button_texture_path); } void MainMenuUIController::setButtonSprites() From b92bb2153fd9030d4d4210ef5af37d342a92368a Mon Sep 17 00:00:00 2001 From: Rishi Saxena Date: Wed, 7 Aug 2024 14:22:01 +0530 Subject: [PATCH 38/56] Added Sound Playback --- Space-Invaders/Header/Global/ServiceLocator.h | 3 ++ Space-Invaders/Header/Sound/SoundService.h | 29 +++++++++++ .../Source/Global/ServiceLocator.cpp | 6 +++ Space-Invaders/Source/Sound/SoundService.cpp | 50 +++++++++++++++++++ .../UI/MainMenu/MainMenuUIController.cpp | 5 ++ 5 files changed, 93 insertions(+) create mode 100644 Space-Invaders/Header/Sound/SoundService.h create mode 100644 Space-Invaders/Source/Sound/SoundService.cpp diff --git a/Space-Invaders/Header/Global/ServiceLocator.h b/Space-Invaders/Header/Global/ServiceLocator.h index cad6fff7a..95fc30f3e 100644 --- a/Space-Invaders/Header/Global/ServiceLocator.h +++ b/Space-Invaders/Header/Global/ServiceLocator.h @@ -7,6 +7,7 @@ #include "../../Header/Enemy/EnemyService.h" #include "../../Header/Gameplay/GameplayService.h" #include "../../Header/Element/ElementService.h" +#include "../../Header/Sound/SoundService.h" // ServiceLocator Class Summary: This class manages access to various services in the application. // include relevant headers files @@ -26,6 +27,7 @@ namespace Global Enemy::EnemyService* enemy_service; Gameplay::GameplayService* gameplay_service; Element::ElementService* element_service; + Sound::SoundService* sound_service; // Public Methods ServiceLocator(); @@ -52,5 +54,6 @@ namespace Global Enemy::EnemyService* getEnemyService(); // Retrive the EnemyService instance Gameplay::GameplayService* getGameplayService(); // Retrive the GameplayService instance Element::ElementService* getElementService(); // Retrive the ElementService instance + Sound::SoundService* getSoundService(); // Retrive the SoundService instance }; } \ No newline at end of file diff --git a/Space-Invaders/Header/Sound/SoundService.h b/Space-Invaders/Header/Sound/SoundService.h new file mode 100644 index 000000000..93b0dd509 --- /dev/null +++ b/Space-Invaders/Header/Sound/SoundService.h @@ -0,0 +1,29 @@ +#pragma once +#include "SFML/Audio.hpp" + +namespace Sound +{ + enum class SoundType + { + BUTTON_CLICK, + }; + + class SoundService + { + private: + const int background_music_volume = 30; + + sf::Music background_music; + sf::Sound sound_effect; + sf::SoundBuffer buffer_button_click; + + void loadBackgroundMusicFromFile(); + void loadSoundFromFile(); + + public: + void initialize(); + + void playSound(SoundType soundType); + void playBackgroundMusic(); + }; +} \ No newline at end of file diff --git a/Space-Invaders/Source/Global/ServiceLocator.cpp b/Space-Invaders/Source/Global/ServiceLocator.cpp index dbb31fa5f..8bed539b4 100644 --- a/Space-Invaders/Source/Global/ServiceLocator.cpp +++ b/Space-Invaders/Source/Global/ServiceLocator.cpp @@ -12,6 +12,7 @@ namespace Global using namespace Enemy; using namespace Gameplay; using namespace Element; + using namespace Sound; ServiceLocator::ServiceLocator() @@ -24,6 +25,7 @@ namespace Global enemy_service = nullptr; gameplay_service = nullptr; element_service = nullptr; + sound_service = nullptr; createServices(); } ServiceLocator::~ServiceLocator() @@ -41,6 +43,7 @@ namespace Global enemy_service = new EnemyService(); gameplay_service = new GameplayService(); element_service = new ElementService(); + sound_service = new SoundService(); } void ServiceLocator::clearAllServices() @@ -53,6 +56,7 @@ namespace Global delete(enemy_service); delete(gameplay_service); delete(element_service); + delete(sound_service); } ServiceLocator* ServiceLocator::getInstance() @@ -71,6 +75,7 @@ namespace Global enemy_service->initialize(); gameplay_service->initialize(); element_service->initialize(); + sound_service->initialize(); } void ServiceLocator::update() @@ -115,4 +120,5 @@ namespace Global EnemyService* ServiceLocator::getEnemyService() { return enemy_service; } GameplayService* ServiceLocator::getGameplayService() { return gameplay_service; } ElementService* ServiceLocator::getElementService() { return element_service; } + Sound::SoundService* ServiceLocator::getSoundService() { return sound_service; } } \ No newline at end of file diff --git a/Space-Invaders/Source/Sound/SoundService.cpp b/Space-Invaders/Source/Sound/SoundService.cpp new file mode 100644 index 000000000..2db4a00bd --- /dev/null +++ b/Space-Invaders/Source/Sound/SoundService.cpp @@ -0,0 +1,50 @@ +#include "../../header/Sound/SoundService.h" +#include "../../header/Global/Config.h" + +namespace Sound +{ + using namespace Global; + + void SoundService::initialize() + { + loadBackgroundMusicFromFile(); + loadSoundFromFile(); + } + + void SoundService::loadBackgroundMusicFromFile() + { + if (!background_music.openFromFile(Config::background_music_path)) + { + printf("Error loading background music file"); + } + } + + void SoundService::loadSoundFromFile() + { + if (!buffer_button_click.loadFromFile(Config::button_click_sound_path)) + { + printf("Error loading background music file"); + } + } + + void SoundService::playSound(SoundType soundType) + { + switch (soundType) + { + case SoundType::BUTTON_CLICK: + sound_effect.setBuffer(buffer_button_click); + break; + default: + printf("Invalid sound type"); + return; + } + sound_effect.play(); + } + + void SoundService::playBackgroundMusic() + { + background_music.setLoop(true); + background_music.setVolume(background_music_volume); + background_music.play(); + } +} \ No newline at end of file diff --git a/Space-Invaders/Source/UI/MainMenu/MainMenuUIController.cpp b/Space-Invaders/Source/UI/MainMenu/MainMenuUIController.cpp index 18a847f1a..4e2a876f6 100644 --- a/Space-Invaders/Source/UI/MainMenu/MainMenuUIController.cpp +++ b/Space-Invaders/Source/UI/MainMenu/MainMenuUIController.cpp @@ -13,6 +13,7 @@ namespace UI using namespace Main; using namespace Graphics; using namespace Event; + using namespace Sound; MainMenuUIController::MainMenuUIController() { game_window = nullptr; } @@ -97,6 +98,8 @@ namespace UI if (clickedButton(&play_button_sprite, mouse_position)) { + Global::ServiceLocator::getInstance()->getSoundService()->playSound(SoundType::BUTTON_CLICK); //play button sound + Global::ServiceLocator::getInstance()->getSoundService()->playBackgroundMusic(); //play background music GameService::setGameState(GameState::GAMEPLAY); } @@ -106,7 +109,9 @@ namespace UI } if (clickedButton(&quit_button_sprite, mouse_position)) + { game_window->close(); + } } bool MainMenuUIController::clickedButton(sf::Sprite* button_sprite, sf::Vector2f mouse_position) From 56f32a4b0a3727e61060e90b78abc775c4b7fecf Mon Sep 17 00:00:00 2001 From: Rishi Saxena Date: Thu, 8 Aug 2024 13:08:16 +0530 Subject: [PATCH 39/56] Added Bullet folder and interface --- Space-Invaders/Header/Bullet/BulletService.h | 17 +++++++++++++ .../Header/Projectile/IProjectile.h | 21 ++++++++++++++++ .../Source/Bullet/BulletService.cpp | 24 +++++++++++++++++++ 3 files changed, 62 insertions(+) create mode 100644 Space-Invaders/Header/Bullet/BulletService.h create mode 100644 Space-Invaders/Header/Projectile/IProjectile.h create mode 100644 Space-Invaders/Source/Bullet/BulletService.cpp diff --git a/Space-Invaders/Header/Bullet/BulletService.h b/Space-Invaders/Header/Bullet/BulletService.h new file mode 100644 index 000000000..cc9b730dd --- /dev/null +++ b/Space-Invaders/Header/Bullet/BulletService.h @@ -0,0 +1,17 @@ +#pragma once +namespace Bullet +{ + class BulletService + { + private: + + + public: + BulletService(); + ~BulletService(); + + void initialize(); + void update(); + void render(); + }; +} \ No newline at end of file diff --git a/Space-Invaders/Header/Projectile/IProjectile.h b/Space-Invaders/Header/Projectile/IProjectile.h new file mode 100644 index 000000000..770b0e973 --- /dev/null +++ b/Space-Invaders/Header/Projectile/IProjectile.h @@ -0,0 +1,21 @@ +#pragma once +#include +#include "../../Header/Bullet/BulletConfig.h" + +namespace Projectile +{ + enum class MovementDirection; + + class IProjectile + { + public: + virtual void initialize(sf::Vector2f position, Bullet::MovementDirection direction) = 0; + virtual void update() = 0; + virtual void render() = 0; + + virtual void updateProjectilePosition() = 0; + virtual sf::Vector2f getProjectilePosition() = 0; + + virtual ~IProjectile() {}; + }; +} diff --git a/Space-Invaders/Source/Bullet/BulletService.cpp b/Space-Invaders/Source/Bullet/BulletService.cpp new file mode 100644 index 000000000..f51b53e3c --- /dev/null +++ b/Space-Invaders/Source/Bullet/BulletService.cpp @@ -0,0 +1,24 @@ +#include "../../Header/Bullet/BulletService.h" + +namespace Bullet +{ + Bullet::BulletService::BulletService() + { + } + + Bullet::BulletService::~BulletService() + { + } + + void Bullet::BulletService::initialize() + { + } + + void Bullet::BulletService::update() + { + } + + void Bullet::BulletService::render() + { + } +} \ No newline at end of file From 37a6b316130b2331902f2203f5462bb8f2faf31d Mon Sep 17 00:00:00 2001 From: Rishi Saxena Date: Thu, 8 Aug 2024 15:24:44 +0530 Subject: [PATCH 40/56] FireBullet Added --- Space-Invaders/Header/Bullet/BulletConfig.h | 16 ++++ .../Header/Bullet/BulletController.h | 35 +++++++ Space-Invaders/Header/Bullet/BulletModel.h | 37 ++++++++ Space-Invaders/Header/Bullet/BulletService.h | 17 +++- Space-Invaders/Header/Bullet/BulletView.h | 33 +++++++ .../Controllers/FrostBulletController.h | 20 ++++ .../Controllers/LaserBulletController.h | 17 ++++ .../Bullet/Controllers/TorpedoController.h | 20 ++++ .../Enemy/Controllers/SubZeroController.h | 3 + .../Enemy/Controllers/ZapperController.h | 2 + Space-Invaders/Header/Enemy/EnemyController.h | 10 ++ Space-Invaders/Header/Enemy/EnemyModel.h | 1 + Space-Invaders/Header/Global/ServiceLocator.h | 5 + .../Header/Player/PlayerController.h | 2 + Space-Invaders/Header/Player/PlayerModel.h | 1 + .../Source/Bullet/BulletController.cpp | 92 +++++++++++++++++++ Space-Invaders/Source/Bullet/BulletModel.cpp | 57 ++++++++++++ .../Source/Bullet/BulletService.cpp | 49 +++++++++- Space-Invaders/Source/Bullet/BulletView.cpp | 67 ++++++++++++++ .../Controllers/FrostBulletController.cpp | 18 ++++ .../Controllers/LaserBulletController.cpp | 16 ++++ .../Bullet/Controllers/TorpedoController.cpp | 18 ++++ .../Enemy/Controllers/SubZeroController.cpp | 9 ++ .../Enemy/Controllers/ZapperController.cpp | 9 ++ .../Source/Enemy/EnemyController.cpp | 18 ++++ .../Source/Global/ServiceLocator.cpp | 16 +++- .../Source/Player/PlayerController.cpp | 15 ++- 27 files changed, 595 insertions(+), 8 deletions(-) create mode 100644 Space-Invaders/Header/Bullet/BulletConfig.h create mode 100644 Space-Invaders/Header/Bullet/BulletController.h create mode 100644 Space-Invaders/Header/Bullet/BulletModel.h create mode 100644 Space-Invaders/Header/Bullet/BulletView.h create mode 100644 Space-Invaders/Header/Bullet/Controllers/FrostBulletController.h create mode 100644 Space-Invaders/Header/Bullet/Controllers/LaserBulletController.h create mode 100644 Space-Invaders/Header/Bullet/Controllers/TorpedoController.h create mode 100644 Space-Invaders/Source/Bullet/BulletController.cpp create mode 100644 Space-Invaders/Source/Bullet/BulletModel.cpp create mode 100644 Space-Invaders/Source/Bullet/BulletView.cpp create mode 100644 Space-Invaders/Source/Bullet/Controllers/FrostBulletController.cpp create mode 100644 Space-Invaders/Source/Bullet/Controllers/LaserBulletController.cpp create mode 100644 Space-Invaders/Source/Bullet/Controllers/TorpedoController.cpp diff --git a/Space-Invaders/Header/Bullet/BulletConfig.h b/Space-Invaders/Header/Bullet/BulletConfig.h new file mode 100644 index 000000000..3d40244af --- /dev/null +++ b/Space-Invaders/Header/Bullet/BulletConfig.h @@ -0,0 +1,16 @@ +#pragma once +namespace Bullet +{ + enum class BulletType + { + LASER_BULLET, + TORPEDO, + FROST_BULLET, + }; + + enum class MovementDirection + { + UP, //player needs to shoot in upward direction + DOWN, // enemies always shoot in downward direction + }; +} \ No newline at end of file diff --git a/Space-Invaders/Header/Bullet/BulletController.h b/Space-Invaders/Header/Bullet/BulletController.h new file mode 100644 index 000000000..d8c97559b --- /dev/null +++ b/Space-Invaders/Header/Bullet/BulletController.h @@ -0,0 +1,35 @@ +#pragma once +#include "../../Header/Projectile/IProjectile.h" +#include "../../Header/Bullet/BulletConfig.h" + +namespace Bullet +{ + class BulletView; + class BulletModel; + enum class BulletType; + + class BulletController : public Projectile::IProjectile + { + protected: + + BulletView* bullet_view; + BulletModel* bullet_model; + + void updateProjectilePosition() override; + + void moveUp(); + void moveDown(); + void handleOutOfBounds(); + + public: + + BulletController(BulletType type); + virtual ~BulletController() override; + void initialize(sf::Vector2f position, Bullet::MovementDirection direction) override; + void update() override; + void render() override; + + sf::Vector2f getProjectilePosition() override; + BulletType getBulletType(); + }; +} \ No newline at end of file diff --git a/Space-Invaders/Header/Bullet/BulletModel.h b/Space-Invaders/Header/Bullet/BulletModel.h new file mode 100644 index 000000000..a6d9a45e2 --- /dev/null +++ b/Space-Invaders/Header/Bullet/BulletModel.h @@ -0,0 +1,37 @@ +#pragma once +#include + +namespace Bullet +{ + enum class BulletType; + enum class MovementDirection; + + class BulletModel + { + private: + float movement_speed = 300.f; + sf::Vector2f bullet_position; + + BulletType bullet_type; + MovementDirection movement_direction; + + public: + + BulletModel(BulletType type); + ~BulletModel(); + + void initialize(sf::Vector2f position, MovementDirection direction); + + sf::Vector2f getBulletPosition(); + void setBulletPosition(sf::Vector2f position); + + BulletType getBulletType(); + void setBulletType(BulletType type); + + MovementDirection getMovementDirection(); + void setMovementDirection(MovementDirection direction); + + float getMovementSpeed(); + void setMovementSpeed(float speed); + }; +} \ No newline at end of file diff --git a/Space-Invaders/Header/Bullet/BulletService.h b/Space-Invaders/Header/Bullet/BulletService.h index cc9b730dd..cc8939bb6 100644 --- a/Space-Invaders/Header/Bullet/BulletService.h +++ b/Space-Invaders/Header/Bullet/BulletService.h @@ -1,17 +1,32 @@ #pragma once +#include +#include "SFML/System/Vector2.hpp" +#include "../../Header/Projectile/IProjectile.h" + namespace Bullet { + class BulletController; + enum class BulletType; + enum class MovementDirection; + class BulletService { private: + std::vector bullet_list; + + BulletController* createBullet(BulletType bullet_type); + void destroy(); public: BulletService(); - ~BulletService(); + virtual ~BulletService(); void initialize(); void update(); void render(); + + BulletController* spawnBullet(BulletType bullet_type, sf::Vector2f position, MovementDirection direction); + void destroyBullet(BulletController* bullet_controller); }; } \ No newline at end of file diff --git a/Space-Invaders/Header/Bullet/BulletView.h b/Space-Invaders/Header/Bullet/BulletView.h new file mode 100644 index 000000000..bbe639119 --- /dev/null +++ b/Space-Invaders/Header/Bullet/BulletView.h @@ -0,0 +1,33 @@ +#pragma once +#include +#include "../../Header/Bullet/BulletController.h" + +namespace Bullet +{ + class BulletController; + enum class BulletType; + + class BulletView + { + private: + const float bullet_sprite_width = 18.f; + const float bullet_sprite_height = 18.f; + + sf::RenderWindow* game_window; + sf::Texture bullet_texture; + sf::Sprite bullet_sprite; + + BulletController* bullet_controller; + + void initializeImage(BulletType type); + void scaleImage(); + + public: + BulletView(); + ~BulletView(); + + void initialize(BulletController* controller); + void update(); + void render(); + }; +} \ No newline at end of file diff --git a/Space-Invaders/Header/Bullet/Controllers/FrostBulletController.h b/Space-Invaders/Header/Bullet/Controllers/FrostBulletController.h new file mode 100644 index 000000000..3188333d9 --- /dev/null +++ b/Space-Invaders/Header/Bullet/Controllers/FrostBulletController.h @@ -0,0 +1,20 @@ +#pragma once +#include "../../Header/Bullet/BulletController.h" + +namespace Bullet +{ + namespace Controller + { + class FrostBulletController : public BulletController + { + private: + const float torpedo_movement_speed = 500.f; + + public: + FrostBulletController(BulletType type); + ~FrostBulletController(); + + void initialize(sf::Vector2f position, MovementDirection direction) override; + }; + } +} \ No newline at end of file diff --git a/Space-Invaders/Header/Bullet/Controllers/LaserBulletController.h b/Space-Invaders/Header/Bullet/Controllers/LaserBulletController.h new file mode 100644 index 000000000..67a48b89f --- /dev/null +++ b/Space-Invaders/Header/Bullet/Controllers/LaserBulletController.h @@ -0,0 +1,17 @@ +#pragma once +#include "../../Header/Bullet/BulletController.h" + +namespace Bullet +{ + namespace Controller + { + class LaserBulletController : public BulletController + { + public: + LaserBulletController(BulletType type); + ~LaserBulletController(); + + void initialize(sf::Vector2f position, MovementDirection direction) override; + }; + } +} \ No newline at end of file diff --git a/Space-Invaders/Header/Bullet/Controllers/TorpedoController.h b/Space-Invaders/Header/Bullet/Controllers/TorpedoController.h new file mode 100644 index 000000000..99ac2d88a --- /dev/null +++ b/Space-Invaders/Header/Bullet/Controllers/TorpedoController.h @@ -0,0 +1,20 @@ +#pragma once +#include "../../Header/Bullet/BulletController.h" + +namespace Bullet +{ + namespace Controller + { + class TorpedoController : public BulletController + { + private: + const float torpedo_movement_speed = 200.f; + + public: + TorpedoController(BulletType type); + ~TorpedoController(); + + void initialize(sf::Vector2f position, MovementDirection direction) override; + }; + } +} \ No newline at end of file diff --git a/Space-Invaders/Header/Enemy/Controllers/SubZeroController.h b/Space-Invaders/Header/Enemy/Controllers/SubZeroController.h index 51600cb33..d27ae5a7f 100644 --- a/Space-Invaders/Header/Enemy/Controllers/SubZeroController.h +++ b/Space-Invaders/Header/Enemy/Controllers/SubZeroController.h @@ -11,10 +11,13 @@ namespace Enemy private: float vertical_movement_speed = 100.f; + const float subzero_rate_of_fire = 2.f; void move() override; void moveDown(); + void fireBullet() override; + public: SubzeroController(EnemyType type); diff --git a/Space-Invaders/Header/Enemy/Controllers/ZapperController.h b/Space-Invaders/Header/Enemy/Controllers/ZapperController.h index cade22a40..fc5a3b414 100644 --- a/Space-Invaders/Header/Enemy/Controllers/ZapperController.h +++ b/Space-Invaders/Header/Enemy/Controllers/ZapperController.h @@ -17,6 +17,8 @@ namespace Enemy void moveRight(); void moveDown(); + void fireBullet() override; + public: ZapperController(EnemyType type); diff --git a/Space-Invaders/Header/Enemy/EnemyController.h b/Space-Invaders/Header/Enemy/EnemyController.h index 30ce48675..7b2a2a3c0 100644 --- a/Space-Invaders/Header/Enemy/EnemyController.h +++ b/Space-Invaders/Header/Enemy/EnemyController.h @@ -14,9 +14,19 @@ namespace Enemy protected: + float vertical_movement_speed = 30.f; + float horizontal_movement_speed = 200.0f; + + float rate_of_fire = 3.f; //we want to fire the bullet every 3 seconds + float elapsed_fire_duration = 0.f; //variable to check how long it has been since we last fired + EnemyView* enemy_view; EnemyModel* enemy_model; + void updateFireTimer(); + void processBulletFire(); + virtual void fireBullet() = 0; + virtual void move() = 0; sf::Vector2f getRandomInitialPosition(); diff --git a/Space-Invaders/Header/Enemy/EnemyModel.h b/Space-Invaders/Header/Enemy/EnemyModel.h index f7a496405..57a4cdb4f 100644 --- a/Space-Invaders/Header/Enemy/EnemyModel.h +++ b/Space-Invaders/Header/Enemy/EnemyModel.h @@ -24,6 +24,7 @@ namespace Enemy //const settings for enemy const sf::Vector2f left_most_position = sf::Vector2f(50.f, 50.f); const sf::Vector2f right_most_position = sf::Vector2f(1800.f, 50.f); + const sf::Vector2f barrel_position_offset = sf::Vector2f(20.f, 50.f); const float vertical_travel_distance = 100.f; const float enemy_movement_speed = 250.0f; diff --git a/Space-Invaders/Header/Global/ServiceLocator.h b/Space-Invaders/Header/Global/ServiceLocator.h index 95fc30f3e..14f4faf36 100644 --- a/Space-Invaders/Header/Global/ServiceLocator.h +++ b/Space-Invaders/Header/Global/ServiceLocator.h @@ -8,6 +8,8 @@ #include "../../Header/Gameplay/GameplayService.h" #include "../../Header/Element/ElementService.h" #include "../../Header/Sound/SoundService.h" +#include "../../Header/Bullet/BulletService.h" + // ServiceLocator Class Summary: This class manages access to various services in the application. // include relevant headers files @@ -28,6 +30,7 @@ namespace Global Gameplay::GameplayService* gameplay_service; Element::ElementService* element_service; Sound::SoundService* sound_service; + Bullet::BulletService* bullet_service; // Public Methods ServiceLocator(); @@ -55,5 +58,7 @@ namespace Global Gameplay::GameplayService* getGameplayService(); // Retrive the GameplayService instance Element::ElementService* getElementService(); // Retrive the ElementService instance Sound::SoundService* getSoundService(); // Retrive the SoundService instance + Bullet::BulletService* getBulletService(); // Retrive the BulletService instance + void deleteServiceLocator(); }; } \ No newline at end of file diff --git a/Space-Invaders/Header/Player/PlayerController.h b/Space-Invaders/Header/Player/PlayerController.h index c3a12b538..09c3098fd 100644 --- a/Space-Invaders/Header/Player/PlayerController.h +++ b/Space-Invaders/Header/Player/PlayerController.h @@ -18,6 +18,8 @@ namespace Player void moveLeft(); void moveRight(); + void fireBullet(); + public: PlayerController(); ~PlayerController(); diff --git a/Space-Invaders/Header/Player/PlayerModel.h b/Space-Invaders/Header/Player/PlayerModel.h index 43e8ec35f..4cb5016dc 100644 --- a/Space-Invaders/Header/Player/PlayerModel.h +++ b/Space-Invaders/Header/Player/PlayerModel.h @@ -22,6 +22,7 @@ namespace Player public: const sf::Vector2f left_most_position = sf::Vector2f(50.f, 950.f); const sf::Vector2f right_most_position = sf::Vector2f(1800.f, 950.f); + const sf::Vector2f barrel_position_offset = sf::Vector2f(20.f, 50.f); const float player_movement_speed = 600.0f; diff --git a/Space-Invaders/Source/Bullet/BulletController.cpp b/Space-Invaders/Source/Bullet/BulletController.cpp new file mode 100644 index 000000000..d7f4f8500 --- /dev/null +++ b/Space-Invaders/Source/Bullet/BulletController.cpp @@ -0,0 +1,92 @@ +#include "../../Header/Bullet/BulletController.h" +#include "../../Header/Bullet/BulletView.h" +#include "../../Header/Bullet/BulletModel.h" +#include "../../Header/Bullet/BulletConfig.h" +#include "../../Header/Global/ServiceLocator.h" + +namespace Bullet +{ + using namespace Global; + + void Bullet::BulletController::updateProjectilePosition() + { + switch (bullet_model->getMovementDirection()) + { + case::Bullet::MovementDirection::UP: + moveUp(); + break; + + case::Bullet::MovementDirection::DOWN: + moveDown(); + break; + } + } + + void Bullet::BulletController::moveUp() + { + sf::Vector2f currentPosition = bullet_model->getBulletPosition(); + currentPosition.y -= bullet_model->getMovementSpeed() * ServiceLocator::getInstance()->getTimeService()->getDeltaTime(); + + bullet_model->setBulletPosition(currentPosition); + } + + void Bullet::BulletController::moveDown() + { + sf::Vector2f currentPosition = bullet_model->getBulletPosition(); + currentPosition.y += bullet_model->getMovementSpeed() * ServiceLocator::getInstance()->getTimeService()->getDeltaTime(); + + bullet_model->setBulletPosition(currentPosition); + } + + void Bullet::BulletController::handleOutOfBounds() + { + sf::Vector2f bulletPosition = getProjectilePosition(); + sf::Vector2u windowSize = ServiceLocator::getInstance()->getGraphicService()->getGameWindow()->getSize(); + + if (bulletPosition.x < 0 || bulletPosition.x > windowSize.x || + bulletPosition.y < 0 || bulletPosition.y > windowSize.y) + { + ServiceLocator::getInstance()->getBulletService()->destroyBullet(this); + } + } + + BulletController::BulletController(BulletType type) + { + bullet_view = new BulletView(); + bullet_model = new BulletModel(type); + } + + BulletController::~BulletController() + { + delete (bullet_view); + delete (bullet_model); + } + + void BulletController::initialize(sf::Vector2f position, Bullet::MovementDirection direction) + { + bullet_view->initialize(this); + bullet_model->initialize(position, direction); + } + + void BulletController::update() + { + updateProjectilePosition(); + bullet_view->update(); + handleOutOfBounds(); + } + + void BulletController::render() + { + bullet_view->render(); + } + + sf::Vector2f BulletController::getProjectilePosition() + { + return bullet_model->getBulletPosition(); + } + + BulletType BulletController::getBulletType() + { + return bullet_model->getBulletType(); + } +} diff --git a/Space-Invaders/Source/Bullet/BulletModel.cpp b/Space-Invaders/Source/Bullet/BulletModel.cpp new file mode 100644 index 000000000..ed80e5b04 --- /dev/null +++ b/Space-Invaders/Source/Bullet/BulletModel.cpp @@ -0,0 +1,57 @@ +#include "../../Header/Bullet/BulletModel.h" + +namespace Bullet +{ + BulletModel::BulletModel(BulletType type) + { + bullet_type = type; + } + + BulletModel::~BulletModel() { } + + void BulletModel::initialize(sf::Vector2f position, MovementDirection direction) + { + movement_direction = direction; + bullet_position = position; + } + + sf::Vector2f BulletModel::getBulletPosition() + { + return bullet_position; + } + + void BulletModel::setBulletPosition(sf::Vector2f position) + { + bullet_position = position; + } + + BulletType BulletModel::getBulletType() + { + return bullet_type; + } + + void BulletModel::setBulletType(BulletType type) + { + bullet_type = type; + } + + MovementDirection BulletModel::getMovementDirection() + { + return movement_direction; + } + + void BulletModel::setMovementDirection(MovementDirection direction) + { + movement_direction = direction; + } + + float BulletModel::getMovementSpeed() + { + return movement_speed; + } + + void BulletModel::setMovementSpeed(float speed) + { + movement_speed = speed; + } +} \ No newline at end of file diff --git a/Space-Invaders/Source/Bullet/BulletService.cpp b/Space-Invaders/Source/Bullet/BulletService.cpp index f51b53e3c..897d61a83 100644 --- a/Space-Invaders/Source/Bullet/BulletService.cpp +++ b/Space-Invaders/Source/Bullet/BulletService.cpp @@ -1,24 +1,63 @@ #include "../../Header/Bullet/BulletService.h" +#include "../../Header/Bullet/BulletController.h" +#include "../../Header/Bullet/BulletConfig.h" +#include "../../Header/Bullet/Controllers/FrostBulletController.h" +#include "../../Header/Bullet/Controllers/LaserBulletController.h" +#include "../../Header/Bullet/Controllers/TorpedoController.h" namespace Bullet { - Bullet::BulletService::BulletService() + using namespace Controller; + using namespace Projectile; + + BulletService::BulletService() { } + + BulletService::~BulletService() { destroy(); } + + void BulletService::initialize() { } + + void BulletService::update() + { + for (int i = 0; i < bullet_list.size(); i++) bullet_list[i]->update(); + } + + void BulletService::render() { + for (int i = 0; i < bullet_list.size(); i++) bullet_list[i]->render(); } - Bullet::BulletService::~BulletService() + BulletController* BulletService::createBullet(BulletType bullet_type) { + switch (bullet_type) + { + case::Bullet::BulletType::LASER_BULLET: + return new LaserBulletController(Bullet::BulletType::LASER_BULLET); + + case::Bullet::BulletType::FROST_BULLET: + return new FrostBulletController(Bullet::BulletType::FROST_BULLET); + + case::Bullet::BulletType::TORPEDO: + return new TorpedoController(Bullet::BulletType::TORPEDO); + } } - void Bullet::BulletService::initialize() + void BulletService::destroy() { + for (int i = 0; i < bullet_list.size(); i++) delete (bullet_list[i]); } - void Bullet::BulletService::update() + BulletController* BulletService::spawnBullet(BulletType bullet_type, sf::Vector2f position, MovementDirection direction) { + BulletController* bullet_controller = createBullet(bullet_type); + + bullet_controller->initialize(position, direction); + bullet_list.push_back(bullet_controller); + return bullet_controller; } - void Bullet::BulletService::render() + void BulletService::destroyBullet(BulletController* bullet_controller) { + bullet_list.erase(std::remove(bullet_list.begin(), bullet_list.end(), bullet_controller), bullet_list.end()); + delete(bullet_controller); } } \ No newline at end of file diff --git a/Space-Invaders/Source/Bullet/BulletView.cpp b/Space-Invaders/Source/Bullet/BulletView.cpp new file mode 100644 index 000000000..4d50a07dd --- /dev/null +++ b/Space-Invaders/Source/Bullet/BulletView.cpp @@ -0,0 +1,67 @@ +#include "../../Header/Bullet/BulletView.h" +#include "../../Header/Bullet/BulletController.h" +#include "../../Header/Global/ServiceLocator.h" +#include "../../Header/Global/Config.h" +#include "../../Header/Bullet/BulletConfig.h" + +namespace Bullet +{ + using namespace Global; + + BulletView::BulletView() { } + + BulletView::~BulletView() { } + + void BulletView::initialize(BulletController* controller) + { + bullet_controller = controller; + game_window = ServiceLocator::getInstance()->getGraphicService()->getGameWindow(); + initializeImage(bullet_controller->getBulletType()); + } + + void BulletView::initializeImage(BulletType type) + { + switch (type) + { + case::Bullet::BulletType::LASER_BULLET: + if (bullet_texture.loadFromFile(Config::laser_bullet_texture_path)) + { + bullet_sprite.setTexture(bullet_texture); + scaleImage(); + } + break; + case::Bullet::BulletType::FROST_BULLET: + if (bullet_texture.loadFromFile(Config::frost_beam_texture_path)) + { + bullet_sprite.setTexture(bullet_texture); + scaleImage(); + } + break; + case::Bullet::BulletType::TORPEDO: + if (bullet_texture.loadFromFile(Config::torpedoe_texture_path)) + { + bullet_sprite.setTexture(bullet_texture); + scaleImage(); + } + break; + } + } + + void BulletView::scaleImage() + { + bullet_sprite.setScale( + static_cast(bullet_sprite_width) / bullet_sprite.getTexture()->getSize().x, + static_cast(bullet_sprite_height) / bullet_sprite.getTexture()->getSize().y + ); + } + + void BulletView::update() + { + bullet_sprite.setPosition(bullet_controller->getProjectilePosition()); + } + + void BulletView::render() + { + game_window->draw(bullet_sprite); + } +} diff --git a/Space-Invaders/Source/Bullet/Controllers/FrostBulletController.cpp b/Space-Invaders/Source/Bullet/Controllers/FrostBulletController.cpp new file mode 100644 index 000000000..3cd929822 --- /dev/null +++ b/Space-Invaders/Source/Bullet/Controllers/FrostBulletController.cpp @@ -0,0 +1,18 @@ +#include "../../Header/Bullet/Controllers/FrostBulletController.h" +#include "../../Header/Bullet/BulletModel.h" + +namespace Bullet +{ + namespace Controller + { + FrostBulletController::FrostBulletController(BulletType type) : BulletController(type) { } + + FrostBulletController::~FrostBulletController() { } + + void FrostBulletController::initialize(sf::Vector2f position, MovementDirection direction) + { + BulletController::initialize(position, direction); + bullet_model->setMovementSpeed(torpedo_movement_speed); + } + } +} \ No newline at end of file diff --git a/Space-Invaders/Source/Bullet/Controllers/LaserBulletController.cpp b/Space-Invaders/Source/Bullet/Controllers/LaserBulletController.cpp new file mode 100644 index 000000000..170970514 --- /dev/null +++ b/Space-Invaders/Source/Bullet/Controllers/LaserBulletController.cpp @@ -0,0 +1,16 @@ +#include "../../Header/Bullet/Controllers/LaserBulletController.h" + +namespace Bullet +{ + namespace Controller + { + LaserBulletController::LaserBulletController(BulletType type) : BulletController(type) { } + + LaserBulletController::~LaserBulletController() { } + + void LaserBulletController::initialize(sf::Vector2f position, MovementDirection direction) + { + BulletController::initialize(position, direction); + } + } +} \ No newline at end of file diff --git a/Space-Invaders/Source/Bullet/Controllers/TorpedoController.cpp b/Space-Invaders/Source/Bullet/Controllers/TorpedoController.cpp new file mode 100644 index 000000000..712702699 --- /dev/null +++ b/Space-Invaders/Source/Bullet/Controllers/TorpedoController.cpp @@ -0,0 +1,18 @@ +#include "../../Header/Bullet/Controllers/TorpedoController.h" +#include "../../Header/Bullet/BulletModel.h" + +namespace Bullet +{ + namespace Controller + { + TorpedoController::TorpedoController(BulletType type) : BulletController(type) { } + + TorpedoController::~TorpedoController() { } + + void TorpedoController::initialize(sf::Vector2f position, MovementDirection direction) + { + BulletController::initialize(position, direction); + bullet_model->setMovementSpeed(torpedo_movement_speed); + } + } +} \ No newline at end of file diff --git a/Space-Invaders/Source/Enemy/Controllers/SubZeroController.cpp b/Space-Invaders/Source/Enemy/Controllers/SubZeroController.cpp index 3b212f84c..5c6fbcd0e 100644 --- a/Space-Invaders/Source/Enemy/Controllers/SubZeroController.cpp +++ b/Space-Invaders/Source/Enemy/Controllers/SubZeroController.cpp @@ -6,6 +6,7 @@ namespace Enemy { using namespace Global; + using namespace Bullet; namespace Controller { @@ -17,6 +18,7 @@ namespace Enemy { EnemyController::initialize(); enemy_model->setMovementDirection(MovementDirection::DOWN); + rate_of_fire = subzero_rate_of_fire; } void SubzeroController::move() @@ -36,5 +38,12 @@ namespace Enemy enemy_model->setEnemyPosition(currentPosition); } + + void SubzeroController::fireBullet() + { + ServiceLocator::getInstance()->getBulletService()->spawnBullet(BulletType::FROST_BULLET, + enemy_model->getEnemyPosition() + enemy_model->barrel_position_offset, + Bullet::MovementDirection::DOWN); + } } } \ No newline at end of file diff --git a/Space-Invaders/Source/Enemy/Controllers/ZapperController.cpp b/Space-Invaders/Source/Enemy/Controllers/ZapperController.cpp index ed5dccdf7..baa90a730 100644 --- a/Space-Invaders/Source/Enemy/Controllers/ZapperController.cpp +++ b/Space-Invaders/Source/Enemy/Controllers/ZapperController.cpp @@ -2,10 +2,12 @@ #include "../../Header/Enemy/EnemyModel.h" #include "../../Header/Enemy/EnemyConfig.h" #include "../../Header/Global/ServiceLocator.h" +#include "../../Header/Bullet/BulletConfig.h" namespace Enemy { using namespace Global; + using namespace Bullet; namespace Controller { @@ -113,5 +115,12 @@ namespace Enemy enemy_model->setEnemyPosition(currentPosition); } } + + void ZapperController::fireBullet() + { + ServiceLocator::getInstance()->getBulletService()->spawnBullet(BulletType::LASER_BULLET, + enemy_model->getEnemyPosition() + enemy_model->barrel_position_offset, + Bullet::MovementDirection::DOWN); + } } } \ No newline at end of file diff --git a/Space-Invaders/Source/Enemy/EnemyController.cpp b/Space-Invaders/Source/Enemy/EnemyController.cpp index af2cbcd3f..b89da8838 100644 --- a/Space-Invaders/Source/Enemy/EnemyController.cpp +++ b/Space-Invaders/Source/Enemy/EnemyController.cpp @@ -9,6 +9,7 @@ namespace Enemy using namespace Global; using namespace Event; using namespace Time; + using namespace Bullet; EnemyController::EnemyController(EnemyType type) { @@ -32,7 +33,10 @@ namespace Enemy void EnemyController::update() { move(); + updateFireTimer(); //new + processBulletFire(); //new enemy_view->update(); + handleOutOfBounds(); } void EnemyController::render() @@ -58,6 +62,20 @@ namespace Enemy } }*/ + void EnemyController::updateFireTimer() + { + elapsed_fire_duration += ServiceLocator::getInstance()->getTimeService()->getDeltaTime(); //update the elapsed duration + } + + void EnemyController::processBulletFire() //if elapsed duration is equal to or more than the amount of time we want to wait until firing than call the fire method. + { + if (elapsed_fire_duration >= rate_of_fire) + { + fireBullet(); + elapsed_fire_duration = 0.f; //set elapsed duration back to 0. + } + } + sf::Vector2f EnemyController::getRandomInitialPosition() { float x_offset_distance = (std::rand() % static_cast(enemy_model->right_most_position.x - enemy_model->left_most_position.x)); diff --git a/Space-Invaders/Source/Global/ServiceLocator.cpp b/Space-Invaders/Source/Global/ServiceLocator.cpp index 8bed539b4..e6cd7d7d9 100644 --- a/Space-Invaders/Source/Global/ServiceLocator.cpp +++ b/Space-Invaders/Source/Global/ServiceLocator.cpp @@ -13,6 +13,7 @@ namespace Global using namespace Gameplay; using namespace Element; using namespace Sound; + using namespace Bullet; ServiceLocator::ServiceLocator() @@ -26,6 +27,7 @@ namespace Global gameplay_service = nullptr; element_service = nullptr; sound_service = nullptr; + bullet_service = nullptr; createServices(); } ServiceLocator::~ServiceLocator() @@ -44,6 +46,7 @@ namespace Global gameplay_service = new GameplayService(); element_service = new ElementService(); sound_service = new SoundService(); + bullet_service = new BulletService(); } void ServiceLocator::clearAllServices() @@ -57,6 +60,7 @@ namespace Global delete(gameplay_service); delete(element_service); delete(sound_service); + delete(bullet_service); } ServiceLocator* ServiceLocator::getInstance() @@ -76,6 +80,7 @@ namespace Global gameplay_service->initialize(); element_service->initialize(); sound_service->initialize(); + bullet_service->initialize(); } void ServiceLocator::update() @@ -89,6 +94,7 @@ namespace Global gameplay_service->update(); player_service->update(); enemy_service->update(); + bullet_service->update(); element_service->update(); } @@ -104,6 +110,7 @@ namespace Global gameplay_service->render(); player_service->render(); enemy_service->render(); + bullet_service->render(); element_service->render(); } @@ -120,5 +127,12 @@ namespace Global EnemyService* ServiceLocator::getEnemyService() { return enemy_service; } GameplayService* ServiceLocator::getGameplayService() { return gameplay_service; } ElementService* ServiceLocator::getElementService() { return element_service; } - Sound::SoundService* ServiceLocator::getSoundService() { return sound_service; } + SoundService* ServiceLocator::getSoundService() { return sound_service; } + BulletService* ServiceLocator::getBulletService() { return bullet_service; } + + void ServiceLocator::deleteServiceLocator() + { + delete(this); + } + } \ No newline at end of file diff --git a/Space-Invaders/Source/Player/PlayerController.cpp b/Space-Invaders/Source/Player/PlayerController.cpp index d84805283..49ac671f9 100644 --- a/Space-Invaders/Source/Player/PlayerController.cpp +++ b/Space-Invaders/Source/Player/PlayerController.cpp @@ -10,6 +10,7 @@ namespace Player using namespace Global; using namespace Event; using namespace Time; + using namespace Bullet; PlayerController::PlayerController() { @@ -61,7 +62,12 @@ namespace Player { moveRight(); } - } + + if (event_service->pressedLeftMouseButton()) + { + fireBullet(); + } + } void PlayerController::moveLeft() { @@ -80,4 +86,11 @@ namespace Player currentPosition.x = std::min(currentPosition.x, player_model->right_most_position.x); player_model->setPlayerPosition(currentPosition); } + + void PlayerController::fireBullet() + { + ServiceLocator::getInstance()->getBulletService()->spawnBullet(BulletType::LASER_BULLET, + player_model->getPlayerPosition() + player_model->barrel_position_offset, + Bullet::MovementDirection::UP); + } } \ No newline at end of file From 547651cf98e0f20e315de144598d7e5f43277723 Mon Sep 17 00:00:00 2001 From: Rishi Saxena Date: Fri, 9 Aug 2024 13:12:45 +0530 Subject: [PATCH 41/56] Added ICollectible --- .../Header/Collectible/ICollectible.h | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 Space-Invaders/Header/Collectible/ICollectible.h diff --git a/Space-Invaders/Header/Collectible/ICollectible.h b/Space-Invaders/Header/Collectible/ICollectible.h new file mode 100644 index 000000000..d1405aa13 --- /dev/null +++ b/Space-Invaders/Header/Collectible/ICollectible.h @@ -0,0 +1,17 @@ +#pragma once +#include + +namespace Collectible +{ + class ICollectible + { + public: + virtual void onCollected() = 0; + virtual void initialize(sf::Vector2f position) = 0; + virtual void update() = 0; + virtual void render() = 0; + virtual sf::Vector2f getCollectiblePosition() = 0; + + virtual ~ICollectible() {}; + }; +} From d9a333694fa551fee2974fb5d21c316d4c797563 Mon Sep 17 00:00:00 2001 From: Rishi Saxena Date: Sat, 10 Aug 2024 13:14:22 +0530 Subject: [PATCH 42/56] Added UFO and other thunder snake --- .../Controllers/ThunderSnakeController.h | 31 +++++ .../Header/Enemy/Controllers/UFOController.h | 27 ++++ Space-Invaders/Header/Enemy/EnemyConfig.h | 6 +- Space-Invaders/Header/Enemy/EnemyModel.h | 3 + Space-Invaders/Header/Global/ServiceLocator.h | 3 + .../Controllers/OutscalBombController.h | 17 +++ .../Controllers/RapidFireController.h | 17 +++ .../Powerups/Controllers/ShieldController.h | 17 +++ .../Controllers/TrippleLaserController.h | 17 +++ .../Header/Powerups/PowerupConfig.h | 11 ++ .../Header/Powerups/PowerupController.h | 33 +++++ Space-Invaders/Header/Powerups/PowerupModel.h | 31 +++++ .../Header/Powerups/PowerupService.h | 32 +++++ Space-Invaders/Header/Powerups/PowerupView.h | 34 +++++ .../Controllers/ThunderSnakeController.cpp | 121 ++++++++++++++++++ .../Enemy/Controllers/UFOController.cpp | 79 ++++++++++++ Space-Invaders/Source/Enemy/EnemyService.cpp | 12 +- Space-Invaders/Source/Enemy/EnemyView.cpp | 14 ++ .../Source/Global/ServiceLocator.cpp | 8 ++ .../Controllers/OutscalBombController.cpp | 13 ++ .../Controllers/RapidFireController.cpp | 13 ++ .../Powerups/Controllers/ShieldController.cpp | 13 ++ .../Controllers/TrippleLaserController.h.cpp | 13 ++ .../Source/Powerups/PowerupController.cpp | 72 +++++++++++ .../Source/Powerups/PowerupModel.cpp | 46 +++++++ .../Source/Powerups/PowerupService.cpp | 69 ++++++++++ .../Source/Powerups/PowerupView.cpp | 75 +++++++++++ 27 files changed, 820 insertions(+), 7 deletions(-) create mode 100644 Space-Invaders/Header/Enemy/Controllers/ThunderSnakeController.h create mode 100644 Space-Invaders/Header/Enemy/Controllers/UFOController.h create mode 100644 Space-Invaders/Header/Powerups/Controllers/OutscalBombController.h create mode 100644 Space-Invaders/Header/Powerups/Controllers/RapidFireController.h create mode 100644 Space-Invaders/Header/Powerups/Controllers/ShieldController.h create mode 100644 Space-Invaders/Header/Powerups/Controllers/TrippleLaserController.h create mode 100644 Space-Invaders/Header/Powerups/PowerupConfig.h create mode 100644 Space-Invaders/Header/Powerups/PowerupController.h create mode 100644 Space-Invaders/Header/Powerups/PowerupModel.h create mode 100644 Space-Invaders/Header/Powerups/PowerupService.h create mode 100644 Space-Invaders/Header/Powerups/PowerupView.h create mode 100644 Space-Invaders/Source/Enemy/Controllers/ThunderSnakeController.cpp create mode 100644 Space-Invaders/Source/Enemy/Controllers/UFOController.cpp create mode 100644 Space-Invaders/Source/Powerups/Controllers/OutscalBombController.cpp create mode 100644 Space-Invaders/Source/Powerups/Controllers/RapidFireController.cpp create mode 100644 Space-Invaders/Source/Powerups/Controllers/ShieldController.cpp create mode 100644 Space-Invaders/Source/Powerups/Controllers/TrippleLaserController.h.cpp create mode 100644 Space-Invaders/Source/Powerups/PowerupController.cpp create mode 100644 Space-Invaders/Source/Powerups/PowerupModel.cpp create mode 100644 Space-Invaders/Source/Powerups/PowerupService.cpp create mode 100644 Space-Invaders/Source/Powerups/PowerupView.cpp diff --git a/Space-Invaders/Header/Enemy/Controllers/ThunderSnakeController.h b/Space-Invaders/Header/Enemy/Controllers/ThunderSnakeController.h new file mode 100644 index 000000000..77211e9ef --- /dev/null +++ b/Space-Invaders/Header/Enemy/Controllers/ThunderSnakeController.h @@ -0,0 +1,31 @@ +#pragma once +#include "../../Header/Enemy/EnemyController.h" +#include "../../Header/Enemy/EnemyConfig.h" + +namespace Enemy +{ + namespace Controller + { + class ThunderSnakeController : public EnemyController + { + private: + const float thunder_snake_horizontal_movement_speed = 190.f; + + void move() override; + void moveLeft(); + void moveRight(); + void moveDiagonalLeft(); + void moveDiagonalRight(); + + void fireBullet() override; + + MovementDirection getInitialMovementDirection(); + + public: + ThunderSnakeController(EnemyType type); + ~ThunderSnakeController(); + + void initialize() override; + }; + } +} \ No newline at end of file diff --git a/Space-Invaders/Header/Enemy/Controllers/UFOController.h b/Space-Invaders/Header/Enemy/Controllers/UFOController.h new file mode 100644 index 000000000..c11dc5e03 --- /dev/null +++ b/Space-Invaders/Header/Enemy/Controllers/UFOController.h @@ -0,0 +1,27 @@ +#pragma once +#include "../../header/Enemy/EnemyController.h" +#include "../../header/Powerups/PowerupConfig.h" + +namespace Enemy +{ + namespace Controller + { + class UFOController : public EnemyController + { + private: + + void move() override; + void moveLeft(); + void moveRight(); + + void fireBullet() override; + Powerup::PowerupType getRandomPowerupType(); + + public: + UFOController(EnemyType type); + ~UFOController(); + + void initialize() override; + }; + } +} \ No newline at end of file diff --git a/Space-Invaders/Header/Enemy/EnemyConfig.h b/Space-Invaders/Header/Enemy/EnemyConfig.h index 0c54f1ba5..81fa1b4d5 100644 --- a/Space-Invaders/Header/Enemy/EnemyConfig.h +++ b/Space-Invaders/Header/Enemy/EnemyConfig.h @@ -6,8 +6,8 @@ namespace Enemy { ZAPPER, SUBZERO, - //UFO, - //THUNDER_SNAKE, + THUNDER_SNAKE, + UFO, }; enum class EnemyState @@ -22,5 +22,7 @@ namespace Enemy LEFT, RIGHT, DOWN, + LEFT_DOWN, + RIGHT_DOWN, }; } \ No newline at end of file diff --git a/Space-Invaders/Header/Enemy/EnemyModel.h b/Space-Invaders/Header/Enemy/EnemyModel.h index 57a4cdb4f..080cd9e83 100644 --- a/Space-Invaders/Header/Enemy/EnemyModel.h +++ b/Space-Invaders/Header/Enemy/EnemyModel.h @@ -29,6 +29,9 @@ namespace Enemy const float vertical_travel_distance = 100.f; const float enemy_movement_speed = 250.0f; + float vertical_movement_speed = 30.0f; + float horizontal_movement_speed = 100.0f; + void initialize(); // Getters and Setters diff --git a/Space-Invaders/Header/Global/ServiceLocator.h b/Space-Invaders/Header/Global/ServiceLocator.h index 14f4faf36..ba6b11743 100644 --- a/Space-Invaders/Header/Global/ServiceLocator.h +++ b/Space-Invaders/Header/Global/ServiceLocator.h @@ -9,6 +9,7 @@ #include "../../Header/Element/ElementService.h" #include "../../Header/Sound/SoundService.h" #include "../../Header/Bullet/BulletService.h" +#include "../../Header/Powerups/PowerupService.h" // ServiceLocator Class Summary: This class manages access to various services in the application. @@ -31,6 +32,7 @@ namespace Global Element::ElementService* element_service; Sound::SoundService* sound_service; Bullet::BulletService* bullet_service; + Powerup::PowerupService* powerup_service; // Public Methods ServiceLocator(); @@ -59,6 +61,7 @@ namespace Global Element::ElementService* getElementService(); // Retrive the ElementService instance Sound::SoundService* getSoundService(); // Retrive the SoundService instance Bullet::BulletService* getBulletService(); // Retrive the BulletService instance + Powerup::PowerupService* getPowerupService(); // Retrive the PowerupService instance void deleteServiceLocator(); }; } \ No newline at end of file diff --git a/Space-Invaders/Header/Powerups/Controllers/OutscalBombController.h b/Space-Invaders/Header/Powerups/Controllers/OutscalBombController.h new file mode 100644 index 000000000..a4b344127 --- /dev/null +++ b/Space-Invaders/Header/Powerups/Controllers/OutscalBombController.h @@ -0,0 +1,17 @@ +#pragma once +#include "../../Header/Powerups/PowerupController.h" + +namespace Powerup +{ + namespace Controller + { + class OutscalBombController : public PowerupController + { + public: + OutscalBombController(PowerupType type); + virtual ~OutscalBombController(); + + void onCollected() override; + }; + } +} \ No newline at end of file diff --git a/Space-Invaders/Header/Powerups/Controllers/RapidFireController.h b/Space-Invaders/Header/Powerups/Controllers/RapidFireController.h new file mode 100644 index 000000000..2661e3569 --- /dev/null +++ b/Space-Invaders/Header/Powerups/Controllers/RapidFireController.h @@ -0,0 +1,17 @@ +#pragma once +#include "../../Header/Powerups/PowerupController.h" + +namespace Powerup +{ + namespace Controller + { + class RapidFireController : public PowerupController + { + public: + RapidFireController(PowerupType type); + virtual ~RapidFireController(); + + void onCollected() override; + }; + } +} \ No newline at end of file diff --git a/Space-Invaders/Header/Powerups/Controllers/ShieldController.h b/Space-Invaders/Header/Powerups/Controllers/ShieldController.h new file mode 100644 index 000000000..7c9064149 --- /dev/null +++ b/Space-Invaders/Header/Powerups/Controllers/ShieldController.h @@ -0,0 +1,17 @@ +#pragma once +#include "../../Header/Powerups/PowerupController.h" + +namespace Powerup +{ + namespace Controller + { + class ShieldController : public PowerupController + { + public: + ShieldController(PowerupType type); + virtual ~ShieldController(); + + void onCollected() override; + }; + } +} \ No newline at end of file diff --git a/Space-Invaders/Header/Powerups/Controllers/TrippleLaserController.h b/Space-Invaders/Header/Powerups/Controllers/TrippleLaserController.h new file mode 100644 index 000000000..e343116a7 --- /dev/null +++ b/Space-Invaders/Header/Powerups/Controllers/TrippleLaserController.h @@ -0,0 +1,17 @@ +#pragma once +#include "../../Header/Powerups/PowerupController.h" + +namespace Powerup +{ + namespace Controller + { + class TrippleLaserController : public PowerupController + { + public: + TrippleLaserController(PowerupType type); + virtual ~TrippleLaserController(); + + void onCollected() override; + }; + } +} \ No newline at end of file diff --git a/Space-Invaders/Header/Powerups/PowerupConfig.h b/Space-Invaders/Header/Powerups/PowerupConfig.h new file mode 100644 index 000000000..2a11ef64f --- /dev/null +++ b/Space-Invaders/Header/Powerups/PowerupConfig.h @@ -0,0 +1,11 @@ +#pragma once +namespace Powerup +{ + enum class PowerupType + { + SHIELD, + RAPID_FIRE, + TRIPPLE_LASER, + OUTSCAL_BOMB, // later redacted + }; +} \ No newline at end of file diff --git a/Space-Invaders/Header/Powerups/PowerupController.h b/Space-Invaders/Header/Powerups/PowerupController.h new file mode 100644 index 000000000..fcbea0a3e --- /dev/null +++ b/Space-Invaders/Header/Powerups/PowerupController.h @@ -0,0 +1,33 @@ +#pragma once +#include "../../header/Collectible/ICollectible.h" + +namespace Powerup +{ + class PowerupView; + class PowerupModel; + + enum class PowerupType; + + class PowerupController : public Collectible::ICollectible + { + protected: + PowerupView* powerup_view; + PowerupModel* powerup_model; + + void updatePowerupPosition(); + void handleOutOfBounds(); + + public: + PowerupController(PowerupType type); + virtual ~PowerupController(); + + void initialize(sf::Vector2f position) override; + void update() override; + void render() override; + + void onCollected() override; + + sf::Vector2f getCollectiblePosition() override; + PowerupType getPowerupType(); + }; +} diff --git a/Space-Invaders/Header/Powerups/PowerupModel.h b/Space-Invaders/Header/Powerups/PowerupModel.h new file mode 100644 index 000000000..104f227ee --- /dev/null +++ b/Space-Invaders/Header/Powerups/PowerupModel.h @@ -0,0 +1,31 @@ +#pragma once +#include + +namespace Powerup +{ + enum class PowerupType; + + class PowerupModel + { + private: + float movement_speed = 300.f; + + sf::Vector2f powerup_position; + PowerupType powerup_type; + + public: + PowerupModel(PowerupType type); + ~PowerupModel(); + + void initialize(sf::Vector2f position); + + sf::Vector2f getPowerupPosition(); + void setPowerupPosition(sf::Vector2f position); + + PowerupType getPowerupType(); + void setPowerupType(PowerupType type); + + float getMovementSpeed(); + void setMovementSpeed(float speed); + }; +} \ No newline at end of file diff --git a/Space-Invaders/Header/Powerups/PowerupService.h b/Space-Invaders/Header/Powerups/PowerupService.h new file mode 100644 index 000000000..908ce8e57 --- /dev/null +++ b/Space-Invaders/Header/Powerups/PowerupService.h @@ -0,0 +1,32 @@ +#pragma once +#include +#include "SFML/System/Vector2.hpp" +#include "../../Header/Collectible/ICollectible.h" + +namespace Powerup +{ + + class PowerupController; + enum class PowerupType; + + class PowerupService + { + private: + std::vector powerup_list; + + PowerupController* createPowerup(PowerupType powerup_type); + void destroy(); + + public: + PowerupService(); + virtual ~PowerupService(); + + void initialize(); + void update(); + void render(); + + + PowerupController* spawnPowerup(PowerupType powerup_type, sf::Vector2f position); + void destroyPowerup(PowerupController* powerup_controller); + }; +} \ No newline at end of file diff --git a/Space-Invaders/Header/Powerups/PowerupView.h b/Space-Invaders/Header/Powerups/PowerupView.h new file mode 100644 index 000000000..47b6689ee --- /dev/null +++ b/Space-Invaders/Header/Powerups/PowerupView.h @@ -0,0 +1,34 @@ +#pragma once +#include + +namespace Powerup +{ + class PowerupController; + enum class PowerupType; + + class PowerupView + { + private: + const float powerup_sprite_width = 30.f; + const float powerup_sprite_height = 30.f; + + sf::RenderWindow* game_window; + sf::Texture powerup_texture; + sf::Sprite powerup_sprite; + + PowerupController* powerup_controller; + + void initializeImage(PowerupType); + void scaleImage(); + + void destroy(); + + public: + PowerupView(); + ~PowerupView(); + + void initialize(PowerupController* controller); + void update(); + void render(); + }; +} \ No newline at end of file diff --git a/Space-Invaders/Source/Enemy/Controllers/ThunderSnakeController.cpp b/Space-Invaders/Source/Enemy/Controllers/ThunderSnakeController.cpp new file mode 100644 index 000000000..27cbc9cd5 --- /dev/null +++ b/Space-Invaders/Source/Enemy/Controllers/ThunderSnakeController.cpp @@ -0,0 +1,121 @@ +#include "../../Header/Enemy/Controllers/ThunderSnakeController.h" +#include "../../Header/Enemy/EnemyView.h" +#include "../../Header/Enemy/EnemyModel.h" +#include "../../Header/Global/ServiceLocator.h" +#include "../../Header/Bullet/BulletConfig.h" + +namespace Enemy +{ + using namespace Global; + using namespace Time; + using namespace Bullet; + + namespace Controller + { + ThunderSnakeController::ThunderSnakeController(EnemyType type) : EnemyController(type) { } + + ThunderSnakeController::~ThunderSnakeController() { } + + void ThunderSnakeController::initialize() + { + EnemyController::initialize(); + enemy_model->setMovementDirection(getInitialMovementDirection()); + enemy_model->horizontal_movement_speed = thunder_snake_horizontal_movement_speed; + } + + MovementDirection ThunderSnakeController::getInitialMovementDirection() + { + static MovementDirection initial_direction = MovementDirection::RIGHT; + + switch (initial_direction) + { + case Enemy::MovementDirection::LEFT: + initial_direction = MovementDirection::RIGHT; + return initial_direction; + + case Enemy::MovementDirection::RIGHT: + initial_direction = MovementDirection::LEFT; + return initial_direction; + } + } + + void ThunderSnakeController::move() + { + switch (enemy_model->getMovementDirection()) + { + case::Enemy::MovementDirection::LEFT: + moveLeft(); + break; + + case::Enemy::MovementDirection::RIGHT: + moveRight(); + break; + + case::Enemy::MovementDirection::LEFT_DOWN: + moveDiagonalLeft(); + break; + + case::Enemy::MovementDirection::RIGHT_DOWN: + moveDiagonalRight(); + break; + } + } + + void ThunderSnakeController::moveLeft() + { + sf::Vector2f currentPosition = enemy_model->getEnemyPosition(); + currentPosition.x -= enemy_model->horizontal_movement_speed * ServiceLocator::getInstance()->getTimeService()->getDeltaTime(); + + if (currentPosition.x <= enemy_model->left_most_position.x) + { + enemy_model->setMovementDirection(MovementDirection::RIGHT_DOWN); + } + else enemy_model->setEnemyPosition(currentPosition); + } + + void ThunderSnakeController::moveRight() + { + sf::Vector2f currentPosition = enemy_model->getEnemyPosition(); + currentPosition.x += enemy_model->horizontal_movement_speed * ServiceLocator::getInstance()->getTimeService()->getDeltaTime(); + + if (currentPosition.x >= enemy_model->right_most_position.x) + { + enemy_model->setMovementDirection(MovementDirection::LEFT_DOWN); + } + else enemy_model->setEnemyPosition(currentPosition); + } + + void ThunderSnakeController::moveDiagonalLeft() + { + sf::Vector2f currentPosition = enemy_model->getEnemyPosition(); + currentPosition.y += enemy_model->vertical_movement_speed * ServiceLocator::getInstance()->getTimeService()->getDeltaTime(); + currentPosition.x -= enemy_model->horizontal_movement_speed * ServiceLocator::getInstance()->getTimeService()->getDeltaTime(); + + if (currentPosition.x <= enemy_model->left_most_position.x) + { + enemy_model->setMovementDirection(MovementDirection::RIGHT); + } + else enemy_model->setEnemyPosition(currentPosition); + } + + void ThunderSnakeController::moveDiagonalRight() + { + sf::Vector2f currentPosition = enemy_model->getEnemyPosition(); + currentPosition.y += enemy_model->vertical_movement_speed * ServiceLocator::getInstance()->getTimeService()->getDeltaTime(); + currentPosition.x += enemy_model->horizontal_movement_speed * ServiceLocator::getInstance()->getTimeService()->getDeltaTime(); + + if (currentPosition.x >= enemy_model->right_most_position.x) + { + enemy_model->setMovementDirection(MovementDirection::LEFT); + } + else enemy_model->setEnemyPosition(currentPosition); + } + + void ThunderSnakeController::fireBullet() + { + ServiceLocator::getInstance()->getBulletService()->spawnBullet(BulletType::TORPEDO, + enemy_model->getEnemyPosition() + enemy_model->barrel_position_offset, + Bullet::MovementDirection::DOWN); + } + } +} \ No newline at end of file diff --git a/Space-Invaders/Source/Enemy/Controllers/UFOController.cpp b/Space-Invaders/Source/Enemy/Controllers/UFOController.cpp new file mode 100644 index 000000000..2202f5fc3 --- /dev/null +++ b/Space-Invaders/Source/Enemy/Controllers/UFOController.cpp @@ -0,0 +1,79 @@ +#include "../../Header/Enemy/Controllers/UFOController.h" +#include "../../Header/Enemy/EnemyModel.h" +#include "../../Header/Enemy/EnemyConfig.h" +#include "../../Header/Bullet/BulletConfig.h" +#include "../../Header/Global/ServiceLocator.h" + + +namespace Enemy +{ + using namespace Global; + using namespace Bullet; + + namespace Controller + { + UFOController::UFOController(EnemyType type) : EnemyController(type) { } + + UFOController::~UFOController() { } + + void UFOController::initialize() + { + EnemyController::initialize(); + } + + void UFOController::fireBullet() + { + } + + Powerup::PowerupType UFOController::getRandomPowerupType() + { + std::srand(static_cast(std::time(nullptr))); + + //We add '1' to OutscalBomb below because enum has a 0 index, making the bomb number 3, we need to add 1 to make it 4 + + int random_value = std::rand() % (static_cast(Powerup::PowerupType::OUTSCAL_BOMB) + 1); + return static_cast(random_value); + } + + void UFOController::move() + { + switch (enemy_model->getMovementDirection()) + { + case::Enemy::MovementDirection::LEFT: + moveLeft(); + break; + + case::Enemy::MovementDirection::RIGHT: + moveRight(); + break; + } + + } + + void UFOController::moveLeft() + { + sf::Vector2f currentPosition = enemy_model->getEnemyPosition(); + currentPosition.x -= enemy_model->horizontal_movement_speed * ServiceLocator::getInstance()->getTimeService()->getDeltaTime(); + + if (currentPosition.x <= enemy_model->left_most_position.x) + { + enemy_model->setMovementDirection(MovementDirection::RIGHT); + enemy_model->setReferencePosition(currentPosition); + } + else enemy_model->setEnemyPosition(currentPosition); + } + + void UFOController::moveRight() + { + sf::Vector2f currentPosition = enemy_model->getEnemyPosition(); + currentPosition.x += enemy_model->horizontal_movement_speed * ServiceLocator::getInstance()->getTimeService()->getDeltaTime(); + + if (currentPosition.x >= enemy_model->right_most_position.x) + { + enemy_model->setMovementDirection(MovementDirection::LEFT); + enemy_model->setReferencePosition(currentPosition); + } + else enemy_model->setEnemyPosition(currentPosition); + } + } +} \ No newline at end of file diff --git a/Space-Invaders/Source/Enemy/EnemyService.cpp b/Space-Invaders/Source/Enemy/EnemyService.cpp index 4dfff0ffe..4b178ac0a 100644 --- a/Space-Invaders/Source/Enemy/EnemyService.cpp +++ b/Space-Invaders/Source/Enemy/EnemyService.cpp @@ -5,6 +5,8 @@ #include "../../Header/Enemy/EnemyConfig.h" #include "../../Header/Enemy/Controllers/SubZeroController.h" #include "../../Header/Enemy/Controllers/ZapperController.h" +#include "../../Header/Enemy/Controllers/ThunderSnakeController.h" +#include "../../Header/Enemy/Controllers/UFOController.h" namespace Enemy { @@ -69,7 +71,7 @@ namespace Enemy EnemyType EnemyService::getRandomEnemyType() { - int randomType = std::rand() % 2; //since we only have 2 enemies right now + int randomType = std::rand() % 4; //since we only have 2 enemies right now return static_cast(randomType); } @@ -80,14 +82,14 @@ namespace Enemy case::Enemy::EnemyType::ZAPPER: return new ZapperController(Enemy::EnemyType::ZAPPER); - /*case::Enemy::EnemyType::THUNDER_SNAKE: - return new ThunderSnakeController(Enemy::EnemyType::THUNDER_SNAKE);*/ + case::Enemy::EnemyType::THUNDER_SNAKE: + return new ThunderSnakeController(Enemy::EnemyType::THUNDER_SNAKE); case::Enemy::EnemyType::SUBZERO: return new SubzeroController(Enemy::EnemyType::SUBZERO); - /*case::Enemy::EnemyType::UFO: - return new UFOController(Enemy::EnemyType::UFO);*/ + case::Enemy::EnemyType::UFO: + return new UFOController(Enemy::EnemyType::UFO); } } diff --git a/Space-Invaders/Source/Enemy/EnemyView.cpp b/Space-Invaders/Source/Enemy/EnemyView.cpp index 70e3cd142..cb742bdc9 100644 --- a/Space-Invaders/Source/Enemy/EnemyView.cpp +++ b/Space-Invaders/Source/Enemy/EnemyView.cpp @@ -39,6 +39,20 @@ namespace Enemy scaleEnemySprite(); } break; + case::Enemy::EnemyType::THUNDER_SNAKE: + if (enemy_texture.loadFromFile(Config::thunder_snake_texture_path)) + { + enemy_sprite.setTexture(enemy_texture); + scaleEnemySprite(); + } + break; + case::Enemy::EnemyType::UFO: + if (enemy_texture.loadFromFile(Config::ufo_texture_path)) + { + enemy_sprite.setTexture(enemy_texture); + scaleEnemySprite(); + } + break; } } diff --git a/Space-Invaders/Source/Global/ServiceLocator.cpp b/Space-Invaders/Source/Global/ServiceLocator.cpp index e6cd7d7d9..26942b9e1 100644 --- a/Space-Invaders/Source/Global/ServiceLocator.cpp +++ b/Space-Invaders/Source/Global/ServiceLocator.cpp @@ -14,6 +14,7 @@ namespace Global using namespace Element; using namespace Sound; using namespace Bullet; + using namespace Powerup; ServiceLocator::ServiceLocator() @@ -28,6 +29,7 @@ namespace Global element_service = nullptr; sound_service = nullptr; bullet_service = nullptr; + powerup_service = nullptr; createServices(); } ServiceLocator::~ServiceLocator() @@ -47,6 +49,7 @@ namespace Global element_service = new ElementService(); sound_service = new SoundService(); bullet_service = new BulletService(); + powerup_service = new PowerupService(); } void ServiceLocator::clearAllServices() @@ -61,6 +64,7 @@ namespace Global delete(element_service); delete(sound_service); delete(bullet_service); + delete(powerup_service); } ServiceLocator* ServiceLocator::getInstance() @@ -81,6 +85,7 @@ namespace Global element_service->initialize(); sound_service->initialize(); bullet_service->initialize(); + powerup_service->initialize(); } void ServiceLocator::update() @@ -95,6 +100,7 @@ namespace Global player_service->update(); enemy_service->update(); bullet_service->update(); + powerup_service->update(); element_service->update(); } @@ -111,6 +117,7 @@ namespace Global player_service->render(); enemy_service->render(); bullet_service->render(); + powerup_service->render(); element_service->render(); } @@ -129,6 +136,7 @@ namespace Global ElementService* ServiceLocator::getElementService() { return element_service; } SoundService* ServiceLocator::getSoundService() { return sound_service; } BulletService* ServiceLocator::getBulletService() { return bullet_service; } + PowerupService* ServiceLocator::getPowerupService() { return powerup_service; } void ServiceLocator::deleteServiceLocator() { diff --git a/Space-Invaders/Source/Powerups/Controllers/OutscalBombController.cpp b/Space-Invaders/Source/Powerups/Controllers/OutscalBombController.cpp new file mode 100644 index 000000000..9dc17d85e --- /dev/null +++ b/Space-Invaders/Source/Powerups/Controllers/OutscalBombController.cpp @@ -0,0 +1,13 @@ +#include "../../Header/Powerups/Controllers/OutscalBombController.h" + +namespace Powerup +{ + namespace Controller + { + OutscalBombController::OutscalBombController(PowerupType type) : PowerupController(type) {} + + OutscalBombController::~OutscalBombController() {} + + void OutscalBombController::onCollected() {}; + } +} \ No newline at end of file diff --git a/Space-Invaders/Source/Powerups/Controllers/RapidFireController.cpp b/Space-Invaders/Source/Powerups/Controllers/RapidFireController.cpp new file mode 100644 index 000000000..caddf6b1a --- /dev/null +++ b/Space-Invaders/Source/Powerups/Controllers/RapidFireController.cpp @@ -0,0 +1,13 @@ +#include "../../Header/Powerups/Controllers/RapidFireController.h" + +namespace Powerup +{ + namespace Controller + { + RapidFireController::RapidFireController(PowerupType type) : PowerupController(type) {} + + RapidFireController::~RapidFireController() {} + + void RapidFireController::onCollected() {}; + } +} \ No newline at end of file diff --git a/Space-Invaders/Source/Powerups/Controllers/ShieldController.cpp b/Space-Invaders/Source/Powerups/Controllers/ShieldController.cpp new file mode 100644 index 000000000..beb4a5068 --- /dev/null +++ b/Space-Invaders/Source/Powerups/Controllers/ShieldController.cpp @@ -0,0 +1,13 @@ +#include "../../Header/Powerups/Controllers/ShieldController.h" + +namespace Powerup +{ + namespace Controller + { + ShieldController::ShieldController(PowerupType type) : PowerupController(type) {} + + ShieldController::~ShieldController() {} + + void ShieldController::onCollected() {}; + } +} \ No newline at end of file diff --git a/Space-Invaders/Source/Powerups/Controllers/TrippleLaserController.h.cpp b/Space-Invaders/Source/Powerups/Controllers/TrippleLaserController.h.cpp new file mode 100644 index 000000000..3541092aa --- /dev/null +++ b/Space-Invaders/Source/Powerups/Controllers/TrippleLaserController.h.cpp @@ -0,0 +1,13 @@ +#include "../../Header/Powerups/Controllers/TrippleLaserController.h" + +namespace Powerup +{ + namespace Controller + { + TrippleLaserController::TrippleLaserController(PowerupType type) : PowerupController(type) {} + + TrippleLaserController::~TrippleLaserController() {} + + void TrippleLaserController::onCollected() {}; + } +} \ No newline at end of file diff --git a/Space-Invaders/Source/Powerups/PowerupController.cpp b/Space-Invaders/Source/Powerups/PowerupController.cpp new file mode 100644 index 000000000..deda31070 --- /dev/null +++ b/Space-Invaders/Source/Powerups/PowerupController.cpp @@ -0,0 +1,72 @@ +#include "../../Header/Powerups/PowerupController.h" +#include "../../Header/Powerups/PowerupView.h" +#include "../../Header/Powerups/PowerupModel.h" +#include "../../Header/Global/ServiceLocator.h" + +namespace Powerup +{ + using namespace Global; + + PowerupController::PowerupController(PowerupType type) + { + powerup_view = new PowerupView(); + powerup_model = new PowerupModel(type); + } + + PowerupController::~PowerupController() + { + delete (powerup_view); + delete (powerup_model); + } + + void PowerupController::initialize(sf::Vector2f position) + { + powerup_model->initialize(position); + powerup_view->initialize(this); + } + + void PowerupController::update() + { + updatePowerupPosition(); + powerup_view->update(); + } + + void PowerupController::render() + { + powerup_view->render(); + } + + void PowerupController::onCollected() + { + } + + void PowerupController::updatePowerupPosition() + { + sf::Vector2f currentPosition = powerup_model->getPowerupPosition(); + currentPosition.y += powerup_model->getMovementSpeed() * ServiceLocator::getInstance()->getTimeService()->getDeltaTime(); + + powerup_model->setPowerupPosition(currentPosition); + } + + void PowerupController::handleOutOfBounds() + { + sf::Vector2f powerupPosition = getCollectiblePosition(); + sf::Vector2u windowSize = ServiceLocator::getInstance()->getGraphicService()->getGameWindow()->getSize(); + + if (powerupPosition.x < 0 || powerupPosition.x > windowSize.x || + powerupPosition.y < 0 || powerupPosition.y > windowSize.y) + { + ServiceLocator::getInstance()->getPowerupService()->destroyPowerup(this); + } + } + + sf::Vector2f PowerupController::getCollectiblePosition() + { + return powerup_model->getPowerupPosition(); + } + + PowerupType PowerupController::getPowerupType() + { + return powerup_model->getPowerupType(); + } +} \ No newline at end of file diff --git a/Space-Invaders/Source/Powerups/PowerupModel.cpp b/Space-Invaders/Source/Powerups/PowerupModel.cpp new file mode 100644 index 000000000..d12f790d1 --- /dev/null +++ b/Space-Invaders/Source/Powerups/PowerupModel.cpp @@ -0,0 +1,46 @@ +#include "../../Header/Powerups/PowerupModel.h" + +namespace Powerup +{ + PowerupModel::PowerupModel(PowerupType type) + { + powerup_type = type; + } + + PowerupModel::~PowerupModel() { } + + void PowerupModel::initialize(sf::Vector2f position) + { + powerup_position = position; + } + + sf::Vector2f PowerupModel::getPowerupPosition() + { + return powerup_position; + } + + void PowerupModel::setPowerupPosition(sf::Vector2f position) + { + powerup_position = position; + } + + PowerupType PowerupModel::getPowerupType() + { + return powerup_type; + } + + void PowerupModel::setPowerupType(PowerupType type) + { + powerup_type = type; + } + + float PowerupModel::getMovementSpeed() + { + return movement_speed; + } + + void PowerupModel::setMovementSpeed(float speed) + { + movement_speed = speed; + } +} \ No newline at end of file diff --git a/Space-Invaders/Source/Powerups/PowerupService.cpp b/Space-Invaders/Source/Powerups/PowerupService.cpp new file mode 100644 index 000000000..3d0b8b947 --- /dev/null +++ b/Space-Invaders/Source/Powerups/PowerupService.cpp @@ -0,0 +1,69 @@ +#include "../../Header/Powerups/PowerupService.h" +#include "../../header/Powerups/PowerupController.h" +#include "../../header/Powerups/PowerupConfig.h" +#include "../../header/Global/ServiceLocator.h" +#include "../../header/Powerups/Controllers/OutscalBombController.h" +#include "../../header/Powerups/Controllers/RapidFireController.h" +#include "../../header/Powerups/Controllers/ShieldController.h" +#include "../../header/Powerups/Controllers/TrippleLaserController.h" + +namespace Powerup +{ + using namespace Global; + using namespace Controller; + using namespace Collectible; + + PowerupService::PowerupService() { } + + PowerupService::~PowerupService() { destroy(); } + + void PowerupService::initialize() { } + + void PowerupService::update() + { + for (int i = 0; i < powerup_list.size(); i++) powerup_list[i]->update(); //loop and update + } + + void PowerupService::render() + { + for (int i = 0; i < powerup_list.size(); i++) powerup_list[i]->render(); //loop and render + } + + PowerupController* PowerupService::createPowerup(PowerupType powerup_type) //creates and returns a pointer to the created powerup + { + switch (powerup_type) + { + case::Powerup::PowerupType::SHIELD: + return new ShieldController(Powerup::PowerupType::SHIELD); + + case::Powerup::PowerupType::RAPID_FIRE: + return new RapidFireController(Powerup::PowerupType::RAPID_FIRE); + + case::Powerup::PowerupType::TRIPPLE_LASER: + return new TrippleLaserController(Powerup::PowerupType::TRIPPLE_LASER); + + case::Powerup::PowerupType::OUTSCAL_BOMB: + return new OutscalBombController(Powerup::PowerupType::OUTSCAL_BOMB); + } + } + + PowerupController* PowerupService::spawnPowerup(PowerupType powerup_type, sf::Vector2f position) //initialize a powerup + { + PowerupController* powerup_controller = createPowerup(powerup_type); + + powerup_controller->initialize(position); + powerup_list.push_back(powerup_controller); + return powerup_controller; + } + + void PowerupService::destroyPowerup(PowerupController* powerup_controller) //destroy the powerup by controller type + { + powerup_list.erase(std::remove(powerup_list.begin(), powerup_list.end(), powerup_controller), powerup_list.end()); + delete(powerup_controller); + } + + void PowerupService::destroy() + { + for (int i = 0; i < powerup_list.size(); i++) delete (powerup_list[i]); + } +} \ No newline at end of file diff --git a/Space-Invaders/Source/Powerups/PowerupView.cpp b/Space-Invaders/Source/Powerups/PowerupView.cpp new file mode 100644 index 000000000..5c6c6452f --- /dev/null +++ b/Space-Invaders/Source/Powerups/PowerupView.cpp @@ -0,0 +1,75 @@ +#include "../../Header/Powerups/PowerupView.h" +#include "../../Header/Global/ServiceLocator.h" +#include "../../Header/Global/Config.h" +#include "../../Header/Powerups/PowerupController.h" +#include "../../Header/Powerups/PowerupConfig.h" + +namespace Powerup +{ + using namespace Global; + + PowerupView::PowerupView() { } + + PowerupView::~PowerupView() { } + + void PowerupView::initialize(PowerupController* controller) + { + powerup_controller = controller; + game_window = ServiceLocator::getInstance()->getGraphicService()->getGameWindow(); + initializeImage(powerup_controller->getPowerupType()); + } + + + void PowerupView::initializeImage(PowerupType type) + { + switch (type) + { + case::Powerup::PowerupType::TRIPPLE_LASER: + if (powerup_texture.loadFromFile(Config::tripple_laser_texture_path)) + { + powerup_sprite.setTexture(powerup_texture); + scaleImage(); + } + break; + case::Powerup::PowerupType::SHIELD: + if (powerup_texture.loadFromFile(Config::shield_texture_path)) + { + powerup_sprite.setTexture(powerup_texture); + scaleImage(); + } + break; + case::Powerup::PowerupType::RAPID_FIRE: + if (powerup_texture.loadFromFile(Config::rapid_fire_texture_path)) + { + powerup_sprite.setTexture(powerup_texture); + scaleImage(); + } + break; + case::Powerup::PowerupType::OUTSCAL_BOMB: + if (powerup_texture.loadFromFile(Config::outscal_bomb_texture_path)) + { + powerup_sprite.setTexture(powerup_texture); + scaleImage(); + } + break; + } + } + + void PowerupView::scaleImage() + { + powerup_sprite.setScale( + static_cast(powerup_sprite_width) / powerup_sprite.getTexture()->getSize().x, + static_cast(powerup_sprite_height) / powerup_sprite.getTexture()->getSize().y + ); + } + + void PowerupView::update() + { + powerup_sprite.setPosition(powerup_controller->getCollectiblePosition()); + } + + void PowerupView::render() + { + game_window->draw(powerup_sprite); + } +} \ No newline at end of file From a567828f66ddfd6ed5069b9ec62de20b06311695 Mon Sep 17 00:00:00 2001 From: Rishi Saxena Date: Sat, 10 Aug 2024 13:19:27 +0530 Subject: [PATCH 43/56] UI interface added --- .../Header/UI/Interface/IUIController.h | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 Space-Invaders/Header/UI/Interface/IUIController.h diff --git a/Space-Invaders/Header/UI/Interface/IUIController.h b/Space-Invaders/Header/UI/Interface/IUIController.h new file mode 100644 index 000000000..be1979fa3 --- /dev/null +++ b/Space-Invaders/Header/UI/Interface/IUIController.h @@ -0,0 +1,17 @@ +#pragma once +namespace UI +{ + namespace Interface + { + class IUIController + { + public: + virtual void initialize() = 0; + virtual void update() = 0; + virtual void render() = 0; + virtual void show() = 0; + + virtual ~IUIController() { } + }; + } +} \ No newline at end of file From b284f49d26a4c74585397f78d7af5349ebf0fae7 Mon Sep 17 00:00:00 2001 From: Rishi Saxena Date: Sun, 11 Aug 2024 14:17:18 +0530 Subject: [PATCH 44/56] UIService completed and implemented --- Space-Invaders/Header/Bullet/BulletView.h | 13 +- .../Header/Element/Bunker/BunkerView.h | 12 +- Space-Invaders/Header/Enemy/EnemyView.h | 14 +- Space-Invaders/Header/Gameplay/GameplayView.h | 13 +- Space-Invaders/Header/Player/PlayerView.h | 18 +-- Space-Invaders/Header/Powerups/PowerupView.h | 11 +- .../Header/UI/Interface/IUIController.h | 1 + .../Header/UI/MainMenu/MainMenuUIController.h | 54 +++---- .../Header/UI/UIElement/ButtonView.h | 37 +++++ .../Header/UI/UIElement/ImageView.h | 31 ++++ Space-Invaders/Header/UI/UIElement/TextView.h | 45 ++++++ Space-Invaders/Header/UI/UIElement/UIView.h | 33 ++++ Space-Invaders/Header/UI/UIService.h | 3 + Space-Invaders/Source/Bullet/BulletView.cpp | 67 ++++---- .../Source/Element/Bunker/BunkerView.cpp | 33 ++-- Space-Invaders/Source/Enemy/EnemyView.cpp | 71 ++++----- .../Source/Gameplay/GameplayView.cpp | 31 ++-- Space-Invaders/Source/Player/PlayerView.cpp | 43 +++-- .../Source/Powerups/PowerupView.cpp | 79 ++++----- .../UI/MainMenu/MainMenuUIController.cpp | 150 ++++++++---------- .../Source/UI/UIElement/ButtonView.cpp | 64 ++++++++ .../Source/UI/UIElement/ImageView.cpp | 80 ++++++++++ .../Source/UI/UIElement/TextView.cpp | 95 +++++++++++ Space-Invaders/Source/UI/UIElement/UIView.cpp | 36 +++++ Space-Invaders/Source/UI/UIService.cpp | 23 ++- 25 files changed, 720 insertions(+), 337 deletions(-) create mode 100644 Space-Invaders/Header/UI/UIElement/ButtonView.h create mode 100644 Space-Invaders/Header/UI/UIElement/ImageView.h create mode 100644 Space-Invaders/Header/UI/UIElement/TextView.h create mode 100644 Space-Invaders/Header/UI/UIElement/UIView.h create mode 100644 Space-Invaders/Source/UI/UIElement/ButtonView.cpp create mode 100644 Space-Invaders/Source/UI/UIElement/ImageView.cpp create mode 100644 Space-Invaders/Source/UI/UIElement/TextView.cpp create mode 100644 Space-Invaders/Source/UI/UIElement/UIView.cpp diff --git a/Space-Invaders/Header/Bullet/BulletView.h b/Space-Invaders/Header/Bullet/BulletView.h index bbe639119..52bf08af7 100644 --- a/Space-Invaders/Header/Bullet/BulletView.h +++ b/Space-Invaders/Header/Bullet/BulletView.h @@ -1,6 +1,7 @@ #pragma once #include #include "../../Header/Bullet/BulletController.h" +#include "../../Header/UI/UIElement/ImageView.h" namespace Bullet { @@ -13,14 +14,14 @@ namespace Bullet const float bullet_sprite_width = 18.f; const float bullet_sprite_height = 18.f; - sf::RenderWindow* game_window; - sf::Texture bullet_texture; - sf::Sprite bullet_sprite; - BulletController* bullet_controller; + UI::UIElement::ImageView* bullet_image; + + void createUIElements(); + void initializeImage(); + sf::String getBulletTexturePath(); - void initializeImage(BulletType type); - void scaleImage(); + void destroy(); public: BulletView(); diff --git a/Space-Invaders/Header/Element/Bunker/BunkerView.h b/Space-Invaders/Header/Element/Bunker/BunkerView.h index acc163094..9bf2ac2de 100644 --- a/Space-Invaders/Header/Element/Bunker/BunkerView.h +++ b/Space-Invaders/Header/Element/Bunker/BunkerView.h @@ -1,5 +1,6 @@ #pragma once #include +#include "../../Header/UI/UIElement/ImageView.h" namespace Element { @@ -14,16 +15,13 @@ namespace Element const float bunker_sprite_height = 80.f; BunkerController* bunker_controller; - sf::RenderWindow* game_window; + UI::UIElement::ImageView* bunker_image; - sf::Texture bunker_texture; - sf::Sprite bunker_sprite; - - //const sf::String bunker_texture_path = "assets/textures/bunker.png"; - - void scaleSprite(); + void createUIElements(); void initializeImage(); + void destroy(); + public: BunkerView(); ~BunkerView(); diff --git a/Space-Invaders/Header/Enemy/EnemyView.h b/Space-Invaders/Header/Enemy/EnemyView.h index b89b046a7..04258819c 100644 --- a/Space-Invaders/Header/Enemy/EnemyView.h +++ b/Space-Invaders/Header/Enemy/EnemyView.h @@ -2,6 +2,7 @@ #include #include "../../Header/Enemy/EnemyConfig.h" +#include "../../Header/UI/UIElement/ImageView.h" namespace Enemy { @@ -10,20 +11,17 @@ namespace Enemy class EnemyView { private: - //const sf::String subzero_texture_path = "assets/textures/subzero.png"; - //const sf::String zapper_texture_path = "assets/textures/zapper.png"; - const float enemy_sprite_width = 60.f; const float enemy_sprite_height = 60.f; EnemyController* enemy_controller; + UI::UIElement::ImageView* enemy_image; - sf::RenderWindow* game_window; - sf::Texture enemy_texture; - sf::Sprite enemy_sprite; + void createUIElements(); + void initializeImage(); + sf::String getEnemyTexturePath(); - void initializeEnemySprite(EnemyType type); - void scaleEnemySprite(); + void destroy(); public: EnemyView(); diff --git a/Space-Invaders/Header/Gameplay/GameplayView.h b/Space-Invaders/Header/Gameplay/GameplayView.h index e6675b5db..96772b0f8 100644 --- a/Space-Invaders/Header/Gameplay/GameplayView.h +++ b/Space-Invaders/Header/Gameplay/GameplayView.h @@ -1,19 +1,24 @@ #pragma once #include +#include "../../Header/UI/UIElement/ImageView.h" namespace Gameplay { + class GameplayController; + class GameplayView { private: - //const sf::String background_texture_path = "assets/textures/space_invaders_bg.png"; - sf::RenderWindow* game_window; sf::Texture background_texture; sf::Sprite background_sprite; - void initializeBackgroundSprite(); - void scaleBackgroundSprite(); + const float background_alpha = 150.f; + + GameplayController* gameplay_controller; + UI::UIElement::ImageView* background_image; + + void initializeBackgroundImage(); public: GameplayView(); diff --git a/Space-Invaders/Header/Player/PlayerView.h b/Space-Invaders/Header/Player/PlayerView.h index 00fd6efa6..ec0eb5413 100644 --- a/Space-Invaders/Header/Player/PlayerView.h +++ b/Space-Invaders/Header/Player/PlayerView.h @@ -1,32 +1,28 @@ #pragma once #include #include "../../Header/Player/PlayerController.h" +#include "../../Header/UI/UIElement/ImageView.h" namespace Player { + class PlayerController; class PlayerView { private: - - //const sf::String player_texture_path = "assets/textures/player_ship.png"; const float player_sprite_width = 60.f; const float player_sprite_height = 60.f; - sf::RenderWindow* game_window; - - sf::Texture player_texture; - sf::Sprite player_sprite; - - void initializePlayerSprite(); - void scalePlayerSprite(); + PlayerController* player_controller; + UI::UIElement::ImageView* player_image; - PlayerController* player_controller; // ptr to player controller + void createUIElements(); + void initializeImage(); + void destroy(); public: PlayerView(); ~PlayerView(); - void initialize(); void update(); void render(); void initialize(PlayerController* controller); diff --git a/Space-Invaders/Header/Powerups/PowerupView.h b/Space-Invaders/Header/Powerups/PowerupView.h index 47b6689ee..d63947915 100644 --- a/Space-Invaders/Header/Powerups/PowerupView.h +++ b/Space-Invaders/Header/Powerups/PowerupView.h @@ -1,5 +1,6 @@ #pragma once #include +#include "../../Header/UI/UIElement/ImageView.h" namespace Powerup { @@ -12,14 +13,12 @@ namespace Powerup const float powerup_sprite_width = 30.f; const float powerup_sprite_height = 30.f; - sf::RenderWindow* game_window; - sf::Texture powerup_texture; - sf::Sprite powerup_sprite; - PowerupController* powerup_controller; + UI::UIElement::ImageView* powerup_image; - void initializeImage(PowerupType); - void scaleImage(); + void createUIElements(); + void initializeImage(); + sf::String getPowerupTexturePath(); void destroy(); diff --git a/Space-Invaders/Header/UI/Interface/IUIController.h b/Space-Invaders/Header/UI/Interface/IUIController.h index be1979fa3..c97cf8d7a 100644 --- a/Space-Invaders/Header/UI/Interface/IUIController.h +++ b/Space-Invaders/Header/UI/Interface/IUIController.h @@ -6,6 +6,7 @@ namespace UI class IUIController { public: + virtual void initialize() = 0; virtual void update() = 0; virtual void render() = 0; diff --git a/Space-Invaders/Header/UI/MainMenu/MainMenuUIController.h b/Space-Invaders/Header/UI/MainMenu/MainMenuUIController.h index daa45b4bf..1772f5c02 100644 --- a/Space-Invaders/Header/UI/MainMenu/MainMenuUIController.h +++ b/Space-Invaders/Header/UI/MainMenu/MainMenuUIController.h @@ -1,58 +1,52 @@ #pragma once #include +#include "../../header/UI/Interface/IUIController.h" +#include "../../header/UI/UIElement/ImageView.h" +#include "../../header/UI/UIElement/ButtonView.h" namespace UI { namespace MainMenu { - class MainMenuUIController + class MainMenuUIController :public Interface::IUIController { private: - //const sf::String background_texture_path = "assets/textures/space_invaders_bg.png"; - //const sf::String play_button_texture_path = "assets/textures/play_button.png"; - //const sf::String instructions_button_texture_path = "assets/textures/instructions_button.png"; - //const sf::String quit_button_texture_path = "assets/textures/quit_button.png"; - // Constants: const float button_width = 400.f; const float button_height = 140.f; + const float play_button_y_position = 500.f; + const float instructions_button_y_position = 700.f; + const float quit_button_y_position = 900.f; + const float background_alpha = 85.f; + UIElement::ImageView* background_image; - sf::RenderWindow* game_window; - - // Textures: - sf::Texture background_texture; - sf::Sprite background_sprite; - - sf::Texture play_button_texture; - sf::Sprite play_button_sprite; - - sf::Texture instructions_button_texture; - sf::Sprite instructions_button_sprite; - - sf::Texture quit_button_texture; - sf::Sprite quit_button_sprite; + // UI Elements + UIElement::ButtonView* play_button; + UIElement::ButtonView* instructions_button; + UIElement::ButtonView* quit_button; // Buttons and scaling + void createImage(); + void createButtons(); void initializeBackgroundImage(); - void scaleBackgroundImage(); void initializeButtons(); - bool loadButtonTexturesFromFile(); - void setButtonSprites(); - void scaleAllButttons(); - void scaleButton(sf::Sprite* button_to_scale); - void positionButtons(); - // Which button and function - void processButtonInteractions(); - bool clickedButton(sf::Sprite*, sf::Vector2f); + void registerButtonCallback(); + + void playButtonCallback(); + void instructionsButtonCallback(); + void quitButtonCallback(); + + void destroy(); public: MainMenuUIController(); + ~MainMenuUIController(); void initialize(); void update(); void render(); - + void show() override; }; } } \ No newline at end of file diff --git a/Space-Invaders/Header/UI/UIElement/ButtonView.h b/Space-Invaders/Header/UI/UIElement/ButtonView.h new file mode 100644 index 000000000..10941f6a6 --- /dev/null +++ b/Space-Invaders/Header/UI/UIElement/ButtonView.h @@ -0,0 +1,37 @@ +#pragma once +#include "../../header/UI/UIElement/ImageView.h" +#include + +namespace UI +{ + namespace UIElement + { + class ButtonView : public ImageView + { + private: + // Define a function pointer type for the callback function + using CallbackFunction = std::function; + + // Store the callback function + CallbackFunction callback_function = nullptr; + + void printButtonClicked(); + + protected: + sf::String button_title; + + virtual void handleButtonInteraction(); + virtual bool clickedButton(sf::Sprite* button_sprite, sf::Vector2f mouse_position); + + public: + ButtonView(); + virtual ~ButtonView(); + + virtual void initialize(sf::String title, sf::String texture_path, float button_width, float button_height, sf::Vector2f position); + virtual void update() override; + virtual void render() override; + + void registerCallbackFuntion(CallbackFunction button_callback); + }; + } +} \ No newline at end of file diff --git a/Space-Invaders/Header/UI/UIElement/ImageView.h b/Space-Invaders/Header/UI/UIElement/ImageView.h new file mode 100644 index 000000000..875bf69d0 --- /dev/null +++ b/Space-Invaders/Header/UI/UIElement/ImageView.h @@ -0,0 +1,31 @@ +#pragma once +#include "../../header/UI/UIElement/UIView.h" + +namespace UI +{ + namespace UIElement + { + class ImageView : public UIView + { + protected: + sf::Texture image_texture; + sf::Sprite image_sprite; + + public: + ImageView(); + virtual ~ImageView(); + + virtual void initialize(sf::String texture_path, float image_width, float image_height, sf::Vector2f position); + virtual void update() override; + virtual void render() override; + + virtual void setTexture(sf::String texture_path); + virtual void setScale(float width, float height); + virtual void setPosition(sf::Vector2f position); + virtual void setRotation(float rotation_angle); + virtual void setOriginAtCentre(); + virtual void setImageAlpha(float alpha); + virtual void setCentreAlinged(); + }; + } +} \ No newline at end of file diff --git a/Space-Invaders/Header/UI/UIElement/TextView.h b/Space-Invaders/Header/UI/UIElement/TextView.h new file mode 100644 index 000000000..5a5e51c6a --- /dev/null +++ b/Space-Invaders/Header/UI/UIElement/TextView.h @@ -0,0 +1,45 @@ +#pragma once +#include "../../header/UI/UIElement/UIView.h" + +namespace UI +{ + namespace UIElement + { + enum class FontType + { + BUBBLE_BOBBLE, + DS_DIGIB, + }; + + class TextView : public UIView + { + private: + static const int default_font_size = 55; + + static sf::Font font_bubble_bobble; + static sf::Font font_DS_DIGIB; + + sf::Text text; + + static void loadFont(); + + void setFont(FontType font_type); + void setFontSize(int font_size); + void setTextPosition(sf::Vector2f position); + void setTextColor(sf::Color color); + + public: + TextView(); + virtual ~TextView(); + + static void initializeTextView(); + + virtual void initialize(sf::String text_value, sf::Vector2f position, FontType font_type = FontType::BUBBLE_BOBBLE, int font_size = default_font_size, sf::Color color = sf::Color::White); + virtual void update() override; + virtual void render() override; + + void setText(sf::String text_value); + void setTextCentreAligned(); + }; + } +} \ No newline at end of file diff --git a/Space-Invaders/Header/UI/UIElement/UIView.h b/Space-Invaders/Header/UI/UIElement/UIView.h new file mode 100644 index 000000000..be748be05 --- /dev/null +++ b/Space-Invaders/Header/UI/UIElement/UIView.h @@ -0,0 +1,33 @@ +#pragma once +#include + +namespace UI +{ + namespace UIElement + { + enum class UIState + { + VISIBLE, + HIDDEN, + }; + + class UIView + { + protected: + sf::RenderWindow* game_window; + UIState ui_state; + + public: + UIView(); + virtual ~UIView(); + + virtual void initialize(); + virtual void update(); + virtual void render(); + + // to enable/disable render of ui + virtual void show(); + virtual void hide(); + }; + } +} \ No newline at end of file diff --git a/Space-Invaders/Header/UI/UIService.h b/Space-Invaders/Header/UI/UIService.h index 2f8856ee3..1acbeb81b 100644 --- a/Space-Invaders/Header/UI/UIService.h +++ b/Space-Invaders/Header/UI/UIService.h @@ -1,5 +1,6 @@ #pragma once #include "../../Header/UI/MainMenu/MainMenuUIController.h" +#include "../../Header/UI/Interface/IUIController.h" namespace UI { @@ -10,6 +11,7 @@ namespace UI void createControllers(); void initializeControllers(); + Interface::IUIController* getCurrentUIController(); void destroy(); public: @@ -19,5 +21,6 @@ namespace UI void initialize(); void update(); void render(); + void showScreen(); }; } \ No newline at end of file diff --git a/Space-Invaders/Source/Bullet/BulletView.cpp b/Space-Invaders/Source/Bullet/BulletView.cpp index 4d50a07dd..09e98db32 100644 --- a/Space-Invaders/Source/Bullet/BulletView.cpp +++ b/Space-Invaders/Source/Bullet/BulletView.cpp @@ -7,61 +7,56 @@ namespace Bullet { using namespace Global; + using namespace UI::UIElement; - BulletView::BulletView() { } + BulletView::BulletView() { createUIElements(); } - BulletView::~BulletView() { } + BulletView::~BulletView() { destroy(); } void BulletView::initialize(BulletController* controller) { bullet_controller = controller; - game_window = ServiceLocator::getInstance()->getGraphicService()->getGameWindow(); - initializeImage(bullet_controller->getBulletType()); + initializeImage(); } - void BulletView::initializeImage(BulletType type) + void BulletView::createUIElements() { - switch (type) - { - case::Bullet::BulletType::LASER_BULLET: - if (bullet_texture.loadFromFile(Config::laser_bullet_texture_path)) - { - bullet_sprite.setTexture(bullet_texture); - scaleImage(); - } - break; - case::Bullet::BulletType::FROST_BULLET: - if (bullet_texture.loadFromFile(Config::frost_beam_texture_path)) - { - bullet_sprite.setTexture(bullet_texture); - scaleImage(); - } - break; - case::Bullet::BulletType::TORPEDO: - if (bullet_texture.loadFromFile(Config::torpedoe_texture_path)) - { - bullet_sprite.setTexture(bullet_texture); - scaleImage(); - } - break; - } + bullet_image = new ImageView(); } - void BulletView::scaleImage() + void BulletView::initializeImage() { - bullet_sprite.setScale( - static_cast(bullet_sprite_width) / bullet_sprite.getTexture()->getSize().x, - static_cast(bullet_sprite_height) / bullet_sprite.getTexture()->getSize().y - ); + bullet_image->initialize(getBulletTexturePath(), bullet_sprite_width, bullet_sprite_height, bullet_controller->getProjectilePosition()); } void BulletView::update() { - bullet_sprite.setPosition(bullet_controller->getProjectilePosition()); + bullet_image->setPosition(bullet_controller->getProjectilePosition()); + bullet_image->update(); } void BulletView::render() { - game_window->draw(bullet_sprite); + bullet_image->render(); + } + + sf::String BulletView::getBulletTexturePath() + { + switch (bullet_controller->getBulletType()) + { + case::Bullet::BulletType::LASER_BULLET: + return Config::laser_bullet_texture_path; + + case::Bullet::BulletType::FROST_BULLET: + return Config::frost_beam_texture_path; + + case::Bullet::BulletType::TORPEDO: + return Config::torpedoe_texture_path; + } + } + + void BulletView::destroy() + { + delete (bullet_image); } } diff --git a/Space-Invaders/Source/Element/Bunker/BunkerView.cpp b/Space-Invaders/Source/Element/Bunker/BunkerView.cpp index 5cd03623a..1958ea3e9 100644 --- a/Space-Invaders/Source/Element/Bunker/BunkerView.cpp +++ b/Space-Invaders/Source/Element/Bunker/BunkerView.cpp @@ -1,5 +1,6 @@ #include "../../header/Element/Bunker/BunkerView.h" #include "../../header/Global/ServiceLocator.h" +#include "../../Header/Graphic/GraphicService.h" #include "../../header/Element/Bunker/BunkerController.h" #include "../../Header/Global/Config.h" @@ -8,45 +9,41 @@ namespace Element namespace Bunker { using namespace Global; + using namespace UI::UIElement; - BunkerView::BunkerView() { } + BunkerView::BunkerView() { createUIElements(); } - BunkerView::~BunkerView() { } + BunkerView::~BunkerView() { destroy(); } void BunkerView::initialize(BunkerController* controller) { bunker_controller = controller; - game_window = ServiceLocator::getInstance()->getGraphicService()->getGameWindow(); initializeImage(); } - void BunkerView::initializeImage() + void BunkerView::createUIElements() { - if (bunker_texture.loadFromFile(Config::bunker_texture_path)) - { - bunker_sprite.setTexture(bunker_texture); - scaleSprite(); - } + bunker_image = new ImageView(); } - - void BunkerView::scaleSprite() + void BunkerView::initializeImage() { - bunker_sprite.setScale( - static_cast(bunker_sprite_width) / bunker_sprite.getTexture()->getSize().x, - static_cast(bunker_sprite_height) / bunker_sprite.getTexture()->getSize().y - ); + bunker_image->initialize(Config::bunker_texture_path, bunker_sprite_width, bunker_sprite_height, bunker_controller->getBunkerPosition()); } - void BunkerView::update() { - bunker_sprite.setPosition(bunker_controller->getBunkerPosition()); + bunker_image->update(); } void BunkerView::render() { - game_window->draw(bunker_sprite); + bunker_image->render(); + } + + void BunkerView::destroy() + { + delete(bunker_image); } } diff --git a/Space-Invaders/Source/Enemy/EnemyView.cpp b/Space-Invaders/Source/Enemy/EnemyView.cpp index cb742bdc9..2fa9d3305 100644 --- a/Space-Invaders/Source/Enemy/EnemyView.cpp +++ b/Space-Invaders/Source/Enemy/EnemyView.cpp @@ -9,69 +9,58 @@ namespace Enemy { using namespace Global; using namespace Graphics; + using namespace UI::UIElement; - EnemyView::EnemyView() { } + EnemyView::EnemyView() { createUIElements(); } - EnemyView::~EnemyView() { } + EnemyView::~EnemyView() { destroy(); } void EnemyView::initialize(EnemyController* controller) { enemy_controller = controller; - game_window = ServiceLocator::getInstance()->getGraphicService()->getGameWindow(); - initializeEnemySprite(enemy_controller->getEnemyType()); + initializeImage(); } - void EnemyView::initializeEnemySprite(EnemyType type) + void EnemyView::createUIElements() { - switch (type) + enemy_image = new ImageView(); + } + + void EnemyView::initializeImage() + { + enemy_image->initialize(getEnemyTexturePath(), enemy_sprite_width, enemy_sprite_height, enemy_controller->getEnemyPosition()); + } + + sf::String EnemyView::getEnemyTexturePath() + { + switch (enemy_controller->getEnemyType()) { - case::Enemy::EnemyType::SUBZERO: - if (enemy_texture.loadFromFile(Config::subzero_texture_path)) - { - enemy_sprite.setTexture(enemy_texture); - scaleEnemySprite(); - } - break; case::Enemy::EnemyType::ZAPPER: - if (enemy_texture.loadFromFile(Config::zapper_texture_path)) - { - enemy_sprite.setTexture(enemy_texture); - scaleEnemySprite(); - } - break; + return Config::zapper_texture_path; + case::Enemy::EnemyType::THUNDER_SNAKE: - if (enemy_texture.loadFromFile(Config::thunder_snake_texture_path)) - { - enemy_sprite.setTexture(enemy_texture); - scaleEnemySprite(); - } - break; + return Config::thunder_snake_texture_path; + + case::Enemy::EnemyType::SUBZERO: + return Config::subzero_texture_path; + case::Enemy::EnemyType::UFO: - if (enemy_texture.loadFromFile(Config::ufo_texture_path)) - { - enemy_sprite.setTexture(enemy_texture); - scaleEnemySprite(); - } - break; + return Config::ufo_texture_path; } } - void EnemyView::scaleEnemySprite() + void EnemyView::update() { - // method to scale the Sprite according to our set dimensions. Don't worry about the static_cast, that will be discussed later. - enemy_sprite.setScale( - static_cast(enemy_sprite_width) / enemy_sprite.getTexture()->getSize().x, - static_cast(enemy_sprite_height) / enemy_sprite.getTexture()->getSize().y - ); + enemy_image->setPosition(enemy_controller->getEnemyPosition()); } - void EnemyView::update() + void EnemyView::render() { - enemy_sprite.setPosition(enemy_controller->getEnemyPosition()); + enemy_image->render(); } - void EnemyView::render() + void EnemyView::destroy() { - game_window->draw(enemy_sprite); + delete (enemy_image); } } \ No newline at end of file diff --git a/Space-Invaders/Source/Gameplay/GameplayView.cpp b/Space-Invaders/Source/Gameplay/GameplayView.cpp index 48af47575..699e87969 100644 --- a/Space-Invaders/Source/Gameplay/GameplayView.cpp +++ b/Space-Invaders/Source/Gameplay/GameplayView.cpp @@ -7,35 +7,28 @@ namespace Gameplay { using namespace Global; using namespace Graphics; + using namespace UI::UIElement; - GameplayView::GameplayView() { } + GameplayView::GameplayView() { background_image = new ImageView(); } - GameplayView::~GameplayView() { } + GameplayView::~GameplayView() { delete(background_image); } void GameplayView::initialize() { - game_window = ServiceLocator::getInstance()->getGraphicService()->getGameWindow(); - initializeBackgroundSprite(); + initializeBackgroundImage(); } - void GameplayView::initializeBackgroundSprite() + void GameplayView::initializeBackgroundImage() { - if (background_texture.loadFromFile(Config::background_texture_path)) - { - background_sprite.setTexture(background_texture); - scaleBackgroundSprite(); - } - } + sf::RenderWindow* game_window = ServiceLocator::getInstance()->getGraphicService()->getGameWindow(); - void GameplayView::scaleBackgroundSprite() - { - background_sprite.setScale( - static_cast(game_window->getSize().x) / background_sprite.getTexture()->getSize().x, - static_cast(game_window->getSize().y) / background_sprite.getTexture()->getSize().y - ); + background_image->initialize(Config::background_texture_path, + game_window->getSize().x, + game_window->getSize().y, + sf::Vector2f(0, 0)); } - void GameplayView::update() { } + void GameplayView::update() { background_image->update(); } - void GameplayView::render() { game_window->draw(background_sprite); } + void GameplayView::render() { background_image->render(); } } \ No newline at end of file diff --git a/Space-Invaders/Source/Player/PlayerView.cpp b/Space-Invaders/Source/Player/PlayerView.cpp index 96e287e72..d40d94e90 100644 --- a/Space-Invaders/Source/Player/PlayerView.cpp +++ b/Space-Invaders/Source/Player/PlayerView.cpp @@ -1,55 +1,48 @@ #include "../../Header/Player/PlayerView.h" #include "../../Header/Global/ServiceLocator.h" #include "../../Header/Global/Config.h" +#include "../../Header/Graphic/GraphicService.h" +#include "../../Header/Player/PlayerController.h" namespace Player { using namespace Global; - PlayerView::PlayerView() { } + using namespace UI::UIElement; - PlayerView::~PlayerView() { } + PlayerView::PlayerView() { createUIElements(); } - void PlayerView::initialize() - { - - game_window = ServiceLocator::getInstance()->getGraphicService()->getGameWindow(); - initializePlayerSprite(); - } + PlayerView::~PlayerView() { destroy(); } void PlayerView::initialize(PlayerController* controller) { player_controller = controller; //to later use it for setting position - game_window = ServiceLocator::getInstance()->getGraphicService()->getGameWindow(); - initializePlayerSprite(); + initializeImage(); } - void PlayerView::initializePlayerSprite() + void PlayerView::createUIElements() { - if (player_texture.loadFromFile(Config::player_texture_path)) - { - player_sprite.setTexture(player_texture); - scalePlayerSprite(); - } + player_image = new ImageView(); } - void PlayerView::scalePlayerSprite() + void PlayerView::initializeImage() { - // setScale is an inbuilt method of the sprite class that takes two floats to scale the sprite. it scales the sprite to our desired height - player_sprite.setScale( - //Here we find the factor to scale our sprites with. Ignore the static_cast for now, we will discuss it later. - static_cast(player_sprite_width) / player_sprite.getTexture()->getSize().x, - static_cast(player_sprite_height) / player_sprite.getTexture()->getSize().y - ); + player_image->initialize(Config::player_texture_path, player_sprite_width, player_sprite_height, player_controller->getPlayerPosition()); } void PlayerView::update() { //set the updated position before we render - player_sprite.setPosition(player_controller->getPlayerPosition()); + player_image->setPosition(player_controller->getPlayerPosition()); + player_image->update(); } void PlayerView::render() { - game_window->draw(player_sprite); + player_image->render(); + } + + void PlayerView::destroy() + { + delete(player_image); } } \ No newline at end of file diff --git a/Space-Invaders/Source/Powerups/PowerupView.cpp b/Space-Invaders/Source/Powerups/PowerupView.cpp index 5c6c6452f..a8f8d48f2 100644 --- a/Space-Invaders/Source/Powerups/PowerupView.cpp +++ b/Space-Invaders/Source/Powerups/PowerupView.cpp @@ -1,75 +1,66 @@ #include "../../Header/Powerups/PowerupView.h" #include "../../Header/Global/ServiceLocator.h" #include "../../Header/Global/Config.h" +#include "../../Header/Bullet/BulletConfig.h" #include "../../Header/Powerups/PowerupController.h" #include "../../Header/Powerups/PowerupConfig.h" namespace Powerup { using namespace Global; + using namespace UI::UIElement; - PowerupView::PowerupView() { } + PowerupView::PowerupView() { createUIElements(); } - PowerupView::~PowerupView() { } + PowerupView::~PowerupView() { destroy(); } void PowerupView::initialize(PowerupController* controller) { powerup_controller = controller; - game_window = ServiceLocator::getInstance()->getGraphicService()->getGameWindow(); - initializeImage(powerup_controller->getPowerupType()); + initializeImage(); } - - void PowerupView::initializeImage(PowerupType type) + void PowerupView::createUIElements() { - switch (type) - { - case::Powerup::PowerupType::TRIPPLE_LASER: - if (powerup_texture.loadFromFile(Config::tripple_laser_texture_path)) - { - powerup_sprite.setTexture(powerup_texture); - scaleImage(); - } - break; - case::Powerup::PowerupType::SHIELD: - if (powerup_texture.loadFromFile(Config::shield_texture_path)) - { - powerup_sprite.setTexture(powerup_texture); - scaleImage(); - } - break; - case::Powerup::PowerupType::RAPID_FIRE: - if (powerup_texture.loadFromFile(Config::rapid_fire_texture_path)) - { - powerup_sprite.setTexture(powerup_texture); - scaleImage(); - } - break; - case::Powerup::PowerupType::OUTSCAL_BOMB: - if (powerup_texture.loadFromFile(Config::outscal_bomb_texture_path)) - { - powerup_sprite.setTexture(powerup_texture); - scaleImage(); - } - break; - } + powerup_image = new ImageView(); } - void PowerupView::scaleImage() + void PowerupView::initializeImage() { - powerup_sprite.setScale( - static_cast(powerup_sprite_width) / powerup_sprite.getTexture()->getSize().x, - static_cast(powerup_sprite_height) / powerup_sprite.getTexture()->getSize().y - ); + powerup_image->initialize(getPowerupTexturePath(), powerup_sprite_width, powerup_sprite_height, powerup_controller->getCollectiblePosition()); } void PowerupView::update() { - powerup_sprite.setPosition(powerup_controller->getCollectiblePosition()); + powerup_image->setPosition(powerup_controller->getCollectiblePosition()); + powerup_image->update(); } void PowerupView::render() { - game_window->draw(powerup_sprite); + powerup_image->render(); + } + + sf::String PowerupView::getPowerupTexturePath() + { + switch (powerup_controller->getPowerupType()) + { + case::Powerup::PowerupType::SHIELD: + return Config::shield_texture_path; + + case::Powerup::PowerupType::TRIPPLE_LASER: + return Config::tripple_laser_texture_path; + + case::Powerup::PowerupType::RAPID_FIRE: + return Config::rapid_fire_texture_path; + + case::Powerup::PowerupType::OUTSCAL_BOMB: + return Config::outscal_bomb_texture_path; + } + } + + void PowerupView::destroy() + { + delete(powerup_image); } } \ No newline at end of file diff --git a/Space-Invaders/Source/UI/MainMenu/MainMenuUIController.cpp b/Space-Invaders/Source/UI/MainMenu/MainMenuUIController.cpp index 4e2a876f6..c33f7f73e 100644 --- a/Space-Invaders/Source/UI/MainMenu/MainMenuUIController.cpp +++ b/Space-Invaders/Source/UI/MainMenu/MainMenuUIController.cpp @@ -1,136 +1,124 @@ #include "../../Header/UI/MainMenu/MainMenuUIController.h" -#include "../../Header/UI/MainMenu/MainMenuUIController.h" #include "../../Header/Main/GameService.h" #include "../../Header/Global/ServiceLocator.h" #include "../../Header/Graphic/GraphicService.h" #include "../../Header/Global/Config.h" +#include "../../Header/Sound/SoundService.h" +#include "../../Header/Event/EventService.h" namespace UI { - namespace MainMenu //nested namespace since everything in MainMenu exists inside UI + namespace MainMenu { using namespace Global; using namespace Main; - using namespace Graphics; - using namespace Event; + using namespace UIElement; using namespace Sound; - MainMenuUIController::MainMenuUIController() { game_window = nullptr; } + MainMenuUIController::MainMenuUIController() + { + createImage(); + createButtons(); + } + + MainMenuUIController::~MainMenuUIController() + { + destroy(); + } void MainMenuUIController::initialize() { - game_window = Global::ServiceLocator::getInstance()->getGraphicService()->getGameWindow();// added global to access initializeBackgroundImage(); initializeButtons(); + registerButtonCallback(); } - void MainMenuUIController::initializeBackgroundImage() - { //check if a texture loaded properly - if (background_texture.loadFromFile(Config::background_texture_path)) - { //if it did then set the bg image and scale it - background_sprite.setTexture(background_texture); - scaleBackgroundImage(); - } + void MainMenuUIController::createImage() + { + background_image = new ImageView(); } - void MainMenuUIController::scaleBackgroundImage() + void MainMenuUIController::createButtons() { - background_sprite.setScale( - static_cast(game_window->getSize().x) / background_sprite.getTexture()->getSize().x, - static_cast(game_window->getSize().y) / background_sprite.getTexture()->getSize().y - ); + play_button = new ButtonView(); + instructions_button = new ButtonView(); + quit_button = new ButtonView(); } - void MainMenuUIController::initializeButtons() + void MainMenuUIController::initializeBackgroundImage() { - // check if the tectures loaded - if (loadButtonTexturesFromFile()) - { - // order of function calls matter - setButtonSprites(); - scaleAllButttons(); - positionButtons(); - } + sf::RenderWindow* game_window = Global::ServiceLocator::getInstance()->getGraphicService()->getGameWindow(); + + background_image->initialize(Config::background_texture_path, game_window->getSize().x, game_window->getSize().y, sf::Vector2f(0, 0)); + background_image->setImageAlpha(background_alpha); } - // only returns true if all tectures are loaded - bool MainMenuUIController::loadButtonTexturesFromFile() + + void MainMenuUIController::initializeButtons() { - return play_button_texture.loadFromFile(Config::play_button_texture_path) && - instructions_button_texture.loadFromFile(Config::instructions_button_texture_path) && - quit_button_texture.loadFromFile(Config::quit_button_texture_path); + play_button->initialize("Play Button", Config::play_button_texture_path, button_width, button_height, sf::Vector2f(0, play_button_y_position)); + instructions_button->initialize("Instructions Button", Config::instructions_button_texture_path, button_width, button_height, sf::Vector2f(0, instructions_button_y_position)); + quit_button->initialize("Quit Button", Config::quit_button_texture_path, button_width, button_height, sf::Vector2f(0, quit_button_y_position)); + + play_button->setCentreAlinged(); + instructions_button->setCentreAlinged(); + quit_button->setCentreAlinged(); } - void MainMenuUIController::setButtonSprites() + void MainMenuUIController::registerButtonCallback() { - play_button_sprite.setTexture(play_button_texture); - instructions_button_sprite.setTexture(instructions_button_texture); - quit_button_sprite.setTexture(quit_button_texture); + play_button->registerCallbackFuntion(std::bind(&MainMenuUIController::playButtonCallback, this)); + instructions_button->registerCallbackFuntion(std::bind(&MainMenuUIController::instructionsButtonCallback, this)); + quit_button->registerCallbackFuntion(std::bind(&MainMenuUIController::quitButtonCallback, this)); } - - void MainMenuUIController::scaleAllButttons() + void MainMenuUIController::playButtonCallback() { - scaleButton(&play_button_sprite); - scaleButton(&instructions_button_sprite); - scaleButton(&quit_button_sprite); + Global::ServiceLocator::getInstance()->getSoundService()->playSound(SoundType::BUTTON_CLICK); + GameService::setGameState(GameState::GAMEPLAY); } - void MainMenuUIController::scaleButton(sf::Sprite* button_to_scale) + void MainMenuUIController::instructionsButtonCallback() { - button_to_scale->setScale( - button_width / button_to_scale->getTexture()->getSize().x, - button_height / button_to_scale->getTexture()->getSize().y - ); + Global::ServiceLocator::getInstance()->getSoundService()->playSound(SoundType::BUTTON_CLICK); } - void MainMenuUIController::positionButtons() + void MainMenuUIController::quitButtonCallback() { - float x_position = (static_cast(game_window->getSize().x) / 2) - button_width / 2; - - play_button_sprite.setPosition({ x_position, 500.f }); - instructions_button_sprite.setPosition({ x_position, 700.f }); - quit_button_sprite.setPosition({ x_position, 900.f }); + Global::ServiceLocator::getInstance()->getGraphicService()->getGameWindow()->close(); } - void MainMenuUIController::processButtonInteractions() + void MainMenuUIController::update() { - sf::Vector2f mouse_position = sf::Vector2f(sf::Mouse::getPosition(*game_window)); - - if (clickedButton(&play_button_sprite, mouse_position)) - { - Global::ServiceLocator::getInstance()->getSoundService()->playSound(SoundType::BUTTON_CLICK); //play button sound - Global::ServiceLocator::getInstance()->getSoundService()->playBackgroundMusic(); //play background music - GameService::setGameState(GameState::GAMEPLAY); - } - - if (clickedButton(&instructions_button_sprite, mouse_position)) - { - printf("Clicked Instruction Button \\n"); - } - - if (clickedButton(&quit_button_sprite, mouse_position)) - { - game_window->close(); - } + background_image->update(); + play_button->update(); + instructions_button->update(); + quit_button->update(); } - bool MainMenuUIController::clickedButton(sf::Sprite* button_sprite, sf::Vector2f mouse_position) + void MainMenuUIController::render() { - EventService* event_service = Global::ServiceLocator::getInstance()->getEventService(); - return event_service->pressedLeftMouseButton() && button_sprite->getGlobalBounds().contains(mouse_position); + background_image->render(); + play_button->render(); + instructions_button->render(); + quit_button->render(); } - void MainMenuUIController::update() + void MainMenuUIController::show() { - processButtonInteractions(); + background_image->show(); + play_button->show(); + instructions_button->show(); + quit_button->show(); + + Global::ServiceLocator::getInstance()->getSoundService()->playBackgroundMusic(); } - void MainMenuUIController::render() + void MainMenuUIController::destroy() { - game_window->draw(background_sprite); - game_window->draw(play_button_sprite); - game_window->draw(instructions_button_sprite); - game_window->draw(quit_button_sprite); + delete (play_button); + delete (instructions_button); + delete (quit_button); + delete (background_image); } } } \ No newline at end of file diff --git a/Space-Invaders/Source/UI/UIElement/ButtonView.cpp b/Space-Invaders/Source/UI/UIElement/ButtonView.cpp new file mode 100644 index 000000000..a8aaeb26f --- /dev/null +++ b/Space-Invaders/Source/UI/UIElement/ButtonView.cpp @@ -0,0 +1,64 @@ +#include "../../header/UI/UIElement/ButtonView.h" +#include "../../header/Global/ServiceLocator.h" +#include "../../header/Event/EventService.h" +#include "../../header/Sound/SoundService.h" + +namespace UI +{ + namespace UIElement + { + using namespace Event; + using namespace Global; + + ButtonView::ButtonView() = default; + + ButtonView::~ButtonView() = default; + + void ButtonView::initialize(sf::String title, sf::String texture_path, float button_width, float button_height, sf::Vector2f position) + { + ImageView::initialize(texture_path, button_width, button_height, position); + button_title = title; + } + + void ButtonView::registerCallbackFuntion(CallbackFunction button_callback) + { + callback_function = button_callback; + } + + void ButtonView::update() + { + ImageView::update(); + + if (ui_state == UIState::VISIBLE) + { + handleButtonInteraction(); + } + } + + void ButtonView::render() + { + ImageView::render(); + } + + void ButtonView::handleButtonInteraction() + { + sf::Vector2f mouse_position = sf::Vector2f(sf::Mouse::getPosition(*game_window)); + + if (clickedButton(&image_sprite, mouse_position)) + { + if (callback_function) callback_function(); + } + } + + bool ButtonView::clickedButton(sf::Sprite* button_sprite, sf::Vector2f mouse_position) + { + return ServiceLocator::getInstance()->getEventService()->pressedLeftMouseButton() && + button_sprite->getGlobalBounds().contains(mouse_position); + } + + void ButtonView::printButtonClicked() + { + printf("Clicked %s\n", button_title.toAnsiString().c_str()); + } + } +} \ No newline at end of file diff --git a/Space-Invaders/Source/UI/UIElement/ImageView.cpp b/Space-Invaders/Source/UI/UIElement/ImageView.cpp new file mode 100644 index 000000000..c9e934c8c --- /dev/null +++ b/Space-Invaders/Source/UI/UIElement/ImageView.cpp @@ -0,0 +1,80 @@ +#include "../../header/UI/UIElement/ImageView.h" + +namespace UI +{ + namespace UIElement + { + ImageView::ImageView() = default; + + ImageView::~ImageView() = default; + + void ImageView::initialize(sf::String texture_path, float image_width, float image_height, sf::Vector2f position) + { + UIView::initialize(); + setTexture(texture_path); + setScale(image_width, image_height); + setPosition(position); + } + + void ImageView::update() + { + UIView::update(); + } + + void ImageView::render() + { + UIView::render(); + + if (ui_state == UIState::VISIBLE) + { + game_window->draw(image_sprite); + } + } + + void ImageView::setTexture(sf::String texture_path) + { + if (image_texture.loadFromFile(texture_path)) + { + image_sprite.setTexture(image_texture); + } + } + + void ImageView::setScale(float width, float height) + { + float scale_x = width / image_sprite.getTexture()->getSize().x; + float scale_y = height / image_sprite.getTexture()->getSize().y; + + image_sprite.setScale(scale_x, scale_y); + } + + void ImageView::setPosition(sf::Vector2f position) + { + image_sprite.setPosition(position); + } + + void ImageView::setRotation(float rotation_angle) + { + image_sprite.setRotation(rotation_angle); + } + + void ImageView::setOriginAtCentre() + { + image_sprite.setOrigin(image_sprite.getLocalBounds().width / 2, image_sprite.getLocalBounds().height / 2); + } + + void ImageView::setImageAlpha(float alpha) + { + sf::Color color = image_sprite.getColor(); + color.a = alpha; + image_sprite.setColor(color); + } + + void ImageView::setCentreAlinged() + { + float x_position = (game_window->getSize().x / 2) - (image_sprite.getGlobalBounds().width / 2); + float y_position = image_sprite.getGlobalBounds().getPosition().y; + + image_sprite.setPosition(x_position, y_position); + } + } +} \ No newline at end of file diff --git a/Space-Invaders/Source/UI/UIElement/TextView.cpp b/Space-Invaders/Source/UI/UIElement/TextView.cpp new file mode 100644 index 000000000..400b351b7 --- /dev/null +++ b/Space-Invaders/Source/UI/UIElement/TextView.cpp @@ -0,0 +1,95 @@ +#include "../../Header/UI/UIElement/TextView.h" +#include "../../Header/Global/Config.h" + +namespace UI +{ + namespace UIElement + { + using namespace Global; + + sf::Font TextView::font_bubble_bobble; + sf::Font TextView::font_DS_DIGIB; + + TextView::TextView() = default; + + TextView::~TextView() = default; + + void TextView::initialize(sf::String text_value, sf::Vector2f position, FontType font_type, int font_size, sf::Color color) + { + UIView::initialize(); + + setText(text_value); + setTextPosition(position); + setFont(font_type); + setFontSize(font_size); + setTextColor(color); + } + + void TextView::update() + { + UIView::update(); + } + + void TextView::render() + { + UIView::render(); + + if (ui_state == UIState::VISIBLE) + { + game_window->draw(text); + } + } + + void TextView::initializeTextView() + { + loadFont(); + } + + void TextView::loadFont() + { + font_bubble_bobble.loadFromFile(Config::bubble_bobble_font_path); + font_DS_DIGIB.loadFromFile(Config::DS_DIGIB_font_path); + } + + void TextView::setText(sf::String text_value) + { + text.setString(text_value); + } + + void TextView::setFont(FontType font_type) + { + switch (font_type) + { + case FontType::BUBBLE_BOBBLE: + text.setFont(font_bubble_bobble); + break; + case FontType::DS_DIGIB: + text.setFont(font_DS_DIGIB); + break; + } + } + + void TextView::setFontSize(int font_size) + { + text.setCharacterSize(font_size); + } + + void TextView::setTextPosition(sf::Vector2f position) + { + text.setPosition(position); + } + + void TextView::setTextColor(sf::Color color) + { + text.setFillColor(color); + } + + void TextView::setTextCentreAligned() + { + float x_position = (game_window->getSize().x - text.getLocalBounds().width) / 2; + float y_position = text.getGlobalBounds().getPosition().y; + + text.setPosition(sf::Vector2f(x_position, y_position)); + } + } +} \ No newline at end of file diff --git a/Space-Invaders/Source/UI/UIElement/UIView.cpp b/Space-Invaders/Source/UI/UIElement/UIView.cpp new file mode 100644 index 000000000..3b500c488 --- /dev/null +++ b/Space-Invaders/Source/UI/UIElement/UIView.cpp @@ -0,0 +1,36 @@ +#include "../../header/UI/UIElement/UIView.h" +#include "../../header/Global/ServiceLocator.h" +#include "../../Header/Graphic/GraphicService.h" + +namespace UI +{ + namespace UIElement + { + using namespace Global; + using namespace Graphics; + + UIView::UIView() = default; + + UIView::~UIView() = default; + + void UIView::initialize() + { + game_window = ServiceLocator::getInstance()->getGraphicService()->getGameWindow(); + ui_state = UIState::VISIBLE; + } + + void UIView::update() { } + + void UIView::render() { } + + void UIView::show() + { + ui_state = UIState::VISIBLE; + } + + void UIView::hide() + { + ui_state = UIState::HIDDEN; + } + } +} \ No newline at end of file diff --git a/Space-Invaders/Source/UI/UIService.cpp b/Space-Invaders/Source/UI/UIService.cpp index 3e60dec73..5ca4a2768 100644 --- a/Space-Invaders/Source/UI/UIService.cpp +++ b/Space-Invaders/Source/UI/UIService.cpp @@ -1,10 +1,13 @@ #include "../../Header/UI/UIService.h" #include "../../Header/Main/GameService.h" +#include "../../Header/UI/UIElement/TextView.h" namespace UI { using namespace Main; using namespace MainMenu; + using namespace UIElement; + using namespace Interface; UIService::UIService() { @@ -25,8 +28,8 @@ namespace UI void UIService::initialize() { + TextView::initializeTextView(); initializeControllers(); - } void UIService::update() @@ -49,11 +52,29 @@ namespace UI } } + void UIService::showScreen() + { + IUIController* ui_controller = getCurrentUIController(); + if (ui_controller) ui_controller->show(); + } + void UIService::initializeControllers() { main_menu_controller->initialize(); } + IUIController* UIService::getCurrentUIController() + { + switch (GameService::getGameState()) + { + case GameState::MAIN_MENU: + return main_menu_controller; + + default: + return nullptr; + } + } + void UIService::destroy() { delete(main_menu_controller); From 51b073faa12f842fe5af8f5cbfac249074836a39 Mon Sep 17 00:00:00 2001 From: Rishi Saxena Date: Sun, 11 Aug 2024 14:58:35 +0530 Subject: [PATCH 45/56] Add files via upload --- Header/Bullet/BulletConfig.h | 16 +++++ Header/Bullet/BulletController.h | 37 ++++++++++ Header/Bullet/BulletModel.h | 42 ++++++++++++ Header/Bullet/BulletService.h | 33 +++++++++ Header/Bullet/BulletView.h | 34 ++++++++++ .../Controllers/FrostBulletController.h | 20 ++++++ .../Controllers/LaserBulletController.h | 17 +++++ Header/Bullet/Controllers/TorpedoController.h | 20 ++++++ Header/Collectible/ICollectible.h | 17 +++++ Header/Element/Bunker/BunkerController.h | 28 ++++++++ Header/Element/Bunker/BunkerModel.h | 15 +++++ Header/Element/Bunker/BunkerView.h | 34 ++++++++++ Header/Element/ElementService.h | 34 ++++++++++ Header/Enemy/Controllers/SubZeroController.h | 30 +++++++++ .../Controllers/ThunderSnakeController.h | 31 +++++++++ Header/Enemy/Controllers/UFOController.h | 27 ++++++++ Header/Enemy/Controllers/ZapperController.h | 31 +++++++++ Header/Enemy/EnemyConfig.h | 28 ++++++++ Header/Enemy/EnemyController.h | 47 +++++++++++++ Header/Enemy/EnemyModel.h | 49 ++++++++++++++ Header/Enemy/EnemyService.h | 35 ++++++++++ Header/Enemy/EnemyView.h | 34 ++++++++++ Header/Entity/EntityConfig.h | 12 ++++ Header/Event/EventService.h | 56 ++++++++++++++++ Header/Gameplay/GameplayController.h | 21 ++++++ Header/Gameplay/GameplayService.h | 19 ++++++ Header/Gameplay/GameplayView.h | 31 +++++++++ Header/Global/Config.h | 39 +++++++++++ Header/Global/ServiceLocator.h | 67 +++++++++++++++++++ Header/Graphic/GraphicService.h | 41 ++++++++++++ Header/Main/GameService.h | 42 ++++++++++++ Header/Player/PlayerController.h | 33 +++++++++ Header/Player/PlayerModel.h | 47 +++++++++++++ Header/Player/PlayerService.h | 19 ++++++ Header/Player/PlayerView.h | 30 +++++++++ .../Controllers/OutscalBombController.h | 17 +++++ .../Controllers/RapidFireController.h | 17 +++++ .../Powerups/Controllers/ShieldController.h | 17 +++++ .../Controllers/TrippleLaserController.h | 17 +++++ Header/Powerups/PowerupConfig.h | 11 +++ Header/Powerups/PowerupController.h | 33 +++++++++ Header/Powerups/PowerupModel.h | 31 +++++++++ Header/Powerups/PowerupService.h | 32 +++++++++ Header/Powerups/PowerupView.h | 33 +++++++++ Header/Projectile/IProjectile.h | 21 ++++++ Header/Sound/SoundService.h | 29 ++++++++ Header/Time/TimeService.h | 32 +++++++++ Header/UI/Interface/IUIController.h | 18 +++++ Header/UI/MainMenu/MainMenuUIController.h | 52 ++++++++++++++ Header/UI/UIElement/ButtonView.h | 37 ++++++++++ Header/UI/UIElement/ImageView.h | 31 +++++++++ Header/UI/UIElement/TextView.h | 45 +++++++++++++ Header/UI/UIElement/UIView.h | 33 +++++++++ Header/UI/UIService.h | 26 +++++++ 54 files changed, 1648 insertions(+) create mode 100644 Header/Bullet/BulletConfig.h create mode 100644 Header/Bullet/BulletController.h create mode 100644 Header/Bullet/BulletModel.h create mode 100644 Header/Bullet/BulletService.h create mode 100644 Header/Bullet/BulletView.h create mode 100644 Header/Bullet/Controllers/FrostBulletController.h create mode 100644 Header/Bullet/Controllers/LaserBulletController.h create mode 100644 Header/Bullet/Controllers/TorpedoController.h create mode 100644 Header/Collectible/ICollectible.h create mode 100644 Header/Element/Bunker/BunkerController.h create mode 100644 Header/Element/Bunker/BunkerModel.h create mode 100644 Header/Element/Bunker/BunkerView.h create mode 100644 Header/Element/ElementService.h create mode 100644 Header/Enemy/Controllers/SubZeroController.h create mode 100644 Header/Enemy/Controllers/ThunderSnakeController.h create mode 100644 Header/Enemy/Controllers/UFOController.h create mode 100644 Header/Enemy/Controllers/ZapperController.h create mode 100644 Header/Enemy/EnemyConfig.h create mode 100644 Header/Enemy/EnemyController.h create mode 100644 Header/Enemy/EnemyModel.h create mode 100644 Header/Enemy/EnemyService.h create mode 100644 Header/Enemy/EnemyView.h create mode 100644 Header/Entity/EntityConfig.h create mode 100644 Header/Event/EventService.h create mode 100644 Header/Gameplay/GameplayController.h create mode 100644 Header/Gameplay/GameplayService.h create mode 100644 Header/Gameplay/GameplayView.h create mode 100644 Header/Global/Config.h create mode 100644 Header/Global/ServiceLocator.h create mode 100644 Header/Graphic/GraphicService.h create mode 100644 Header/Main/GameService.h create mode 100644 Header/Player/PlayerController.h create mode 100644 Header/Player/PlayerModel.h create mode 100644 Header/Player/PlayerService.h create mode 100644 Header/Player/PlayerView.h create mode 100644 Header/Powerups/Controllers/OutscalBombController.h create mode 100644 Header/Powerups/Controllers/RapidFireController.h create mode 100644 Header/Powerups/Controllers/ShieldController.h create mode 100644 Header/Powerups/Controllers/TrippleLaserController.h create mode 100644 Header/Powerups/PowerupConfig.h create mode 100644 Header/Powerups/PowerupController.h create mode 100644 Header/Powerups/PowerupModel.h create mode 100644 Header/Powerups/PowerupService.h create mode 100644 Header/Powerups/PowerupView.h create mode 100644 Header/Projectile/IProjectile.h create mode 100644 Header/Sound/SoundService.h create mode 100644 Header/Time/TimeService.h create mode 100644 Header/UI/Interface/IUIController.h create mode 100644 Header/UI/MainMenu/MainMenuUIController.h create mode 100644 Header/UI/UIElement/ButtonView.h create mode 100644 Header/UI/UIElement/ImageView.h create mode 100644 Header/UI/UIElement/TextView.h create mode 100644 Header/UI/UIElement/UIView.h create mode 100644 Header/UI/UIService.h diff --git a/Header/Bullet/BulletConfig.h b/Header/Bullet/BulletConfig.h new file mode 100644 index 000000000..3d40244af --- /dev/null +++ b/Header/Bullet/BulletConfig.h @@ -0,0 +1,16 @@ +#pragma once +namespace Bullet +{ + enum class BulletType + { + LASER_BULLET, + TORPEDO, + FROST_BULLET, + }; + + enum class MovementDirection + { + UP, //player needs to shoot in upward direction + DOWN, // enemies always shoot in downward direction + }; +} \ No newline at end of file diff --git a/Header/Bullet/BulletController.h b/Header/Bullet/BulletController.h new file mode 100644 index 000000000..2d66e5f0b --- /dev/null +++ b/Header/Bullet/BulletController.h @@ -0,0 +1,37 @@ +#pragma once +#include "../../Header/Projectile/IProjectile.h" +#include "../../Header/Bullet/BulletConfig.h" +#include "../../Header/Entity/EntityConfig.h" + +namespace Bullet +{ + class BulletView; + class BulletModel; + enum class BulletType; + + class BulletController : public Projectile::IProjectile + { + protected: + + BulletView* bullet_view; + BulletModel* bullet_model; + + void updateProjectilePosition() override; + + void moveUp(); + void moveDown(); + void handleOutOfBounds(); + + public: + + BulletController(BulletType type, Entity::EntityType owner_type); + virtual ~BulletController() override; + void initialize(sf::Vector2f position, Bullet::MovementDirection direction) override; + void update() override; + void render() override; + + sf::Vector2f getProjectilePosition() override; + BulletType getBulletType(); + Entity::EntityType getOwnerEntityType(); + }; +} \ No newline at end of file diff --git a/Header/Bullet/BulletModel.h b/Header/Bullet/BulletModel.h new file mode 100644 index 000000000..ad99418ec --- /dev/null +++ b/Header/Bullet/BulletModel.h @@ -0,0 +1,42 @@ +#pragma once +#include +#include "../../Header/Entity/EntityConfig.h" + +namespace Bullet +{ + enum class BulletType; + enum class MovementDirection; + + class BulletModel + { + private: + float movement_speed = 300.f; + sf::Vector2f bullet_position; + + BulletType bullet_type; + MovementDirection movement_direction; + + Entity::EntityType owner_type; + + public: + + BulletModel(BulletType type, Entity::EntityType owner_type); + ~BulletModel(); + + void initialize(sf::Vector2f position, MovementDirection direction); + + sf::Vector2f getBulletPosition(); + void setBulletPosition(sf::Vector2f position); + + BulletType getBulletType(); + void setBulletType(BulletType type); + + MovementDirection getMovementDirection(); + void setMovementDirection(MovementDirection direction); + + float getMovementSpeed(); + void setMovementSpeed(float speed); + + Entity::EntityType getOwnerEntityType(); + }; +} \ No newline at end of file diff --git a/Header/Bullet/BulletService.h b/Header/Bullet/BulletService.h new file mode 100644 index 000000000..02f77423a --- /dev/null +++ b/Header/Bullet/BulletService.h @@ -0,0 +1,33 @@ +#pragma once +#include +#include "SFML/System/Vector2.hpp" +#include "../../Header/Projectile/IProjectile.h" +#include "../../Header/Entity/EntityConfig.h" + +namespace Bullet +{ + class BulletController; + enum class BulletType; + enum class MovementDirection; + + class BulletService + { + private: + + std::vector bullet_list; + + BulletController* createBullet(BulletType bullet_type, Entity::EntityType owner_type); + void destroy(); + + public: + BulletService(); + virtual ~BulletService(); + + void initialize(); + void update(); + void render(); + + BulletController* spawnBullet(BulletType bullet_type, sf::Vector2f position, MovementDirection direction, Entity::EntityType owner_type); + void destroyBullet(BulletController* bullet_controller); + }; +} \ No newline at end of file diff --git a/Header/Bullet/BulletView.h b/Header/Bullet/BulletView.h new file mode 100644 index 000000000..52bf08af7 --- /dev/null +++ b/Header/Bullet/BulletView.h @@ -0,0 +1,34 @@ +#pragma once +#include +#include "../../Header/Bullet/BulletController.h" +#include "../../Header/UI/UIElement/ImageView.h" + +namespace Bullet +{ + class BulletController; + enum class BulletType; + + class BulletView + { + private: + const float bullet_sprite_width = 18.f; + const float bullet_sprite_height = 18.f; + + BulletController* bullet_controller; + UI::UIElement::ImageView* bullet_image; + + void createUIElements(); + void initializeImage(); + sf::String getBulletTexturePath(); + + void destroy(); + + public: + BulletView(); + ~BulletView(); + + void initialize(BulletController* controller); + void update(); + void render(); + }; +} \ No newline at end of file diff --git a/Header/Bullet/Controllers/FrostBulletController.h b/Header/Bullet/Controllers/FrostBulletController.h new file mode 100644 index 000000000..3188333d9 --- /dev/null +++ b/Header/Bullet/Controllers/FrostBulletController.h @@ -0,0 +1,20 @@ +#pragma once +#include "../../Header/Bullet/BulletController.h" + +namespace Bullet +{ + namespace Controller + { + class FrostBulletController : public BulletController + { + private: + const float torpedo_movement_speed = 500.f; + + public: + FrostBulletController(BulletType type); + ~FrostBulletController(); + + void initialize(sf::Vector2f position, MovementDirection direction) override; + }; + } +} \ No newline at end of file diff --git a/Header/Bullet/Controllers/LaserBulletController.h b/Header/Bullet/Controllers/LaserBulletController.h new file mode 100644 index 000000000..67a48b89f --- /dev/null +++ b/Header/Bullet/Controllers/LaserBulletController.h @@ -0,0 +1,17 @@ +#pragma once +#include "../../Header/Bullet/BulletController.h" + +namespace Bullet +{ + namespace Controller + { + class LaserBulletController : public BulletController + { + public: + LaserBulletController(BulletType type); + ~LaserBulletController(); + + void initialize(sf::Vector2f position, MovementDirection direction) override; + }; + } +} \ No newline at end of file diff --git a/Header/Bullet/Controllers/TorpedoController.h b/Header/Bullet/Controllers/TorpedoController.h new file mode 100644 index 000000000..99ac2d88a --- /dev/null +++ b/Header/Bullet/Controllers/TorpedoController.h @@ -0,0 +1,20 @@ +#pragma once +#include "../../Header/Bullet/BulletController.h" + +namespace Bullet +{ + namespace Controller + { + class TorpedoController : public BulletController + { + private: + const float torpedo_movement_speed = 200.f; + + public: + TorpedoController(BulletType type); + ~TorpedoController(); + + void initialize(sf::Vector2f position, MovementDirection direction) override; + }; + } +} \ No newline at end of file diff --git a/Header/Collectible/ICollectible.h b/Header/Collectible/ICollectible.h new file mode 100644 index 000000000..d1405aa13 --- /dev/null +++ b/Header/Collectible/ICollectible.h @@ -0,0 +1,17 @@ +#pragma once +#include + +namespace Collectible +{ + class ICollectible + { + public: + virtual void onCollected() = 0; + virtual void initialize(sf::Vector2f position) = 0; + virtual void update() = 0; + virtual void render() = 0; + virtual sf::Vector2f getCollectiblePosition() = 0; + + virtual ~ICollectible() {}; + }; +} diff --git a/Header/Element/Bunker/BunkerController.h b/Header/Element/Bunker/BunkerController.h new file mode 100644 index 000000000..3370da4b2 --- /dev/null +++ b/Header/Element/Bunker/BunkerController.h @@ -0,0 +1,28 @@ +#pragma once +#include +#include "../../header/Element/Bunker/BunkerModel.h" + +namespace Element +{ + namespace Bunker + { + class BunkerView; + + class BunkerController + { + private: + BunkerView* bunker_view; + BunkerData bunker_data; + + public: + BunkerController(); + ~BunkerController(); + + void initialize(BunkerData data); + void update(); + void render(); + + sf::Vector2f getBunkerPosition(); + }; + } +} \ No newline at end of file diff --git a/Header/Element/Bunker/BunkerModel.h b/Header/Element/Bunker/BunkerModel.h new file mode 100644 index 000000000..7ae912814 --- /dev/null +++ b/Header/Element/Bunker/BunkerModel.h @@ -0,0 +1,15 @@ +#pragma once +#include + +namespace Element +{ + namespace Bunker + { + struct BunkerData + { + sf::Vector2f position; + BunkerData(); + BunkerData(sf::Vector2f position); + }; + } +} \ No newline at end of file diff --git a/Header/Element/Bunker/BunkerView.h b/Header/Element/Bunker/BunkerView.h new file mode 100644 index 000000000..9bf2ac2de --- /dev/null +++ b/Header/Element/Bunker/BunkerView.h @@ -0,0 +1,34 @@ +#pragma once +#include +#include "../../Header/UI/UIElement/ImageView.h" + +namespace Element +{ + namespace Bunker + { + class BunkerController; + + class BunkerView + { + private: + const float bunker_sprite_width = 80.f; + const float bunker_sprite_height = 80.f; + + BunkerController* bunker_controller; + UI::UIElement::ImageView* bunker_image; + + void createUIElements(); + void initializeImage(); + + void destroy(); + + public: + BunkerView(); + ~BunkerView(); + + void initialize(BunkerController* controller); + void update(); + void render(); + }; + } +} \ No newline at end of file diff --git a/Header/Element/ElementService.h b/Header/Element/ElementService.h new file mode 100644 index 000000000..e9c4c8719 --- /dev/null +++ b/Header/Element/ElementService.h @@ -0,0 +1,34 @@ +#pragma once +#include +#include +#include "../../header/Element/Bunker/BunkerController.h" +#include "../../header/Element/Bunker/BunkerModel.h" + +namespace Element +{ + class BunkerController; + + class ElementService + { + private: + //const vector so that the default values will not be changed down the road by mistake. + const std::vector bunker_data_list = { Bunker::BunkerData(sf::Vector2f(130.f, 800.f)), + Bunker::BunkerData(sf::Vector2f(430.0f, 800.f)), + Bunker::BunkerData(sf::Vector2f(730.0f, 800.f)), + Bunker::BunkerData(sf::Vector2f(1130.0f, 800.f)), + Bunker::BunkerData(sf::Vector2f(1430.0f, 800.f)), + Bunker::BunkerData(sf::Vector2f(1730.0f, 800.f)) }; + + std::vector bunker_list; + + void destroy(); + + public: + ElementService(); + virtual ~ElementService(); + + void initialize(); + void update(); + void render(); + }; +} \ No newline at end of file diff --git a/Header/Enemy/Controllers/SubZeroController.h b/Header/Enemy/Controllers/SubZeroController.h new file mode 100644 index 000000000..d27ae5a7f --- /dev/null +++ b/Header/Enemy/Controllers/SubZeroController.h @@ -0,0 +1,30 @@ +#pragma once + +#include "../../header/Enemy/EnemyController.h" + +namespace Enemy +{ + namespace Controller + { + class SubzeroController : public EnemyController + { + private: + + float vertical_movement_speed = 100.f; + const float subzero_rate_of_fire = 2.f; + + void move() override; + void moveDown(); + + void fireBullet() override; + + public: + + SubzeroController(EnemyType type); + ~SubzeroController(); + + void initialize() override; + + }; + } +} \ No newline at end of file diff --git a/Header/Enemy/Controllers/ThunderSnakeController.h b/Header/Enemy/Controllers/ThunderSnakeController.h new file mode 100644 index 000000000..77211e9ef --- /dev/null +++ b/Header/Enemy/Controllers/ThunderSnakeController.h @@ -0,0 +1,31 @@ +#pragma once +#include "../../Header/Enemy/EnemyController.h" +#include "../../Header/Enemy/EnemyConfig.h" + +namespace Enemy +{ + namespace Controller + { + class ThunderSnakeController : public EnemyController + { + private: + const float thunder_snake_horizontal_movement_speed = 190.f; + + void move() override; + void moveLeft(); + void moveRight(); + void moveDiagonalLeft(); + void moveDiagonalRight(); + + void fireBullet() override; + + MovementDirection getInitialMovementDirection(); + + public: + ThunderSnakeController(EnemyType type); + ~ThunderSnakeController(); + + void initialize() override; + }; + } +} \ No newline at end of file diff --git a/Header/Enemy/Controllers/UFOController.h b/Header/Enemy/Controllers/UFOController.h new file mode 100644 index 000000000..c11dc5e03 --- /dev/null +++ b/Header/Enemy/Controllers/UFOController.h @@ -0,0 +1,27 @@ +#pragma once +#include "../../header/Enemy/EnemyController.h" +#include "../../header/Powerups/PowerupConfig.h" + +namespace Enemy +{ + namespace Controller + { + class UFOController : public EnemyController + { + private: + + void move() override; + void moveLeft(); + void moveRight(); + + void fireBullet() override; + Powerup::PowerupType getRandomPowerupType(); + + public: + UFOController(EnemyType type); + ~UFOController(); + + void initialize() override; + }; + } +} \ No newline at end of file diff --git a/Header/Enemy/Controllers/ZapperController.h b/Header/Enemy/Controllers/ZapperController.h new file mode 100644 index 000000000..fc5a3b414 --- /dev/null +++ b/Header/Enemy/Controllers/ZapperController.h @@ -0,0 +1,31 @@ +#pragma once + +#include "../../header/Enemy/EnemyController.h" + +namespace Enemy +{ + namespace Controller + { + class ZapperController : public EnemyController + { + private: + + float vertical_travel_distance = 100.f; + + void move() override; + void moveLeft(); + void moveRight(); + void moveDown(); + + void fireBullet() override; + + public: + + ZapperController(EnemyType type); + ~ZapperController(); + + void initialize() override; + + }; + } +} \ No newline at end of file diff --git a/Header/Enemy/EnemyConfig.h b/Header/Enemy/EnemyConfig.h new file mode 100644 index 000000000..81fa1b4d5 --- /dev/null +++ b/Header/Enemy/EnemyConfig.h @@ -0,0 +1,28 @@ +#pragma once + +namespace Enemy +{ + enum class EnemyType + { + ZAPPER, + SUBZERO, + THUNDER_SNAKE, + UFO, + }; + + enum class EnemyState + { + PATROLLING, + ATTACK, + DEAD, + }; + + enum class MovementDirection + { + LEFT, + RIGHT, + DOWN, + LEFT_DOWN, + RIGHT_DOWN, + }; +} \ No newline at end of file diff --git a/Header/Enemy/EnemyController.h b/Header/Enemy/EnemyController.h new file mode 100644 index 000000000..7b2a2a3c0 --- /dev/null +++ b/Header/Enemy/EnemyController.h @@ -0,0 +1,47 @@ +#pragma once +#include + +namespace Enemy +{ + class EnemyView; + class EnemyModel; + + enum class EnemyType; + enum class EnemyState; + + class EnemyController + { + + protected: + + float vertical_movement_speed = 30.f; + float horizontal_movement_speed = 200.0f; + + float rate_of_fire = 3.f; //we want to fire the bullet every 3 seconds + float elapsed_fire_duration = 0.f; //variable to check how long it has been since we last fired + + EnemyView* enemy_view; + EnemyModel* enemy_model; + + void updateFireTimer(); + void processBulletFire(); + virtual void fireBullet() = 0; + + virtual void move() = 0; + + sf::Vector2f getRandomInitialPosition(); + void handleOutOfBounds(); + + public: + EnemyController(EnemyType type); + virtual ~EnemyController(); + + virtual void initialize(); + void update(); + void render(); + + sf::Vector2f getEnemyPosition(); + EnemyState getEnemyState(); + EnemyType getEnemyType(); + }; +} \ No newline at end of file diff --git a/Header/Enemy/EnemyModel.h b/Header/Enemy/EnemyModel.h new file mode 100644 index 000000000..080cd9e83 --- /dev/null +++ b/Header/Enemy/EnemyModel.h @@ -0,0 +1,49 @@ +#pragma once +#include + +namespace Enemy +{ + enum class EnemyType; + enum class MovementDirection; + enum class EnemyState; + + class EnemyModel + { + private: + sf::Vector2f reference_position = sf::Vector2f(50.f, 50.f); + sf::Vector2f enemy_position; + + MovementDirection movement_direction; + EnemyType enemy_type; + EnemyState enemy_state; + + public: + EnemyModel(EnemyType type); + ~EnemyModel(); + + //const settings for enemy + const sf::Vector2f left_most_position = sf::Vector2f(50.f, 50.f); + const sf::Vector2f right_most_position = sf::Vector2f(1800.f, 50.f); + const sf::Vector2f barrel_position_offset = sf::Vector2f(20.f, 50.f); + + const float vertical_travel_distance = 100.f; + const float enemy_movement_speed = 250.0f; + + float vertical_movement_speed = 30.0f; + float horizontal_movement_speed = 100.0f; + + void initialize(); + + // Getters and Setters + sf::Vector2f getEnemyPosition(); + void setEnemyPosition(sf::Vector2f position); + sf::Vector2f getReferencePosition(); + void setReferencePosition(sf::Vector2f position); + EnemyState getEnemyState(); + void setEnemyState(EnemyState state); + EnemyType getEnemyType(); + void setEnemyType(EnemyType type); + MovementDirection getMovementDirection(); + void setMovementDirection(MovementDirection direction); + }; +} \ No newline at end of file diff --git a/Header/Enemy/EnemyService.h b/Header/Enemy/EnemyService.h new file mode 100644 index 000000000..8f9dd776f --- /dev/null +++ b/Header/Enemy/EnemyService.h @@ -0,0 +1,35 @@ +#pragma once +#include + +namespace Enemy +{ + class EnemyController; + enum class EnemyType; + + class EnemyService + { + private: + + const float spawn_interval = 2.f; + + std::vector enemy_list; + float spawn_timer; + + void updateSpawnTimer(); + void processEnemySpawn(); + EnemyType getRandomEnemyType(); + EnemyController* createEnemy(EnemyType enemy_type); + void destroy(); + + public: + EnemyService(); + ~EnemyService(); + + void initialize(); + void update(); + void render(); + + EnemyController* spawnEnemy(); // Function to spawn enemy + void destroyEnemy(EnemyController* enemy_controller); + }; +} \ No newline at end of file diff --git a/Header/Enemy/EnemyView.h b/Header/Enemy/EnemyView.h new file mode 100644 index 000000000..04258819c --- /dev/null +++ b/Header/Enemy/EnemyView.h @@ -0,0 +1,34 @@ +#pragma once + +#include +#include "../../Header/Enemy/EnemyConfig.h" +#include "../../Header/UI/UIElement/ImageView.h" + +namespace Enemy +{ + class EnemyController; + + class EnemyView + { + private: + const float enemy_sprite_width = 60.f; + const float enemy_sprite_height = 60.f; + + EnemyController* enemy_controller; + UI::UIElement::ImageView* enemy_image; + + void createUIElements(); + void initializeImage(); + sf::String getEnemyTexturePath(); + + void destroy(); + + public: + EnemyView(); + ~EnemyView(); + + void initialize(EnemyController* controller); + void update(); + void render(); + }; +} \ No newline at end of file diff --git a/Header/Entity/EntityConfig.h b/Header/Entity/EntityConfig.h new file mode 100644 index 000000000..234b5e75d --- /dev/null +++ b/Header/Entity/EntityConfig.h @@ -0,0 +1,12 @@ +#pragma once +namespace Entity +{ + enum class EntityType + { + PLAYER, + ENEMY, + BULLET, + BUNKER, + DEFAULT, + }; +} \ No newline at end of file diff --git a/Header/Event/EventService.h b/Header/Event/EventService.h new file mode 100644 index 000000000..ebecfd5d6 --- /dev/null +++ b/Header/Event/EventService.h @@ -0,0 +1,56 @@ +#pragma once + +#include +#include + +namespace Event +{ + enum class ButtonState + { + PRESSED, + HELD, + RELEASED, + }; + + class EventService + { + private: + sf::Event game_event; //event var + sf::RenderWindow* game_window; //ptr to our game window + + bool isGameWindowOpen(); + bool gameWindowWasClosed(); //for the condition we already had - the title bar cross. + bool hasQuitGame(); //for our new 'ESC' condition + + //Button States + ButtonState left_mouse_button_state; + ButtonState right_mouse_button_state; + ButtonState left_arrow_button_state; + ButtonState right_arrow_button_state; + ButtonState A_button_state; + ButtonState D_button_state; + + //Button and mouse state functions + void updateMouseButtonsState(ButtonState& current_button_state, sf::Mouse::Button mouse_button); + void updateKeyboardButtonsState(ButtonState& current_button_state, sf::Keyboard::Key keyboard_button); + + + public: + EventService(); + ~EventService(); + + void initialize(); + void update(); + void processEvents(); // while window is open we will check for events + bool pressedEscapeKey(); + bool isKeyboardEvent(); + bool pressedLeftKey(); // getting inputs for the player + bool pressedRightKey(); + bool pressedLeftMouseButton(); // Mouse inputs for the player + bool pressedRightMouseButton(); + bool pressedAKey(); // AD held check + bool pressedDKey(); + + }; +} + diff --git a/Header/Gameplay/GameplayController.h b/Header/Gameplay/GameplayController.h new file mode 100644 index 000000000..76b6fcf24 --- /dev/null +++ b/Header/Gameplay/GameplayController.h @@ -0,0 +1,21 @@ +#pragma once +#include + +namespace Gameplay +{ + class GameplayView; + + class GameplayController + { + private: + GameplayView* gameplay_view; + + public: + GameplayController(); + ~GameplayController(); + + void initialize(); + void update(); + void render(); + }; +} \ No newline at end of file diff --git a/Header/Gameplay/GameplayService.h b/Header/Gameplay/GameplayService.h new file mode 100644 index 000000000..53efd34a5 --- /dev/null +++ b/Header/Gameplay/GameplayService.h @@ -0,0 +1,19 @@ +#pragma once +namespace Gameplay +{ + class GameplayController; + + class GameplayService + { + private: + GameplayController* gameplay_controller; + + public: + GameplayService(); + ~GameplayService(); + + void initialize(); + void update(); + void render(); + }; +} \ No newline at end of file diff --git a/Header/Gameplay/GameplayView.h b/Header/Gameplay/GameplayView.h new file mode 100644 index 000000000..96772b0f8 --- /dev/null +++ b/Header/Gameplay/GameplayView.h @@ -0,0 +1,31 @@ +#pragma once +#include +#include "../../Header/UI/UIElement/ImageView.h" + +namespace Gameplay +{ + class GameplayController; + + class GameplayView + { + private: + sf::RenderWindow* game_window; + sf::Texture background_texture; + sf::Sprite background_sprite; + + const float background_alpha = 150.f; + + GameplayController* gameplay_controller; + UI::UIElement::ImageView* background_image; + + void initializeBackgroundImage(); + + public: + GameplayView(); + ~GameplayView(); + + void initialize(); + void update(); + void render(); + }; +} \ No newline at end of file diff --git a/Header/Global/Config.h b/Header/Global/Config.h new file mode 100644 index 000000000..385d119df --- /dev/null +++ b/Header/Global/Config.h @@ -0,0 +1,39 @@ +#pragma once +#include + +namespace Global +{ + class Config + { + public: + static const sf::String outscal_logo_texture_path; + static const sf::String background_texture_path; + static const sf::String player_texture_path; + + static const sf::String zapper_texture_path; + static const sf::String thunder_snake_texture_path; + static const sf::String subzero_texture_path; + static const sf::String ufo_texture_path; + static const sf::String bunker_texture_path; + + static const sf::String shield_texture_path; + static const sf::String tripple_laser_texture_path; + static const sf::String rapid_fire_texture_path; + static const sf::String outscal_bomb_texture_path; + + static const sf::String laser_bullet_texture_path; + static const sf::String torpedoe_texture_path; + static const sf::String frost_beam_texture_path; + + static const sf::String play_button_texture_path; + static const sf::String instructions_button_texture_path; + static const sf::String quit_button_texture_path; + static const sf::String menu_button_texture_path; + + static const sf::String bubble_bobble_font_path; + static const sf::String DS_DIGIB_font_path; + + static const sf::String background_music_path; + static const sf::String button_click_sound_path; + }; +} diff --git a/Header/Global/ServiceLocator.h b/Header/Global/ServiceLocator.h new file mode 100644 index 000000000..ba6b11743 --- /dev/null +++ b/Header/Global/ServiceLocator.h @@ -0,0 +1,67 @@ +#pragma once +#include "../../Header/Graphic/GraphicService.h" +#include "../../Header/Event/EventService.h" +#include "../../Header/Player/PlayerService.h" +#include "../../Header/Time/TimeService.h" +#include "../../Header/UI/UIService.h" +#include "../../Header/Enemy/EnemyService.h" +#include "../../Header/Gameplay/GameplayService.h" +#include "../../Header/Element/ElementService.h" +#include "../../Header/Sound/SoundService.h" +#include "../../Header/Bullet/BulletService.h" +#include "../../Header/Powerups/PowerupService.h" + + +// ServiceLocator Class Summary: This class manages access to various services in the application. +// include relevant headers files + +namespace Global +{ + class ServiceLocator + { + private: + + // Private Attributes: + Graphics::GraphicService* graphic_service; + Event::EventService* event_service; + Player::PlayerService* player_service; + Time::TimeService* time_service; + UI::UIService* ui_service; + Enemy::EnemyService* enemy_service; + Gameplay::GameplayService* gameplay_service; + Element::ElementService* element_service; + Sound::SoundService* sound_service; + Bullet::BulletService* bullet_service; + Powerup::PowerupService* powerup_service; + + // Public Methods + ServiceLocator(); + ~ServiceLocator(); + + // Private Methods: + void createServices(); + void clearAllServices(); + + public: + + // Public Methods: + static ServiceLocator* getInstance(); + void initialize(); // Initializes the ServiceLocator. + void update(); // Updates all services. + void render(); // Renders using the services. + + // Methods to Get Specific Services: + Event::EventService* getEventService(); // Retrieve the EventService instance + Graphics::GraphicService* getGraphicService(); // Retrieve the GraphicService instance + Player::PlayerService* getPlayerService(); // Retrieve the PlayerService instance + Time::TimeService* getTimeService(); // Retrieve the TimeService instance + UI::UIService* getUIService(); // Retrive the UIService instance + Enemy::EnemyService* getEnemyService(); // Retrive the EnemyService instance + Gameplay::GameplayService* getGameplayService(); // Retrive the GameplayService instance + Element::ElementService* getElementService(); // Retrive the ElementService instance + Sound::SoundService* getSoundService(); // Retrive the SoundService instance + Bullet::BulletService* getBulletService(); // Retrive the BulletService instance + Powerup::PowerupService* getPowerupService(); // Retrive the PowerupService instance + void deleteServiceLocator(); + }; +} \ No newline at end of file diff --git a/Header/Graphic/GraphicService.h b/Header/Graphic/GraphicService.h new file mode 100644 index 000000000..a0514d024 --- /dev/null +++ b/Header/Graphic/GraphicService.h @@ -0,0 +1,41 @@ +#pragma once +#include + +namespace Graphics +{ + class GraphicService + { + private: + + const std::string game_window_title = "Alien Invader"; + + const int game_window_width = 1920; + const int game_window_height = 1080; + + const int frame_rate = 60; + + const sf::Color window_color = sf::Color::Black; + + sf::VideoMode* video_mode; // ptr to video mode + sf::RenderWindow* game_window; // ptr to a RenderWindow + + void setVideoMode(); // Method for setting our video mode + void onDestroy(); // method to run when window is deleted + + public: + GraphicService(); + ~GraphicService(); //cleanup + + //method to create the game window. returns a pointer to an instance of the game window + sf::RenderWindow* createGameWindow(); + + + void initialize(); //lifecycle functions + void update(); //.. + void render(); //.. + bool isGameWindowOpen(); //check if the window is open + + sf::RenderWindow* getGameWindow(); //getter for the game window instance + sf::Color getWindowColor();//get the color + }; +} \ No newline at end of file diff --git a/Header/Main/GameService.h b/Header/Main/GameService.h new file mode 100644 index 000000000..5671190cb --- /dev/null +++ b/Header/Main/GameService.h @@ -0,0 +1,42 @@ +#pragma once +#include +#include "../../header/Global/ServiceLocator.h" + +namespace Main +{ + enum class GameState + { + BOOT, + MAIN_MENU, + GAMEPLAY, + }; + + class ServiceLocator; + + class GameService + { + private: + + static GameState current_state; + + Global::ServiceLocator* service_locator; + sf::RenderWindow* game_window; + + + void initialize(); // Handles game initialization. + void initializeVariables();// Handles game initialization. + void destroy(); // Handles cleanup tasks. + void showMainMenu(); + + public: + GameService(); // Constructor for initializing the GameService object. + ~GameService(); // Destructor for cleaning up resources upon object deletion. + + void ignite(); // Initiates the game. + void update(); // Updates the game logic and game state. + void render(); // Renders each frame of the game. + bool isRunning(); // Checks if the game is currently running. + static void setGameState(GameState new_state); + static GameState getGameState(); + }; +} \ No newline at end of file diff --git a/Header/Player/PlayerController.h b/Header/Player/PlayerController.h new file mode 100644 index 000000000..09c3098fd --- /dev/null +++ b/Header/Player/PlayerController.h @@ -0,0 +1,33 @@ +#pragma once +#include + +namespace Player +{ + class PlayerView; + class PlayerModel; + enum class PlayerState; + + class PlayerController + { + private: + + PlayerView* player_view; + PlayerModel* player_model; + + void processPlayerInput(); + void moveLeft(); + void moveRight(); + + void fireBullet(); + + public: + PlayerController(); + ~PlayerController(); + + void initialize(); + void update(); + void render(); + + sf::Vector2f getPlayerPosition(); + }; +} \ No newline at end of file diff --git a/Header/Player/PlayerModel.h b/Header/Player/PlayerModel.h new file mode 100644 index 000000000..4cb5016dc --- /dev/null +++ b/Header/Player/PlayerModel.h @@ -0,0 +1,47 @@ +#pragma once +#include + +namespace Player +{ + enum class PlayerState //Our Enum + { + ALIVE, + DEAD, + // we will add more states later + }; + + class PlayerModel + { + private: + const sf::Vector2f initial_player_position = sf::Vector2f(950.f, 950.f); + + sf::Vector2f player_position; + PlayerState player_state; //Declaration + int player_score; + + public: + const sf::Vector2f left_most_position = sf::Vector2f(50.f, 950.f); + const sf::Vector2f right_most_position = sf::Vector2f(1800.f, 950.f); + const sf::Vector2f barrel_position_offset = sf::Vector2f(20.f, 50.f); + + const float player_movement_speed = 600.0f; + + PlayerModel(); + ~PlayerModel(); + + void initialize(); + void reset(); + + sf::Vector2f getPlayerPosition(); + void setPlayerPosition(sf::Vector2f position); + + int getPlayerScore(); + void setPlayerScore(int score); + + //new getter and setter + PlayerState getPlayerState(); + void setPlayerState(PlayerState state); + + + }; +} diff --git a/Header/Player/PlayerService.h b/Header/Player/PlayerService.h new file mode 100644 index 000000000..a978d53c5 --- /dev/null +++ b/Header/Player/PlayerService.h @@ -0,0 +1,19 @@ +#pragma once +#include "../../Header/Player/PlayerController.h" + +namespace Player +{ + class PlayerService + { + private: + PlayerController* player_controller; + + public: + PlayerService(); + ~PlayerService(); + + void initialize(); + void update(); + void render(); + }; +} diff --git a/Header/Player/PlayerView.h b/Header/Player/PlayerView.h new file mode 100644 index 000000000..ec0eb5413 --- /dev/null +++ b/Header/Player/PlayerView.h @@ -0,0 +1,30 @@ +#pragma once +#include +#include "../../Header/Player/PlayerController.h" +#include "../../Header/UI/UIElement/ImageView.h" + +namespace Player +{ + class PlayerController; + class PlayerView + { + private: + const float player_sprite_width = 60.f; + const float player_sprite_height = 60.f; + + PlayerController* player_controller; + UI::UIElement::ImageView* player_image; + + void createUIElements(); + void initializeImage(); + void destroy(); + + public: + PlayerView(); + ~PlayerView(); + + void update(); + void render(); + void initialize(PlayerController* controller); + }; +} \ No newline at end of file diff --git a/Header/Powerups/Controllers/OutscalBombController.h b/Header/Powerups/Controllers/OutscalBombController.h new file mode 100644 index 000000000..a4b344127 --- /dev/null +++ b/Header/Powerups/Controllers/OutscalBombController.h @@ -0,0 +1,17 @@ +#pragma once +#include "../../Header/Powerups/PowerupController.h" + +namespace Powerup +{ + namespace Controller + { + class OutscalBombController : public PowerupController + { + public: + OutscalBombController(PowerupType type); + virtual ~OutscalBombController(); + + void onCollected() override; + }; + } +} \ No newline at end of file diff --git a/Header/Powerups/Controllers/RapidFireController.h b/Header/Powerups/Controllers/RapidFireController.h new file mode 100644 index 000000000..2661e3569 --- /dev/null +++ b/Header/Powerups/Controllers/RapidFireController.h @@ -0,0 +1,17 @@ +#pragma once +#include "../../Header/Powerups/PowerupController.h" + +namespace Powerup +{ + namespace Controller + { + class RapidFireController : public PowerupController + { + public: + RapidFireController(PowerupType type); + virtual ~RapidFireController(); + + void onCollected() override; + }; + } +} \ No newline at end of file diff --git a/Header/Powerups/Controllers/ShieldController.h b/Header/Powerups/Controllers/ShieldController.h new file mode 100644 index 000000000..7c9064149 --- /dev/null +++ b/Header/Powerups/Controllers/ShieldController.h @@ -0,0 +1,17 @@ +#pragma once +#include "../../Header/Powerups/PowerupController.h" + +namespace Powerup +{ + namespace Controller + { + class ShieldController : public PowerupController + { + public: + ShieldController(PowerupType type); + virtual ~ShieldController(); + + void onCollected() override; + }; + } +} \ No newline at end of file diff --git a/Header/Powerups/Controllers/TrippleLaserController.h b/Header/Powerups/Controllers/TrippleLaserController.h new file mode 100644 index 000000000..e343116a7 --- /dev/null +++ b/Header/Powerups/Controllers/TrippleLaserController.h @@ -0,0 +1,17 @@ +#pragma once +#include "../../Header/Powerups/PowerupController.h" + +namespace Powerup +{ + namespace Controller + { + class TrippleLaserController : public PowerupController + { + public: + TrippleLaserController(PowerupType type); + virtual ~TrippleLaserController(); + + void onCollected() override; + }; + } +} \ No newline at end of file diff --git a/Header/Powerups/PowerupConfig.h b/Header/Powerups/PowerupConfig.h new file mode 100644 index 000000000..2a11ef64f --- /dev/null +++ b/Header/Powerups/PowerupConfig.h @@ -0,0 +1,11 @@ +#pragma once +namespace Powerup +{ + enum class PowerupType + { + SHIELD, + RAPID_FIRE, + TRIPPLE_LASER, + OUTSCAL_BOMB, // later redacted + }; +} \ No newline at end of file diff --git a/Header/Powerups/PowerupController.h b/Header/Powerups/PowerupController.h new file mode 100644 index 000000000..fcbea0a3e --- /dev/null +++ b/Header/Powerups/PowerupController.h @@ -0,0 +1,33 @@ +#pragma once +#include "../../header/Collectible/ICollectible.h" + +namespace Powerup +{ + class PowerupView; + class PowerupModel; + + enum class PowerupType; + + class PowerupController : public Collectible::ICollectible + { + protected: + PowerupView* powerup_view; + PowerupModel* powerup_model; + + void updatePowerupPosition(); + void handleOutOfBounds(); + + public: + PowerupController(PowerupType type); + virtual ~PowerupController(); + + void initialize(sf::Vector2f position) override; + void update() override; + void render() override; + + void onCollected() override; + + sf::Vector2f getCollectiblePosition() override; + PowerupType getPowerupType(); + }; +} diff --git a/Header/Powerups/PowerupModel.h b/Header/Powerups/PowerupModel.h new file mode 100644 index 000000000..104f227ee --- /dev/null +++ b/Header/Powerups/PowerupModel.h @@ -0,0 +1,31 @@ +#pragma once +#include + +namespace Powerup +{ + enum class PowerupType; + + class PowerupModel + { + private: + float movement_speed = 300.f; + + sf::Vector2f powerup_position; + PowerupType powerup_type; + + public: + PowerupModel(PowerupType type); + ~PowerupModel(); + + void initialize(sf::Vector2f position); + + sf::Vector2f getPowerupPosition(); + void setPowerupPosition(sf::Vector2f position); + + PowerupType getPowerupType(); + void setPowerupType(PowerupType type); + + float getMovementSpeed(); + void setMovementSpeed(float speed); + }; +} \ No newline at end of file diff --git a/Header/Powerups/PowerupService.h b/Header/Powerups/PowerupService.h new file mode 100644 index 000000000..908ce8e57 --- /dev/null +++ b/Header/Powerups/PowerupService.h @@ -0,0 +1,32 @@ +#pragma once +#include +#include "SFML/System/Vector2.hpp" +#include "../../Header/Collectible/ICollectible.h" + +namespace Powerup +{ + + class PowerupController; + enum class PowerupType; + + class PowerupService + { + private: + std::vector powerup_list; + + PowerupController* createPowerup(PowerupType powerup_type); + void destroy(); + + public: + PowerupService(); + virtual ~PowerupService(); + + void initialize(); + void update(); + void render(); + + + PowerupController* spawnPowerup(PowerupType powerup_type, sf::Vector2f position); + void destroyPowerup(PowerupController* powerup_controller); + }; +} \ No newline at end of file diff --git a/Header/Powerups/PowerupView.h b/Header/Powerups/PowerupView.h new file mode 100644 index 000000000..d63947915 --- /dev/null +++ b/Header/Powerups/PowerupView.h @@ -0,0 +1,33 @@ +#pragma once +#include +#include "../../Header/UI/UIElement/ImageView.h" + +namespace Powerup +{ + class PowerupController; + enum class PowerupType; + + class PowerupView + { + private: + const float powerup_sprite_width = 30.f; + const float powerup_sprite_height = 30.f; + + PowerupController* powerup_controller; + UI::UIElement::ImageView* powerup_image; + + void createUIElements(); + void initializeImage(); + sf::String getPowerupTexturePath(); + + void destroy(); + + public: + PowerupView(); + ~PowerupView(); + + void initialize(PowerupController* controller); + void update(); + void render(); + }; +} \ No newline at end of file diff --git a/Header/Projectile/IProjectile.h b/Header/Projectile/IProjectile.h new file mode 100644 index 000000000..770b0e973 --- /dev/null +++ b/Header/Projectile/IProjectile.h @@ -0,0 +1,21 @@ +#pragma once +#include +#include "../../Header/Bullet/BulletConfig.h" + +namespace Projectile +{ + enum class MovementDirection; + + class IProjectile + { + public: + virtual void initialize(sf::Vector2f position, Bullet::MovementDirection direction) = 0; + virtual void update() = 0; + virtual void render() = 0; + + virtual void updateProjectilePosition() = 0; + virtual sf::Vector2f getProjectilePosition() = 0; + + virtual ~IProjectile() {}; + }; +} diff --git a/Header/Sound/SoundService.h b/Header/Sound/SoundService.h new file mode 100644 index 000000000..93b0dd509 --- /dev/null +++ b/Header/Sound/SoundService.h @@ -0,0 +1,29 @@ +#pragma once +#include "SFML/Audio.hpp" + +namespace Sound +{ + enum class SoundType + { + BUTTON_CLICK, + }; + + class SoundService + { + private: + const int background_music_volume = 30; + + sf::Music background_music; + sf::Sound sound_effect; + sf::SoundBuffer buffer_button_click; + + void loadBackgroundMusicFromFile(); + void loadSoundFromFile(); + + public: + void initialize(); + + void playSound(SoundType soundType); + void playBackgroundMusic(); + }; +} \ No newline at end of file diff --git a/Header/Time/TimeService.h b/Header/Time/TimeService.h new file mode 100644 index 000000000..71184c46e --- /dev/null +++ b/Header/Time/TimeService.h @@ -0,0 +1,32 @@ +#pragma once +#include + + // The TimeService class helps keep track of time in game and calculate delta time. + // Utilizes the library to calculate delta time. + +namespace Time +{ + class TimeService + { + private: + + // A point in time which indicates the starting time of previous frame. + std::chrono::time_point previous_time; + + float delta_time; //to store the detla time + + void updateDeltaTime(); // method to update time + float calculateDeltaTime(); //calculate time by subtracting the previous time from the current time + void updatePreviousTime(); // finally update the current time to be previous time + + public: + + //lifecycle methods + void initialize(); + void update(); + + //getter + float getDeltaTime(); + }; +} + diff --git a/Header/UI/Interface/IUIController.h b/Header/UI/Interface/IUIController.h new file mode 100644 index 000000000..c97cf8d7a --- /dev/null +++ b/Header/UI/Interface/IUIController.h @@ -0,0 +1,18 @@ +#pragma once +namespace UI +{ + namespace Interface + { + class IUIController + { + public: + + virtual void initialize() = 0; + virtual void update() = 0; + virtual void render() = 0; + virtual void show() = 0; + + virtual ~IUIController() { } + }; + } +} \ No newline at end of file diff --git a/Header/UI/MainMenu/MainMenuUIController.h b/Header/UI/MainMenu/MainMenuUIController.h new file mode 100644 index 000000000..1772f5c02 --- /dev/null +++ b/Header/UI/MainMenu/MainMenuUIController.h @@ -0,0 +1,52 @@ +#pragma once +#include +#include "../../header/UI/Interface/IUIController.h" +#include "../../header/UI/UIElement/ImageView.h" +#include "../../header/UI/UIElement/ButtonView.h" + +namespace UI +{ + namespace MainMenu + { + class MainMenuUIController :public Interface::IUIController + { + + private: + // Constants: + const float button_width = 400.f; + const float button_height = 140.f; + const float play_button_y_position = 500.f; + const float instructions_button_y_position = 700.f; + const float quit_button_y_position = 900.f; + const float background_alpha = 85.f; + UIElement::ImageView* background_image; + + // UI Elements + UIElement::ButtonView* play_button; + UIElement::ButtonView* instructions_button; + UIElement::ButtonView* quit_button; + + // Buttons and scaling + void createImage(); + void createButtons(); + void initializeBackgroundImage(); + void initializeButtons(); + void registerButtonCallback(); + + void playButtonCallback(); + void instructionsButtonCallback(); + void quitButtonCallback(); + + void destroy(); + + public: + MainMenuUIController(); + ~MainMenuUIController(); + + void initialize(); + void update(); + void render(); + void show() override; + }; + } +} \ No newline at end of file diff --git a/Header/UI/UIElement/ButtonView.h b/Header/UI/UIElement/ButtonView.h new file mode 100644 index 000000000..10941f6a6 --- /dev/null +++ b/Header/UI/UIElement/ButtonView.h @@ -0,0 +1,37 @@ +#pragma once +#include "../../header/UI/UIElement/ImageView.h" +#include + +namespace UI +{ + namespace UIElement + { + class ButtonView : public ImageView + { + private: + // Define a function pointer type for the callback function + using CallbackFunction = std::function; + + // Store the callback function + CallbackFunction callback_function = nullptr; + + void printButtonClicked(); + + protected: + sf::String button_title; + + virtual void handleButtonInteraction(); + virtual bool clickedButton(sf::Sprite* button_sprite, sf::Vector2f mouse_position); + + public: + ButtonView(); + virtual ~ButtonView(); + + virtual void initialize(sf::String title, sf::String texture_path, float button_width, float button_height, sf::Vector2f position); + virtual void update() override; + virtual void render() override; + + void registerCallbackFuntion(CallbackFunction button_callback); + }; + } +} \ No newline at end of file diff --git a/Header/UI/UIElement/ImageView.h b/Header/UI/UIElement/ImageView.h new file mode 100644 index 000000000..875bf69d0 --- /dev/null +++ b/Header/UI/UIElement/ImageView.h @@ -0,0 +1,31 @@ +#pragma once +#include "../../header/UI/UIElement/UIView.h" + +namespace UI +{ + namespace UIElement + { + class ImageView : public UIView + { + protected: + sf::Texture image_texture; + sf::Sprite image_sprite; + + public: + ImageView(); + virtual ~ImageView(); + + virtual void initialize(sf::String texture_path, float image_width, float image_height, sf::Vector2f position); + virtual void update() override; + virtual void render() override; + + virtual void setTexture(sf::String texture_path); + virtual void setScale(float width, float height); + virtual void setPosition(sf::Vector2f position); + virtual void setRotation(float rotation_angle); + virtual void setOriginAtCentre(); + virtual void setImageAlpha(float alpha); + virtual void setCentreAlinged(); + }; + } +} \ No newline at end of file diff --git a/Header/UI/UIElement/TextView.h b/Header/UI/UIElement/TextView.h new file mode 100644 index 000000000..5a5e51c6a --- /dev/null +++ b/Header/UI/UIElement/TextView.h @@ -0,0 +1,45 @@ +#pragma once +#include "../../header/UI/UIElement/UIView.h" + +namespace UI +{ + namespace UIElement + { + enum class FontType + { + BUBBLE_BOBBLE, + DS_DIGIB, + }; + + class TextView : public UIView + { + private: + static const int default_font_size = 55; + + static sf::Font font_bubble_bobble; + static sf::Font font_DS_DIGIB; + + sf::Text text; + + static void loadFont(); + + void setFont(FontType font_type); + void setFontSize(int font_size); + void setTextPosition(sf::Vector2f position); + void setTextColor(sf::Color color); + + public: + TextView(); + virtual ~TextView(); + + static void initializeTextView(); + + virtual void initialize(sf::String text_value, sf::Vector2f position, FontType font_type = FontType::BUBBLE_BOBBLE, int font_size = default_font_size, sf::Color color = sf::Color::White); + virtual void update() override; + virtual void render() override; + + void setText(sf::String text_value); + void setTextCentreAligned(); + }; + } +} \ No newline at end of file diff --git a/Header/UI/UIElement/UIView.h b/Header/UI/UIElement/UIView.h new file mode 100644 index 000000000..be748be05 --- /dev/null +++ b/Header/UI/UIElement/UIView.h @@ -0,0 +1,33 @@ +#pragma once +#include + +namespace UI +{ + namespace UIElement + { + enum class UIState + { + VISIBLE, + HIDDEN, + }; + + class UIView + { + protected: + sf::RenderWindow* game_window; + UIState ui_state; + + public: + UIView(); + virtual ~UIView(); + + virtual void initialize(); + virtual void update(); + virtual void render(); + + // to enable/disable render of ui + virtual void show(); + virtual void hide(); + }; + } +} \ No newline at end of file diff --git a/Header/UI/UIService.h b/Header/UI/UIService.h new file mode 100644 index 000000000..1acbeb81b --- /dev/null +++ b/Header/UI/UIService.h @@ -0,0 +1,26 @@ +#pragma once +#include "../../Header/UI/MainMenu/MainMenuUIController.h" +#include "../../Header/UI/Interface/IUIController.h" + +namespace UI +{ + class UIService + { + private: + MainMenu::MainMenuUIController* main_menu_controller; + + void createControllers(); + void initializeControllers(); + Interface::IUIController* getCurrentUIController(); + void destroy(); + + public: + UIService(); + ~UIService(); + + void initialize(); + void update(); + void render(); + void showScreen(); + }; +} \ No newline at end of file From aae6e422d335d0fb5dcfe574e9f7421f20534d8d Mon Sep 17 00:00:00 2001 From: Rishi Saxena Date: Sun, 11 Aug 2024 14:59:11 +0530 Subject: [PATCH 46/56] Delete Header directory --- Header/Bullet/BulletConfig.h | 16 ----- Header/Bullet/BulletController.h | 37 ---------- Header/Bullet/BulletModel.h | 42 ------------ Header/Bullet/BulletService.h | 33 --------- Header/Bullet/BulletView.h | 34 ---------- .../Controllers/FrostBulletController.h | 20 ------ .../Controllers/LaserBulletController.h | 17 ----- Header/Bullet/Controllers/TorpedoController.h | 20 ------ Header/Collectible/ICollectible.h | 17 ----- Header/Element/Bunker/BunkerController.h | 28 -------- Header/Element/Bunker/BunkerModel.h | 15 ----- Header/Element/Bunker/BunkerView.h | 34 ---------- Header/Element/ElementService.h | 34 ---------- Header/Enemy/Controllers/SubZeroController.h | 30 --------- .../Controllers/ThunderSnakeController.h | 31 --------- Header/Enemy/Controllers/UFOController.h | 27 -------- Header/Enemy/Controllers/ZapperController.h | 31 --------- Header/Enemy/EnemyConfig.h | 28 -------- Header/Enemy/EnemyController.h | 47 ------------- Header/Enemy/EnemyModel.h | 49 -------------- Header/Enemy/EnemyService.h | 35 ---------- Header/Enemy/EnemyView.h | 34 ---------- Header/Entity/EntityConfig.h | 12 ---- Header/Event/EventService.h | 56 ---------------- Header/Gameplay/GameplayController.h | 21 ------ Header/Gameplay/GameplayService.h | 19 ------ Header/Gameplay/GameplayView.h | 31 --------- Header/Global/Config.h | 39 ----------- Header/Global/ServiceLocator.h | 67 ------------------- Header/Graphic/GraphicService.h | 41 ------------ Header/Main/GameService.h | 42 ------------ Header/Player/PlayerController.h | 33 --------- Header/Player/PlayerModel.h | 47 ------------- Header/Player/PlayerService.h | 19 ------ Header/Player/PlayerView.h | 30 --------- .../Controllers/OutscalBombController.h | 17 ----- .../Controllers/RapidFireController.h | 17 ----- .../Powerups/Controllers/ShieldController.h | 17 ----- .../Controllers/TrippleLaserController.h | 17 ----- Header/Powerups/PowerupConfig.h | 11 --- Header/Powerups/PowerupController.h | 33 --------- Header/Powerups/PowerupModel.h | 31 --------- Header/Powerups/PowerupService.h | 32 --------- Header/Powerups/PowerupView.h | 33 --------- Header/Projectile/IProjectile.h | 21 ------ Header/Sound/SoundService.h | 29 -------- Header/Time/TimeService.h | 32 --------- Header/UI/Interface/IUIController.h | 18 ----- Header/UI/MainMenu/MainMenuUIController.h | 52 -------------- Header/UI/UIElement/ButtonView.h | 37 ---------- Header/UI/UIElement/ImageView.h | 31 --------- Header/UI/UIElement/TextView.h | 45 ------------- Header/UI/UIElement/UIView.h | 33 --------- Header/UI/UIService.h | 26 ------- 54 files changed, 1648 deletions(-) delete mode 100644 Header/Bullet/BulletConfig.h delete mode 100644 Header/Bullet/BulletController.h delete mode 100644 Header/Bullet/BulletModel.h delete mode 100644 Header/Bullet/BulletService.h delete mode 100644 Header/Bullet/BulletView.h delete mode 100644 Header/Bullet/Controllers/FrostBulletController.h delete mode 100644 Header/Bullet/Controllers/LaserBulletController.h delete mode 100644 Header/Bullet/Controllers/TorpedoController.h delete mode 100644 Header/Collectible/ICollectible.h delete mode 100644 Header/Element/Bunker/BunkerController.h delete mode 100644 Header/Element/Bunker/BunkerModel.h delete mode 100644 Header/Element/Bunker/BunkerView.h delete mode 100644 Header/Element/ElementService.h delete mode 100644 Header/Enemy/Controllers/SubZeroController.h delete mode 100644 Header/Enemy/Controllers/ThunderSnakeController.h delete mode 100644 Header/Enemy/Controllers/UFOController.h delete mode 100644 Header/Enemy/Controllers/ZapperController.h delete mode 100644 Header/Enemy/EnemyConfig.h delete mode 100644 Header/Enemy/EnemyController.h delete mode 100644 Header/Enemy/EnemyModel.h delete mode 100644 Header/Enemy/EnemyService.h delete mode 100644 Header/Enemy/EnemyView.h delete mode 100644 Header/Entity/EntityConfig.h delete mode 100644 Header/Event/EventService.h delete mode 100644 Header/Gameplay/GameplayController.h delete mode 100644 Header/Gameplay/GameplayService.h delete mode 100644 Header/Gameplay/GameplayView.h delete mode 100644 Header/Global/Config.h delete mode 100644 Header/Global/ServiceLocator.h delete mode 100644 Header/Graphic/GraphicService.h delete mode 100644 Header/Main/GameService.h delete mode 100644 Header/Player/PlayerController.h delete mode 100644 Header/Player/PlayerModel.h delete mode 100644 Header/Player/PlayerService.h delete mode 100644 Header/Player/PlayerView.h delete mode 100644 Header/Powerups/Controllers/OutscalBombController.h delete mode 100644 Header/Powerups/Controllers/RapidFireController.h delete mode 100644 Header/Powerups/Controllers/ShieldController.h delete mode 100644 Header/Powerups/Controllers/TrippleLaserController.h delete mode 100644 Header/Powerups/PowerupConfig.h delete mode 100644 Header/Powerups/PowerupController.h delete mode 100644 Header/Powerups/PowerupModel.h delete mode 100644 Header/Powerups/PowerupService.h delete mode 100644 Header/Powerups/PowerupView.h delete mode 100644 Header/Projectile/IProjectile.h delete mode 100644 Header/Sound/SoundService.h delete mode 100644 Header/Time/TimeService.h delete mode 100644 Header/UI/Interface/IUIController.h delete mode 100644 Header/UI/MainMenu/MainMenuUIController.h delete mode 100644 Header/UI/UIElement/ButtonView.h delete mode 100644 Header/UI/UIElement/ImageView.h delete mode 100644 Header/UI/UIElement/TextView.h delete mode 100644 Header/UI/UIElement/UIView.h delete mode 100644 Header/UI/UIService.h diff --git a/Header/Bullet/BulletConfig.h b/Header/Bullet/BulletConfig.h deleted file mode 100644 index 3d40244af..000000000 --- a/Header/Bullet/BulletConfig.h +++ /dev/null @@ -1,16 +0,0 @@ -#pragma once -namespace Bullet -{ - enum class BulletType - { - LASER_BULLET, - TORPEDO, - FROST_BULLET, - }; - - enum class MovementDirection - { - UP, //player needs to shoot in upward direction - DOWN, // enemies always shoot in downward direction - }; -} \ No newline at end of file diff --git a/Header/Bullet/BulletController.h b/Header/Bullet/BulletController.h deleted file mode 100644 index 2d66e5f0b..000000000 --- a/Header/Bullet/BulletController.h +++ /dev/null @@ -1,37 +0,0 @@ -#pragma once -#include "../../Header/Projectile/IProjectile.h" -#include "../../Header/Bullet/BulletConfig.h" -#include "../../Header/Entity/EntityConfig.h" - -namespace Bullet -{ - class BulletView; - class BulletModel; - enum class BulletType; - - class BulletController : public Projectile::IProjectile - { - protected: - - BulletView* bullet_view; - BulletModel* bullet_model; - - void updateProjectilePosition() override; - - void moveUp(); - void moveDown(); - void handleOutOfBounds(); - - public: - - BulletController(BulletType type, Entity::EntityType owner_type); - virtual ~BulletController() override; - void initialize(sf::Vector2f position, Bullet::MovementDirection direction) override; - void update() override; - void render() override; - - sf::Vector2f getProjectilePosition() override; - BulletType getBulletType(); - Entity::EntityType getOwnerEntityType(); - }; -} \ No newline at end of file diff --git a/Header/Bullet/BulletModel.h b/Header/Bullet/BulletModel.h deleted file mode 100644 index ad99418ec..000000000 --- a/Header/Bullet/BulletModel.h +++ /dev/null @@ -1,42 +0,0 @@ -#pragma once -#include -#include "../../Header/Entity/EntityConfig.h" - -namespace Bullet -{ - enum class BulletType; - enum class MovementDirection; - - class BulletModel - { - private: - float movement_speed = 300.f; - sf::Vector2f bullet_position; - - BulletType bullet_type; - MovementDirection movement_direction; - - Entity::EntityType owner_type; - - public: - - BulletModel(BulletType type, Entity::EntityType owner_type); - ~BulletModel(); - - void initialize(sf::Vector2f position, MovementDirection direction); - - sf::Vector2f getBulletPosition(); - void setBulletPosition(sf::Vector2f position); - - BulletType getBulletType(); - void setBulletType(BulletType type); - - MovementDirection getMovementDirection(); - void setMovementDirection(MovementDirection direction); - - float getMovementSpeed(); - void setMovementSpeed(float speed); - - Entity::EntityType getOwnerEntityType(); - }; -} \ No newline at end of file diff --git a/Header/Bullet/BulletService.h b/Header/Bullet/BulletService.h deleted file mode 100644 index 02f77423a..000000000 --- a/Header/Bullet/BulletService.h +++ /dev/null @@ -1,33 +0,0 @@ -#pragma once -#include -#include "SFML/System/Vector2.hpp" -#include "../../Header/Projectile/IProjectile.h" -#include "../../Header/Entity/EntityConfig.h" - -namespace Bullet -{ - class BulletController; - enum class BulletType; - enum class MovementDirection; - - class BulletService - { - private: - - std::vector bullet_list; - - BulletController* createBullet(BulletType bullet_type, Entity::EntityType owner_type); - void destroy(); - - public: - BulletService(); - virtual ~BulletService(); - - void initialize(); - void update(); - void render(); - - BulletController* spawnBullet(BulletType bullet_type, sf::Vector2f position, MovementDirection direction, Entity::EntityType owner_type); - void destroyBullet(BulletController* bullet_controller); - }; -} \ No newline at end of file diff --git a/Header/Bullet/BulletView.h b/Header/Bullet/BulletView.h deleted file mode 100644 index 52bf08af7..000000000 --- a/Header/Bullet/BulletView.h +++ /dev/null @@ -1,34 +0,0 @@ -#pragma once -#include -#include "../../Header/Bullet/BulletController.h" -#include "../../Header/UI/UIElement/ImageView.h" - -namespace Bullet -{ - class BulletController; - enum class BulletType; - - class BulletView - { - private: - const float bullet_sprite_width = 18.f; - const float bullet_sprite_height = 18.f; - - BulletController* bullet_controller; - UI::UIElement::ImageView* bullet_image; - - void createUIElements(); - void initializeImage(); - sf::String getBulletTexturePath(); - - void destroy(); - - public: - BulletView(); - ~BulletView(); - - void initialize(BulletController* controller); - void update(); - void render(); - }; -} \ No newline at end of file diff --git a/Header/Bullet/Controllers/FrostBulletController.h b/Header/Bullet/Controllers/FrostBulletController.h deleted file mode 100644 index 3188333d9..000000000 --- a/Header/Bullet/Controllers/FrostBulletController.h +++ /dev/null @@ -1,20 +0,0 @@ -#pragma once -#include "../../Header/Bullet/BulletController.h" - -namespace Bullet -{ - namespace Controller - { - class FrostBulletController : public BulletController - { - private: - const float torpedo_movement_speed = 500.f; - - public: - FrostBulletController(BulletType type); - ~FrostBulletController(); - - void initialize(sf::Vector2f position, MovementDirection direction) override; - }; - } -} \ No newline at end of file diff --git a/Header/Bullet/Controllers/LaserBulletController.h b/Header/Bullet/Controllers/LaserBulletController.h deleted file mode 100644 index 67a48b89f..000000000 --- a/Header/Bullet/Controllers/LaserBulletController.h +++ /dev/null @@ -1,17 +0,0 @@ -#pragma once -#include "../../Header/Bullet/BulletController.h" - -namespace Bullet -{ - namespace Controller - { - class LaserBulletController : public BulletController - { - public: - LaserBulletController(BulletType type); - ~LaserBulletController(); - - void initialize(sf::Vector2f position, MovementDirection direction) override; - }; - } -} \ No newline at end of file diff --git a/Header/Bullet/Controllers/TorpedoController.h b/Header/Bullet/Controllers/TorpedoController.h deleted file mode 100644 index 99ac2d88a..000000000 --- a/Header/Bullet/Controllers/TorpedoController.h +++ /dev/null @@ -1,20 +0,0 @@ -#pragma once -#include "../../Header/Bullet/BulletController.h" - -namespace Bullet -{ - namespace Controller - { - class TorpedoController : public BulletController - { - private: - const float torpedo_movement_speed = 200.f; - - public: - TorpedoController(BulletType type); - ~TorpedoController(); - - void initialize(sf::Vector2f position, MovementDirection direction) override; - }; - } -} \ No newline at end of file diff --git a/Header/Collectible/ICollectible.h b/Header/Collectible/ICollectible.h deleted file mode 100644 index d1405aa13..000000000 --- a/Header/Collectible/ICollectible.h +++ /dev/null @@ -1,17 +0,0 @@ -#pragma once -#include - -namespace Collectible -{ - class ICollectible - { - public: - virtual void onCollected() = 0; - virtual void initialize(sf::Vector2f position) = 0; - virtual void update() = 0; - virtual void render() = 0; - virtual sf::Vector2f getCollectiblePosition() = 0; - - virtual ~ICollectible() {}; - }; -} diff --git a/Header/Element/Bunker/BunkerController.h b/Header/Element/Bunker/BunkerController.h deleted file mode 100644 index 3370da4b2..000000000 --- a/Header/Element/Bunker/BunkerController.h +++ /dev/null @@ -1,28 +0,0 @@ -#pragma once -#include -#include "../../header/Element/Bunker/BunkerModel.h" - -namespace Element -{ - namespace Bunker - { - class BunkerView; - - class BunkerController - { - private: - BunkerView* bunker_view; - BunkerData bunker_data; - - public: - BunkerController(); - ~BunkerController(); - - void initialize(BunkerData data); - void update(); - void render(); - - sf::Vector2f getBunkerPosition(); - }; - } -} \ No newline at end of file diff --git a/Header/Element/Bunker/BunkerModel.h b/Header/Element/Bunker/BunkerModel.h deleted file mode 100644 index 7ae912814..000000000 --- a/Header/Element/Bunker/BunkerModel.h +++ /dev/null @@ -1,15 +0,0 @@ -#pragma once -#include - -namespace Element -{ - namespace Bunker - { - struct BunkerData - { - sf::Vector2f position; - BunkerData(); - BunkerData(sf::Vector2f position); - }; - } -} \ No newline at end of file diff --git a/Header/Element/Bunker/BunkerView.h b/Header/Element/Bunker/BunkerView.h deleted file mode 100644 index 9bf2ac2de..000000000 --- a/Header/Element/Bunker/BunkerView.h +++ /dev/null @@ -1,34 +0,0 @@ -#pragma once -#include -#include "../../Header/UI/UIElement/ImageView.h" - -namespace Element -{ - namespace Bunker - { - class BunkerController; - - class BunkerView - { - private: - const float bunker_sprite_width = 80.f; - const float bunker_sprite_height = 80.f; - - BunkerController* bunker_controller; - UI::UIElement::ImageView* bunker_image; - - void createUIElements(); - void initializeImage(); - - void destroy(); - - public: - BunkerView(); - ~BunkerView(); - - void initialize(BunkerController* controller); - void update(); - void render(); - }; - } -} \ No newline at end of file diff --git a/Header/Element/ElementService.h b/Header/Element/ElementService.h deleted file mode 100644 index e9c4c8719..000000000 --- a/Header/Element/ElementService.h +++ /dev/null @@ -1,34 +0,0 @@ -#pragma once -#include -#include -#include "../../header/Element/Bunker/BunkerController.h" -#include "../../header/Element/Bunker/BunkerModel.h" - -namespace Element -{ - class BunkerController; - - class ElementService - { - private: - //const vector so that the default values will not be changed down the road by mistake. - const std::vector bunker_data_list = { Bunker::BunkerData(sf::Vector2f(130.f, 800.f)), - Bunker::BunkerData(sf::Vector2f(430.0f, 800.f)), - Bunker::BunkerData(sf::Vector2f(730.0f, 800.f)), - Bunker::BunkerData(sf::Vector2f(1130.0f, 800.f)), - Bunker::BunkerData(sf::Vector2f(1430.0f, 800.f)), - Bunker::BunkerData(sf::Vector2f(1730.0f, 800.f)) }; - - std::vector bunker_list; - - void destroy(); - - public: - ElementService(); - virtual ~ElementService(); - - void initialize(); - void update(); - void render(); - }; -} \ No newline at end of file diff --git a/Header/Enemy/Controllers/SubZeroController.h b/Header/Enemy/Controllers/SubZeroController.h deleted file mode 100644 index d27ae5a7f..000000000 --- a/Header/Enemy/Controllers/SubZeroController.h +++ /dev/null @@ -1,30 +0,0 @@ -#pragma once - -#include "../../header/Enemy/EnemyController.h" - -namespace Enemy -{ - namespace Controller - { - class SubzeroController : public EnemyController - { - private: - - float vertical_movement_speed = 100.f; - const float subzero_rate_of_fire = 2.f; - - void move() override; - void moveDown(); - - void fireBullet() override; - - public: - - SubzeroController(EnemyType type); - ~SubzeroController(); - - void initialize() override; - - }; - } -} \ No newline at end of file diff --git a/Header/Enemy/Controllers/ThunderSnakeController.h b/Header/Enemy/Controllers/ThunderSnakeController.h deleted file mode 100644 index 77211e9ef..000000000 --- a/Header/Enemy/Controllers/ThunderSnakeController.h +++ /dev/null @@ -1,31 +0,0 @@ -#pragma once -#include "../../Header/Enemy/EnemyController.h" -#include "../../Header/Enemy/EnemyConfig.h" - -namespace Enemy -{ - namespace Controller - { - class ThunderSnakeController : public EnemyController - { - private: - const float thunder_snake_horizontal_movement_speed = 190.f; - - void move() override; - void moveLeft(); - void moveRight(); - void moveDiagonalLeft(); - void moveDiagonalRight(); - - void fireBullet() override; - - MovementDirection getInitialMovementDirection(); - - public: - ThunderSnakeController(EnemyType type); - ~ThunderSnakeController(); - - void initialize() override; - }; - } -} \ No newline at end of file diff --git a/Header/Enemy/Controllers/UFOController.h b/Header/Enemy/Controllers/UFOController.h deleted file mode 100644 index c11dc5e03..000000000 --- a/Header/Enemy/Controllers/UFOController.h +++ /dev/null @@ -1,27 +0,0 @@ -#pragma once -#include "../../header/Enemy/EnemyController.h" -#include "../../header/Powerups/PowerupConfig.h" - -namespace Enemy -{ - namespace Controller - { - class UFOController : public EnemyController - { - private: - - void move() override; - void moveLeft(); - void moveRight(); - - void fireBullet() override; - Powerup::PowerupType getRandomPowerupType(); - - public: - UFOController(EnemyType type); - ~UFOController(); - - void initialize() override; - }; - } -} \ No newline at end of file diff --git a/Header/Enemy/Controllers/ZapperController.h b/Header/Enemy/Controllers/ZapperController.h deleted file mode 100644 index fc5a3b414..000000000 --- a/Header/Enemy/Controllers/ZapperController.h +++ /dev/null @@ -1,31 +0,0 @@ -#pragma once - -#include "../../header/Enemy/EnemyController.h" - -namespace Enemy -{ - namespace Controller - { - class ZapperController : public EnemyController - { - private: - - float vertical_travel_distance = 100.f; - - void move() override; - void moveLeft(); - void moveRight(); - void moveDown(); - - void fireBullet() override; - - public: - - ZapperController(EnemyType type); - ~ZapperController(); - - void initialize() override; - - }; - } -} \ No newline at end of file diff --git a/Header/Enemy/EnemyConfig.h b/Header/Enemy/EnemyConfig.h deleted file mode 100644 index 81fa1b4d5..000000000 --- a/Header/Enemy/EnemyConfig.h +++ /dev/null @@ -1,28 +0,0 @@ -#pragma once - -namespace Enemy -{ - enum class EnemyType - { - ZAPPER, - SUBZERO, - THUNDER_SNAKE, - UFO, - }; - - enum class EnemyState - { - PATROLLING, - ATTACK, - DEAD, - }; - - enum class MovementDirection - { - LEFT, - RIGHT, - DOWN, - LEFT_DOWN, - RIGHT_DOWN, - }; -} \ No newline at end of file diff --git a/Header/Enemy/EnemyController.h b/Header/Enemy/EnemyController.h deleted file mode 100644 index 7b2a2a3c0..000000000 --- a/Header/Enemy/EnemyController.h +++ /dev/null @@ -1,47 +0,0 @@ -#pragma once -#include - -namespace Enemy -{ - class EnemyView; - class EnemyModel; - - enum class EnemyType; - enum class EnemyState; - - class EnemyController - { - - protected: - - float vertical_movement_speed = 30.f; - float horizontal_movement_speed = 200.0f; - - float rate_of_fire = 3.f; //we want to fire the bullet every 3 seconds - float elapsed_fire_duration = 0.f; //variable to check how long it has been since we last fired - - EnemyView* enemy_view; - EnemyModel* enemy_model; - - void updateFireTimer(); - void processBulletFire(); - virtual void fireBullet() = 0; - - virtual void move() = 0; - - sf::Vector2f getRandomInitialPosition(); - void handleOutOfBounds(); - - public: - EnemyController(EnemyType type); - virtual ~EnemyController(); - - virtual void initialize(); - void update(); - void render(); - - sf::Vector2f getEnemyPosition(); - EnemyState getEnemyState(); - EnemyType getEnemyType(); - }; -} \ No newline at end of file diff --git a/Header/Enemy/EnemyModel.h b/Header/Enemy/EnemyModel.h deleted file mode 100644 index 080cd9e83..000000000 --- a/Header/Enemy/EnemyModel.h +++ /dev/null @@ -1,49 +0,0 @@ -#pragma once -#include - -namespace Enemy -{ - enum class EnemyType; - enum class MovementDirection; - enum class EnemyState; - - class EnemyModel - { - private: - sf::Vector2f reference_position = sf::Vector2f(50.f, 50.f); - sf::Vector2f enemy_position; - - MovementDirection movement_direction; - EnemyType enemy_type; - EnemyState enemy_state; - - public: - EnemyModel(EnemyType type); - ~EnemyModel(); - - //const settings for enemy - const sf::Vector2f left_most_position = sf::Vector2f(50.f, 50.f); - const sf::Vector2f right_most_position = sf::Vector2f(1800.f, 50.f); - const sf::Vector2f barrel_position_offset = sf::Vector2f(20.f, 50.f); - - const float vertical_travel_distance = 100.f; - const float enemy_movement_speed = 250.0f; - - float vertical_movement_speed = 30.0f; - float horizontal_movement_speed = 100.0f; - - void initialize(); - - // Getters and Setters - sf::Vector2f getEnemyPosition(); - void setEnemyPosition(sf::Vector2f position); - sf::Vector2f getReferencePosition(); - void setReferencePosition(sf::Vector2f position); - EnemyState getEnemyState(); - void setEnemyState(EnemyState state); - EnemyType getEnemyType(); - void setEnemyType(EnemyType type); - MovementDirection getMovementDirection(); - void setMovementDirection(MovementDirection direction); - }; -} \ No newline at end of file diff --git a/Header/Enemy/EnemyService.h b/Header/Enemy/EnemyService.h deleted file mode 100644 index 8f9dd776f..000000000 --- a/Header/Enemy/EnemyService.h +++ /dev/null @@ -1,35 +0,0 @@ -#pragma once -#include - -namespace Enemy -{ - class EnemyController; - enum class EnemyType; - - class EnemyService - { - private: - - const float spawn_interval = 2.f; - - std::vector enemy_list; - float spawn_timer; - - void updateSpawnTimer(); - void processEnemySpawn(); - EnemyType getRandomEnemyType(); - EnemyController* createEnemy(EnemyType enemy_type); - void destroy(); - - public: - EnemyService(); - ~EnemyService(); - - void initialize(); - void update(); - void render(); - - EnemyController* spawnEnemy(); // Function to spawn enemy - void destroyEnemy(EnemyController* enemy_controller); - }; -} \ No newline at end of file diff --git a/Header/Enemy/EnemyView.h b/Header/Enemy/EnemyView.h deleted file mode 100644 index 04258819c..000000000 --- a/Header/Enemy/EnemyView.h +++ /dev/null @@ -1,34 +0,0 @@ -#pragma once - -#include -#include "../../Header/Enemy/EnemyConfig.h" -#include "../../Header/UI/UIElement/ImageView.h" - -namespace Enemy -{ - class EnemyController; - - class EnemyView - { - private: - const float enemy_sprite_width = 60.f; - const float enemy_sprite_height = 60.f; - - EnemyController* enemy_controller; - UI::UIElement::ImageView* enemy_image; - - void createUIElements(); - void initializeImage(); - sf::String getEnemyTexturePath(); - - void destroy(); - - public: - EnemyView(); - ~EnemyView(); - - void initialize(EnemyController* controller); - void update(); - void render(); - }; -} \ No newline at end of file diff --git a/Header/Entity/EntityConfig.h b/Header/Entity/EntityConfig.h deleted file mode 100644 index 234b5e75d..000000000 --- a/Header/Entity/EntityConfig.h +++ /dev/null @@ -1,12 +0,0 @@ -#pragma once -namespace Entity -{ - enum class EntityType - { - PLAYER, - ENEMY, - BULLET, - BUNKER, - DEFAULT, - }; -} \ No newline at end of file diff --git a/Header/Event/EventService.h b/Header/Event/EventService.h deleted file mode 100644 index ebecfd5d6..000000000 --- a/Header/Event/EventService.h +++ /dev/null @@ -1,56 +0,0 @@ -#pragma once - -#include -#include - -namespace Event -{ - enum class ButtonState - { - PRESSED, - HELD, - RELEASED, - }; - - class EventService - { - private: - sf::Event game_event; //event var - sf::RenderWindow* game_window; //ptr to our game window - - bool isGameWindowOpen(); - bool gameWindowWasClosed(); //for the condition we already had - the title bar cross. - bool hasQuitGame(); //for our new 'ESC' condition - - //Button States - ButtonState left_mouse_button_state; - ButtonState right_mouse_button_state; - ButtonState left_arrow_button_state; - ButtonState right_arrow_button_state; - ButtonState A_button_state; - ButtonState D_button_state; - - //Button and mouse state functions - void updateMouseButtonsState(ButtonState& current_button_state, sf::Mouse::Button mouse_button); - void updateKeyboardButtonsState(ButtonState& current_button_state, sf::Keyboard::Key keyboard_button); - - - public: - EventService(); - ~EventService(); - - void initialize(); - void update(); - void processEvents(); // while window is open we will check for events - bool pressedEscapeKey(); - bool isKeyboardEvent(); - bool pressedLeftKey(); // getting inputs for the player - bool pressedRightKey(); - bool pressedLeftMouseButton(); // Mouse inputs for the player - bool pressedRightMouseButton(); - bool pressedAKey(); // AD held check - bool pressedDKey(); - - }; -} - diff --git a/Header/Gameplay/GameplayController.h b/Header/Gameplay/GameplayController.h deleted file mode 100644 index 76b6fcf24..000000000 --- a/Header/Gameplay/GameplayController.h +++ /dev/null @@ -1,21 +0,0 @@ -#pragma once -#include - -namespace Gameplay -{ - class GameplayView; - - class GameplayController - { - private: - GameplayView* gameplay_view; - - public: - GameplayController(); - ~GameplayController(); - - void initialize(); - void update(); - void render(); - }; -} \ No newline at end of file diff --git a/Header/Gameplay/GameplayService.h b/Header/Gameplay/GameplayService.h deleted file mode 100644 index 53efd34a5..000000000 --- a/Header/Gameplay/GameplayService.h +++ /dev/null @@ -1,19 +0,0 @@ -#pragma once -namespace Gameplay -{ - class GameplayController; - - class GameplayService - { - private: - GameplayController* gameplay_controller; - - public: - GameplayService(); - ~GameplayService(); - - void initialize(); - void update(); - void render(); - }; -} \ No newline at end of file diff --git a/Header/Gameplay/GameplayView.h b/Header/Gameplay/GameplayView.h deleted file mode 100644 index 96772b0f8..000000000 --- a/Header/Gameplay/GameplayView.h +++ /dev/null @@ -1,31 +0,0 @@ -#pragma once -#include -#include "../../Header/UI/UIElement/ImageView.h" - -namespace Gameplay -{ - class GameplayController; - - class GameplayView - { - private: - sf::RenderWindow* game_window; - sf::Texture background_texture; - sf::Sprite background_sprite; - - const float background_alpha = 150.f; - - GameplayController* gameplay_controller; - UI::UIElement::ImageView* background_image; - - void initializeBackgroundImage(); - - public: - GameplayView(); - ~GameplayView(); - - void initialize(); - void update(); - void render(); - }; -} \ No newline at end of file diff --git a/Header/Global/Config.h b/Header/Global/Config.h deleted file mode 100644 index 385d119df..000000000 --- a/Header/Global/Config.h +++ /dev/null @@ -1,39 +0,0 @@ -#pragma once -#include - -namespace Global -{ - class Config - { - public: - static const sf::String outscal_logo_texture_path; - static const sf::String background_texture_path; - static const sf::String player_texture_path; - - static const sf::String zapper_texture_path; - static const sf::String thunder_snake_texture_path; - static const sf::String subzero_texture_path; - static const sf::String ufo_texture_path; - static const sf::String bunker_texture_path; - - static const sf::String shield_texture_path; - static const sf::String tripple_laser_texture_path; - static const sf::String rapid_fire_texture_path; - static const sf::String outscal_bomb_texture_path; - - static const sf::String laser_bullet_texture_path; - static const sf::String torpedoe_texture_path; - static const sf::String frost_beam_texture_path; - - static const sf::String play_button_texture_path; - static const sf::String instructions_button_texture_path; - static const sf::String quit_button_texture_path; - static const sf::String menu_button_texture_path; - - static const sf::String bubble_bobble_font_path; - static const sf::String DS_DIGIB_font_path; - - static const sf::String background_music_path; - static const sf::String button_click_sound_path; - }; -} diff --git a/Header/Global/ServiceLocator.h b/Header/Global/ServiceLocator.h deleted file mode 100644 index ba6b11743..000000000 --- a/Header/Global/ServiceLocator.h +++ /dev/null @@ -1,67 +0,0 @@ -#pragma once -#include "../../Header/Graphic/GraphicService.h" -#include "../../Header/Event/EventService.h" -#include "../../Header/Player/PlayerService.h" -#include "../../Header/Time/TimeService.h" -#include "../../Header/UI/UIService.h" -#include "../../Header/Enemy/EnemyService.h" -#include "../../Header/Gameplay/GameplayService.h" -#include "../../Header/Element/ElementService.h" -#include "../../Header/Sound/SoundService.h" -#include "../../Header/Bullet/BulletService.h" -#include "../../Header/Powerups/PowerupService.h" - - -// ServiceLocator Class Summary: This class manages access to various services in the application. -// include relevant headers files - -namespace Global -{ - class ServiceLocator - { - private: - - // Private Attributes: - Graphics::GraphicService* graphic_service; - Event::EventService* event_service; - Player::PlayerService* player_service; - Time::TimeService* time_service; - UI::UIService* ui_service; - Enemy::EnemyService* enemy_service; - Gameplay::GameplayService* gameplay_service; - Element::ElementService* element_service; - Sound::SoundService* sound_service; - Bullet::BulletService* bullet_service; - Powerup::PowerupService* powerup_service; - - // Public Methods - ServiceLocator(); - ~ServiceLocator(); - - // Private Methods: - void createServices(); - void clearAllServices(); - - public: - - // Public Methods: - static ServiceLocator* getInstance(); - void initialize(); // Initializes the ServiceLocator. - void update(); // Updates all services. - void render(); // Renders using the services. - - // Methods to Get Specific Services: - Event::EventService* getEventService(); // Retrieve the EventService instance - Graphics::GraphicService* getGraphicService(); // Retrieve the GraphicService instance - Player::PlayerService* getPlayerService(); // Retrieve the PlayerService instance - Time::TimeService* getTimeService(); // Retrieve the TimeService instance - UI::UIService* getUIService(); // Retrive the UIService instance - Enemy::EnemyService* getEnemyService(); // Retrive the EnemyService instance - Gameplay::GameplayService* getGameplayService(); // Retrive the GameplayService instance - Element::ElementService* getElementService(); // Retrive the ElementService instance - Sound::SoundService* getSoundService(); // Retrive the SoundService instance - Bullet::BulletService* getBulletService(); // Retrive the BulletService instance - Powerup::PowerupService* getPowerupService(); // Retrive the PowerupService instance - void deleteServiceLocator(); - }; -} \ No newline at end of file diff --git a/Header/Graphic/GraphicService.h b/Header/Graphic/GraphicService.h deleted file mode 100644 index a0514d024..000000000 --- a/Header/Graphic/GraphicService.h +++ /dev/null @@ -1,41 +0,0 @@ -#pragma once -#include - -namespace Graphics -{ - class GraphicService - { - private: - - const std::string game_window_title = "Alien Invader"; - - const int game_window_width = 1920; - const int game_window_height = 1080; - - const int frame_rate = 60; - - const sf::Color window_color = sf::Color::Black; - - sf::VideoMode* video_mode; // ptr to video mode - sf::RenderWindow* game_window; // ptr to a RenderWindow - - void setVideoMode(); // Method for setting our video mode - void onDestroy(); // method to run when window is deleted - - public: - GraphicService(); - ~GraphicService(); //cleanup - - //method to create the game window. returns a pointer to an instance of the game window - sf::RenderWindow* createGameWindow(); - - - void initialize(); //lifecycle functions - void update(); //.. - void render(); //.. - bool isGameWindowOpen(); //check if the window is open - - sf::RenderWindow* getGameWindow(); //getter for the game window instance - sf::Color getWindowColor();//get the color - }; -} \ No newline at end of file diff --git a/Header/Main/GameService.h b/Header/Main/GameService.h deleted file mode 100644 index 5671190cb..000000000 --- a/Header/Main/GameService.h +++ /dev/null @@ -1,42 +0,0 @@ -#pragma once -#include -#include "../../header/Global/ServiceLocator.h" - -namespace Main -{ - enum class GameState - { - BOOT, - MAIN_MENU, - GAMEPLAY, - }; - - class ServiceLocator; - - class GameService - { - private: - - static GameState current_state; - - Global::ServiceLocator* service_locator; - sf::RenderWindow* game_window; - - - void initialize(); // Handles game initialization. - void initializeVariables();// Handles game initialization. - void destroy(); // Handles cleanup tasks. - void showMainMenu(); - - public: - GameService(); // Constructor for initializing the GameService object. - ~GameService(); // Destructor for cleaning up resources upon object deletion. - - void ignite(); // Initiates the game. - void update(); // Updates the game logic and game state. - void render(); // Renders each frame of the game. - bool isRunning(); // Checks if the game is currently running. - static void setGameState(GameState new_state); - static GameState getGameState(); - }; -} \ No newline at end of file diff --git a/Header/Player/PlayerController.h b/Header/Player/PlayerController.h deleted file mode 100644 index 09c3098fd..000000000 --- a/Header/Player/PlayerController.h +++ /dev/null @@ -1,33 +0,0 @@ -#pragma once -#include - -namespace Player -{ - class PlayerView; - class PlayerModel; - enum class PlayerState; - - class PlayerController - { - private: - - PlayerView* player_view; - PlayerModel* player_model; - - void processPlayerInput(); - void moveLeft(); - void moveRight(); - - void fireBullet(); - - public: - PlayerController(); - ~PlayerController(); - - void initialize(); - void update(); - void render(); - - sf::Vector2f getPlayerPosition(); - }; -} \ No newline at end of file diff --git a/Header/Player/PlayerModel.h b/Header/Player/PlayerModel.h deleted file mode 100644 index 4cb5016dc..000000000 --- a/Header/Player/PlayerModel.h +++ /dev/null @@ -1,47 +0,0 @@ -#pragma once -#include - -namespace Player -{ - enum class PlayerState //Our Enum - { - ALIVE, - DEAD, - // we will add more states later - }; - - class PlayerModel - { - private: - const sf::Vector2f initial_player_position = sf::Vector2f(950.f, 950.f); - - sf::Vector2f player_position; - PlayerState player_state; //Declaration - int player_score; - - public: - const sf::Vector2f left_most_position = sf::Vector2f(50.f, 950.f); - const sf::Vector2f right_most_position = sf::Vector2f(1800.f, 950.f); - const sf::Vector2f barrel_position_offset = sf::Vector2f(20.f, 50.f); - - const float player_movement_speed = 600.0f; - - PlayerModel(); - ~PlayerModel(); - - void initialize(); - void reset(); - - sf::Vector2f getPlayerPosition(); - void setPlayerPosition(sf::Vector2f position); - - int getPlayerScore(); - void setPlayerScore(int score); - - //new getter and setter - PlayerState getPlayerState(); - void setPlayerState(PlayerState state); - - - }; -} diff --git a/Header/Player/PlayerService.h b/Header/Player/PlayerService.h deleted file mode 100644 index a978d53c5..000000000 --- a/Header/Player/PlayerService.h +++ /dev/null @@ -1,19 +0,0 @@ -#pragma once -#include "../../Header/Player/PlayerController.h" - -namespace Player -{ - class PlayerService - { - private: - PlayerController* player_controller; - - public: - PlayerService(); - ~PlayerService(); - - void initialize(); - void update(); - void render(); - }; -} diff --git a/Header/Player/PlayerView.h b/Header/Player/PlayerView.h deleted file mode 100644 index ec0eb5413..000000000 --- a/Header/Player/PlayerView.h +++ /dev/null @@ -1,30 +0,0 @@ -#pragma once -#include -#include "../../Header/Player/PlayerController.h" -#include "../../Header/UI/UIElement/ImageView.h" - -namespace Player -{ - class PlayerController; - class PlayerView - { - private: - const float player_sprite_width = 60.f; - const float player_sprite_height = 60.f; - - PlayerController* player_controller; - UI::UIElement::ImageView* player_image; - - void createUIElements(); - void initializeImage(); - void destroy(); - - public: - PlayerView(); - ~PlayerView(); - - void update(); - void render(); - void initialize(PlayerController* controller); - }; -} \ No newline at end of file diff --git a/Header/Powerups/Controllers/OutscalBombController.h b/Header/Powerups/Controllers/OutscalBombController.h deleted file mode 100644 index a4b344127..000000000 --- a/Header/Powerups/Controllers/OutscalBombController.h +++ /dev/null @@ -1,17 +0,0 @@ -#pragma once -#include "../../Header/Powerups/PowerupController.h" - -namespace Powerup -{ - namespace Controller - { - class OutscalBombController : public PowerupController - { - public: - OutscalBombController(PowerupType type); - virtual ~OutscalBombController(); - - void onCollected() override; - }; - } -} \ No newline at end of file diff --git a/Header/Powerups/Controllers/RapidFireController.h b/Header/Powerups/Controllers/RapidFireController.h deleted file mode 100644 index 2661e3569..000000000 --- a/Header/Powerups/Controllers/RapidFireController.h +++ /dev/null @@ -1,17 +0,0 @@ -#pragma once -#include "../../Header/Powerups/PowerupController.h" - -namespace Powerup -{ - namespace Controller - { - class RapidFireController : public PowerupController - { - public: - RapidFireController(PowerupType type); - virtual ~RapidFireController(); - - void onCollected() override; - }; - } -} \ No newline at end of file diff --git a/Header/Powerups/Controllers/ShieldController.h b/Header/Powerups/Controllers/ShieldController.h deleted file mode 100644 index 7c9064149..000000000 --- a/Header/Powerups/Controllers/ShieldController.h +++ /dev/null @@ -1,17 +0,0 @@ -#pragma once -#include "../../Header/Powerups/PowerupController.h" - -namespace Powerup -{ - namespace Controller - { - class ShieldController : public PowerupController - { - public: - ShieldController(PowerupType type); - virtual ~ShieldController(); - - void onCollected() override; - }; - } -} \ No newline at end of file diff --git a/Header/Powerups/Controllers/TrippleLaserController.h b/Header/Powerups/Controllers/TrippleLaserController.h deleted file mode 100644 index e343116a7..000000000 --- a/Header/Powerups/Controllers/TrippleLaserController.h +++ /dev/null @@ -1,17 +0,0 @@ -#pragma once -#include "../../Header/Powerups/PowerupController.h" - -namespace Powerup -{ - namespace Controller - { - class TrippleLaserController : public PowerupController - { - public: - TrippleLaserController(PowerupType type); - virtual ~TrippleLaserController(); - - void onCollected() override; - }; - } -} \ No newline at end of file diff --git a/Header/Powerups/PowerupConfig.h b/Header/Powerups/PowerupConfig.h deleted file mode 100644 index 2a11ef64f..000000000 --- a/Header/Powerups/PowerupConfig.h +++ /dev/null @@ -1,11 +0,0 @@ -#pragma once -namespace Powerup -{ - enum class PowerupType - { - SHIELD, - RAPID_FIRE, - TRIPPLE_LASER, - OUTSCAL_BOMB, // later redacted - }; -} \ No newline at end of file diff --git a/Header/Powerups/PowerupController.h b/Header/Powerups/PowerupController.h deleted file mode 100644 index fcbea0a3e..000000000 --- a/Header/Powerups/PowerupController.h +++ /dev/null @@ -1,33 +0,0 @@ -#pragma once -#include "../../header/Collectible/ICollectible.h" - -namespace Powerup -{ - class PowerupView; - class PowerupModel; - - enum class PowerupType; - - class PowerupController : public Collectible::ICollectible - { - protected: - PowerupView* powerup_view; - PowerupModel* powerup_model; - - void updatePowerupPosition(); - void handleOutOfBounds(); - - public: - PowerupController(PowerupType type); - virtual ~PowerupController(); - - void initialize(sf::Vector2f position) override; - void update() override; - void render() override; - - void onCollected() override; - - sf::Vector2f getCollectiblePosition() override; - PowerupType getPowerupType(); - }; -} diff --git a/Header/Powerups/PowerupModel.h b/Header/Powerups/PowerupModel.h deleted file mode 100644 index 104f227ee..000000000 --- a/Header/Powerups/PowerupModel.h +++ /dev/null @@ -1,31 +0,0 @@ -#pragma once -#include - -namespace Powerup -{ - enum class PowerupType; - - class PowerupModel - { - private: - float movement_speed = 300.f; - - sf::Vector2f powerup_position; - PowerupType powerup_type; - - public: - PowerupModel(PowerupType type); - ~PowerupModel(); - - void initialize(sf::Vector2f position); - - sf::Vector2f getPowerupPosition(); - void setPowerupPosition(sf::Vector2f position); - - PowerupType getPowerupType(); - void setPowerupType(PowerupType type); - - float getMovementSpeed(); - void setMovementSpeed(float speed); - }; -} \ No newline at end of file diff --git a/Header/Powerups/PowerupService.h b/Header/Powerups/PowerupService.h deleted file mode 100644 index 908ce8e57..000000000 --- a/Header/Powerups/PowerupService.h +++ /dev/null @@ -1,32 +0,0 @@ -#pragma once -#include -#include "SFML/System/Vector2.hpp" -#include "../../Header/Collectible/ICollectible.h" - -namespace Powerup -{ - - class PowerupController; - enum class PowerupType; - - class PowerupService - { - private: - std::vector powerup_list; - - PowerupController* createPowerup(PowerupType powerup_type); - void destroy(); - - public: - PowerupService(); - virtual ~PowerupService(); - - void initialize(); - void update(); - void render(); - - - PowerupController* spawnPowerup(PowerupType powerup_type, sf::Vector2f position); - void destroyPowerup(PowerupController* powerup_controller); - }; -} \ No newline at end of file diff --git a/Header/Powerups/PowerupView.h b/Header/Powerups/PowerupView.h deleted file mode 100644 index d63947915..000000000 --- a/Header/Powerups/PowerupView.h +++ /dev/null @@ -1,33 +0,0 @@ -#pragma once -#include -#include "../../Header/UI/UIElement/ImageView.h" - -namespace Powerup -{ - class PowerupController; - enum class PowerupType; - - class PowerupView - { - private: - const float powerup_sprite_width = 30.f; - const float powerup_sprite_height = 30.f; - - PowerupController* powerup_controller; - UI::UIElement::ImageView* powerup_image; - - void createUIElements(); - void initializeImage(); - sf::String getPowerupTexturePath(); - - void destroy(); - - public: - PowerupView(); - ~PowerupView(); - - void initialize(PowerupController* controller); - void update(); - void render(); - }; -} \ No newline at end of file diff --git a/Header/Projectile/IProjectile.h b/Header/Projectile/IProjectile.h deleted file mode 100644 index 770b0e973..000000000 --- a/Header/Projectile/IProjectile.h +++ /dev/null @@ -1,21 +0,0 @@ -#pragma once -#include -#include "../../Header/Bullet/BulletConfig.h" - -namespace Projectile -{ - enum class MovementDirection; - - class IProjectile - { - public: - virtual void initialize(sf::Vector2f position, Bullet::MovementDirection direction) = 0; - virtual void update() = 0; - virtual void render() = 0; - - virtual void updateProjectilePosition() = 0; - virtual sf::Vector2f getProjectilePosition() = 0; - - virtual ~IProjectile() {}; - }; -} diff --git a/Header/Sound/SoundService.h b/Header/Sound/SoundService.h deleted file mode 100644 index 93b0dd509..000000000 --- a/Header/Sound/SoundService.h +++ /dev/null @@ -1,29 +0,0 @@ -#pragma once -#include "SFML/Audio.hpp" - -namespace Sound -{ - enum class SoundType - { - BUTTON_CLICK, - }; - - class SoundService - { - private: - const int background_music_volume = 30; - - sf::Music background_music; - sf::Sound sound_effect; - sf::SoundBuffer buffer_button_click; - - void loadBackgroundMusicFromFile(); - void loadSoundFromFile(); - - public: - void initialize(); - - void playSound(SoundType soundType); - void playBackgroundMusic(); - }; -} \ No newline at end of file diff --git a/Header/Time/TimeService.h b/Header/Time/TimeService.h deleted file mode 100644 index 71184c46e..000000000 --- a/Header/Time/TimeService.h +++ /dev/null @@ -1,32 +0,0 @@ -#pragma once -#include - - // The TimeService class helps keep track of time in game and calculate delta time. - // Utilizes the library to calculate delta time. - -namespace Time -{ - class TimeService - { - private: - - // A point in time which indicates the starting time of previous frame. - std::chrono::time_point previous_time; - - float delta_time; //to store the detla time - - void updateDeltaTime(); // method to update time - float calculateDeltaTime(); //calculate time by subtracting the previous time from the current time - void updatePreviousTime(); // finally update the current time to be previous time - - public: - - //lifecycle methods - void initialize(); - void update(); - - //getter - float getDeltaTime(); - }; -} - diff --git a/Header/UI/Interface/IUIController.h b/Header/UI/Interface/IUIController.h deleted file mode 100644 index c97cf8d7a..000000000 --- a/Header/UI/Interface/IUIController.h +++ /dev/null @@ -1,18 +0,0 @@ -#pragma once -namespace UI -{ - namespace Interface - { - class IUIController - { - public: - - virtual void initialize() = 0; - virtual void update() = 0; - virtual void render() = 0; - virtual void show() = 0; - - virtual ~IUIController() { } - }; - } -} \ No newline at end of file diff --git a/Header/UI/MainMenu/MainMenuUIController.h b/Header/UI/MainMenu/MainMenuUIController.h deleted file mode 100644 index 1772f5c02..000000000 --- a/Header/UI/MainMenu/MainMenuUIController.h +++ /dev/null @@ -1,52 +0,0 @@ -#pragma once -#include -#include "../../header/UI/Interface/IUIController.h" -#include "../../header/UI/UIElement/ImageView.h" -#include "../../header/UI/UIElement/ButtonView.h" - -namespace UI -{ - namespace MainMenu - { - class MainMenuUIController :public Interface::IUIController - { - - private: - // Constants: - const float button_width = 400.f; - const float button_height = 140.f; - const float play_button_y_position = 500.f; - const float instructions_button_y_position = 700.f; - const float quit_button_y_position = 900.f; - const float background_alpha = 85.f; - UIElement::ImageView* background_image; - - // UI Elements - UIElement::ButtonView* play_button; - UIElement::ButtonView* instructions_button; - UIElement::ButtonView* quit_button; - - // Buttons and scaling - void createImage(); - void createButtons(); - void initializeBackgroundImage(); - void initializeButtons(); - void registerButtonCallback(); - - void playButtonCallback(); - void instructionsButtonCallback(); - void quitButtonCallback(); - - void destroy(); - - public: - MainMenuUIController(); - ~MainMenuUIController(); - - void initialize(); - void update(); - void render(); - void show() override; - }; - } -} \ No newline at end of file diff --git a/Header/UI/UIElement/ButtonView.h b/Header/UI/UIElement/ButtonView.h deleted file mode 100644 index 10941f6a6..000000000 --- a/Header/UI/UIElement/ButtonView.h +++ /dev/null @@ -1,37 +0,0 @@ -#pragma once -#include "../../header/UI/UIElement/ImageView.h" -#include - -namespace UI -{ - namespace UIElement - { - class ButtonView : public ImageView - { - private: - // Define a function pointer type for the callback function - using CallbackFunction = std::function; - - // Store the callback function - CallbackFunction callback_function = nullptr; - - void printButtonClicked(); - - protected: - sf::String button_title; - - virtual void handleButtonInteraction(); - virtual bool clickedButton(sf::Sprite* button_sprite, sf::Vector2f mouse_position); - - public: - ButtonView(); - virtual ~ButtonView(); - - virtual void initialize(sf::String title, sf::String texture_path, float button_width, float button_height, sf::Vector2f position); - virtual void update() override; - virtual void render() override; - - void registerCallbackFuntion(CallbackFunction button_callback); - }; - } -} \ No newline at end of file diff --git a/Header/UI/UIElement/ImageView.h b/Header/UI/UIElement/ImageView.h deleted file mode 100644 index 875bf69d0..000000000 --- a/Header/UI/UIElement/ImageView.h +++ /dev/null @@ -1,31 +0,0 @@ -#pragma once -#include "../../header/UI/UIElement/UIView.h" - -namespace UI -{ - namespace UIElement - { - class ImageView : public UIView - { - protected: - sf::Texture image_texture; - sf::Sprite image_sprite; - - public: - ImageView(); - virtual ~ImageView(); - - virtual void initialize(sf::String texture_path, float image_width, float image_height, sf::Vector2f position); - virtual void update() override; - virtual void render() override; - - virtual void setTexture(sf::String texture_path); - virtual void setScale(float width, float height); - virtual void setPosition(sf::Vector2f position); - virtual void setRotation(float rotation_angle); - virtual void setOriginAtCentre(); - virtual void setImageAlpha(float alpha); - virtual void setCentreAlinged(); - }; - } -} \ No newline at end of file diff --git a/Header/UI/UIElement/TextView.h b/Header/UI/UIElement/TextView.h deleted file mode 100644 index 5a5e51c6a..000000000 --- a/Header/UI/UIElement/TextView.h +++ /dev/null @@ -1,45 +0,0 @@ -#pragma once -#include "../../header/UI/UIElement/UIView.h" - -namespace UI -{ - namespace UIElement - { - enum class FontType - { - BUBBLE_BOBBLE, - DS_DIGIB, - }; - - class TextView : public UIView - { - private: - static const int default_font_size = 55; - - static sf::Font font_bubble_bobble; - static sf::Font font_DS_DIGIB; - - sf::Text text; - - static void loadFont(); - - void setFont(FontType font_type); - void setFontSize(int font_size); - void setTextPosition(sf::Vector2f position); - void setTextColor(sf::Color color); - - public: - TextView(); - virtual ~TextView(); - - static void initializeTextView(); - - virtual void initialize(sf::String text_value, sf::Vector2f position, FontType font_type = FontType::BUBBLE_BOBBLE, int font_size = default_font_size, sf::Color color = sf::Color::White); - virtual void update() override; - virtual void render() override; - - void setText(sf::String text_value); - void setTextCentreAligned(); - }; - } -} \ No newline at end of file diff --git a/Header/UI/UIElement/UIView.h b/Header/UI/UIElement/UIView.h deleted file mode 100644 index be748be05..000000000 --- a/Header/UI/UIElement/UIView.h +++ /dev/null @@ -1,33 +0,0 @@ -#pragma once -#include - -namespace UI -{ - namespace UIElement - { - enum class UIState - { - VISIBLE, - HIDDEN, - }; - - class UIView - { - protected: - sf::RenderWindow* game_window; - UIState ui_state; - - public: - UIView(); - virtual ~UIView(); - - virtual void initialize(); - virtual void update(); - virtual void render(); - - // to enable/disable render of ui - virtual void show(); - virtual void hide(); - }; - } -} \ No newline at end of file diff --git a/Header/UI/UIService.h b/Header/UI/UIService.h deleted file mode 100644 index 1acbeb81b..000000000 --- a/Header/UI/UIService.h +++ /dev/null @@ -1,26 +0,0 @@ -#pragma once -#include "../../Header/UI/MainMenu/MainMenuUIController.h" -#include "../../Header/UI/Interface/IUIController.h" - -namespace UI -{ - class UIService - { - private: - MainMenu::MainMenuUIController* main_menu_controller; - - void createControllers(); - void initializeControllers(); - Interface::IUIController* getCurrentUIController(); - void destroy(); - - public: - UIService(); - ~UIService(); - - void initialize(); - void update(); - void render(); - void showScreen(); - }; -} \ No newline at end of file From 6982a28107d32f1c1e8b31a570635ddac170e178 Mon Sep 17 00:00:00 2001 From: Rishi Saxena Date: Sun, 11 Aug 2024 15:00:12 +0530 Subject: [PATCH 47/56] added Entity --- Space-Invaders/Header/Bullet/BulletController.h | 4 +++- Space-Invaders/Header/Bullet/BulletModel.h | 7 ++++++- Space-Invaders/Header/Bullet/BulletService.h | 5 +++-- Space-Invaders/Header/Entity/EntityConfig.h | 12 ++++++++++++ 4 files changed, 24 insertions(+), 4 deletions(-) create mode 100644 Space-Invaders/Header/Entity/EntityConfig.h diff --git a/Space-Invaders/Header/Bullet/BulletController.h b/Space-Invaders/Header/Bullet/BulletController.h index d8c97559b..2d66e5f0b 100644 --- a/Space-Invaders/Header/Bullet/BulletController.h +++ b/Space-Invaders/Header/Bullet/BulletController.h @@ -1,6 +1,7 @@ #pragma once #include "../../Header/Projectile/IProjectile.h" #include "../../Header/Bullet/BulletConfig.h" +#include "../../Header/Entity/EntityConfig.h" namespace Bullet { @@ -23,7 +24,7 @@ namespace Bullet public: - BulletController(BulletType type); + BulletController(BulletType type, Entity::EntityType owner_type); virtual ~BulletController() override; void initialize(sf::Vector2f position, Bullet::MovementDirection direction) override; void update() override; @@ -31,5 +32,6 @@ namespace Bullet sf::Vector2f getProjectilePosition() override; BulletType getBulletType(); + Entity::EntityType getOwnerEntityType(); }; } \ No newline at end of file diff --git a/Space-Invaders/Header/Bullet/BulletModel.h b/Space-Invaders/Header/Bullet/BulletModel.h index a6d9a45e2..ad99418ec 100644 --- a/Space-Invaders/Header/Bullet/BulletModel.h +++ b/Space-Invaders/Header/Bullet/BulletModel.h @@ -1,5 +1,6 @@ #pragma once #include +#include "../../Header/Entity/EntityConfig.h" namespace Bullet { @@ -15,9 +16,11 @@ namespace Bullet BulletType bullet_type; MovementDirection movement_direction; + Entity::EntityType owner_type; + public: - BulletModel(BulletType type); + BulletModel(BulletType type, Entity::EntityType owner_type); ~BulletModel(); void initialize(sf::Vector2f position, MovementDirection direction); @@ -33,5 +36,7 @@ namespace Bullet float getMovementSpeed(); void setMovementSpeed(float speed); + + Entity::EntityType getOwnerEntityType(); }; } \ No newline at end of file diff --git a/Space-Invaders/Header/Bullet/BulletService.h b/Space-Invaders/Header/Bullet/BulletService.h index cc8939bb6..02f77423a 100644 --- a/Space-Invaders/Header/Bullet/BulletService.h +++ b/Space-Invaders/Header/Bullet/BulletService.h @@ -2,6 +2,7 @@ #include #include "SFML/System/Vector2.hpp" #include "../../Header/Projectile/IProjectile.h" +#include "../../Header/Entity/EntityConfig.h" namespace Bullet { @@ -15,7 +16,7 @@ namespace Bullet std::vector bullet_list; - BulletController* createBullet(BulletType bullet_type); + BulletController* createBullet(BulletType bullet_type, Entity::EntityType owner_type); void destroy(); public: @@ -26,7 +27,7 @@ namespace Bullet void update(); void render(); - BulletController* spawnBullet(BulletType bullet_type, sf::Vector2f position, MovementDirection direction); + BulletController* spawnBullet(BulletType bullet_type, sf::Vector2f position, MovementDirection direction, Entity::EntityType owner_type); void destroyBullet(BulletController* bullet_controller); }; } \ No newline at end of file diff --git a/Space-Invaders/Header/Entity/EntityConfig.h b/Space-Invaders/Header/Entity/EntityConfig.h new file mode 100644 index 000000000..234b5e75d --- /dev/null +++ b/Space-Invaders/Header/Entity/EntityConfig.h @@ -0,0 +1,12 @@ +#pragma once +namespace Entity +{ + enum class EntityType + { + PLAYER, + ENEMY, + BULLET, + BUNKER, + DEFAULT, + }; +} \ No newline at end of file From caa232597a3126d856e5006a2eb7721711664d43 Mon Sep 17 00:00:00 2001 From: Rishi Saxena Date: Sun, 11 Aug 2024 15:03:27 +0530 Subject: [PATCH 48/56] Added Entity types --- Space-Invaders/Source/Bullet/BulletController.cpp | 2 +- Space-Invaders/Source/Bullet/BulletModel.cpp | 2 +- Space-Invaders/Source/Bullet/BulletService.cpp | 6 +++--- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Space-Invaders/Source/Bullet/BulletController.cpp b/Space-Invaders/Source/Bullet/BulletController.cpp index d7f4f8500..f284b3139 100644 --- a/Space-Invaders/Source/Bullet/BulletController.cpp +++ b/Space-Invaders/Source/Bullet/BulletController.cpp @@ -50,7 +50,7 @@ namespace Bullet } } - BulletController::BulletController(BulletType type) + BulletController::BulletController(BulletType type, Entity::EntityType owner_type) { bullet_view = new BulletView(); bullet_model = new BulletModel(type); diff --git a/Space-Invaders/Source/Bullet/BulletModel.cpp b/Space-Invaders/Source/Bullet/BulletModel.cpp index ed80e5b04..5f6181cea 100644 --- a/Space-Invaders/Source/Bullet/BulletModel.cpp +++ b/Space-Invaders/Source/Bullet/BulletModel.cpp @@ -2,7 +2,7 @@ namespace Bullet { - BulletModel::BulletModel(BulletType type) + BulletModel::BulletModel(BulletType type, Entity::EntityType owner_type) { bullet_type = type; } diff --git a/Space-Invaders/Source/Bullet/BulletService.cpp b/Space-Invaders/Source/Bullet/BulletService.cpp index 897d61a83..e868b0a64 100644 --- a/Space-Invaders/Source/Bullet/BulletService.cpp +++ b/Space-Invaders/Source/Bullet/BulletService.cpp @@ -26,7 +26,7 @@ namespace Bullet for (int i = 0; i < bullet_list.size(); i++) bullet_list[i]->render(); } - BulletController* BulletService::createBullet(BulletType bullet_type) + BulletController* BulletService::createBullet(BulletType bullet_type, Entity::EntityType owner_type) { switch (bullet_type) { @@ -46,9 +46,9 @@ namespace Bullet for (int i = 0; i < bullet_list.size(); i++) delete (bullet_list[i]); } - BulletController* BulletService::spawnBullet(BulletType bullet_type, sf::Vector2f position, MovementDirection direction) + BulletController* BulletService::spawnBullet(BulletType bullet_type, sf::Vector2f position, MovementDirection direction, Entity::EntityType owner_type) { - BulletController* bullet_controller = createBullet(bullet_type); + BulletController* bullet_controller = createBullet(bullet_type, owner_type); bullet_controller->initialize(position, direction); bullet_list.push_back(bullet_controller); From e71eb4b14066d4b012964525c195c41326ff092b Mon Sep 17 00:00:00 2001 From: Rishi Saxena Date: Mon, 12 Aug 2024 13:13:01 +0530 Subject: [PATCH 49/56] Added Collision service --- .../Header/Collision/CollisionService.h | 28 +++++++++++++++++++ Space-Invaders/Header/Collision/ICollider.h | 28 +++++++++++++++++++ 2 files changed, 56 insertions(+) create mode 100644 Space-Invaders/Header/Collision/CollisionService.h create mode 100644 Space-Invaders/Header/Collision/ICollider.h diff --git a/Space-Invaders/Header/Collision/CollisionService.h b/Space-Invaders/Header/Collision/CollisionService.h new file mode 100644 index 000000000..be71997c3 --- /dev/null +++ b/Space-Invaders/Header/Collision/CollisionService.h @@ -0,0 +1,28 @@ +#pragma once +#include + +namespace Collision +{ + class ICollider; + + class CollisionService + { + private: + std::vector collider_list; + + void processCollision(); + void doCollision(int index_i, int index_j); + bool hasCollisionOccurred(int index_i, int index_j); + bool areActiveColliders(int index_i, int index_j); + + public: + CollisionService(); + ~CollisionService(); + + void initialize(); + void update(); + + void addCollider(ICollider* collider); + void removeCollider(ICollider* collider); + }; +} \ No newline at end of file diff --git a/Space-Invaders/Header/Collision/ICollider.h b/Space-Invaders/Header/Collision/ICollider.h new file mode 100644 index 000000000..0f556a5f3 --- /dev/null +++ b/Space-Invaders/Header/Collision/ICollider.h @@ -0,0 +1,28 @@ +#pragma once +#include + +namespace Collision +{ + enum class CollisionState + { + ENABLED, + DISABLED, + }; + + class ICollider + { + private: + CollisionState collision_state; + + public: + ICollider(); + virtual ~ICollider(); + + virtual const sf::Sprite& getColliderSprite() = 0; + virtual void onCollision(ICollider* other_collider) = 0; + + void enableCollision(); + void disableCollision(); + CollisionState getCollisionState(); + }; +} \ No newline at end of file From 41bd3b19c6774cc6372103bcf39106cfffc1451c Mon Sep 17 00:00:00 2001 From: Rishi Saxena Date: Mon, 12 Aug 2024 13:13:57 +0530 Subject: [PATCH 50/56] Collision service added --- .../Source/Collision/CollisionService.cpp | 66 +++++++++++++++++++ Space-Invaders/Source/Collision/ICollider.cpp | 14 ++++ 2 files changed, 80 insertions(+) create mode 100644 Space-Invaders/Source/Collision/CollisionService.cpp create mode 100644 Space-Invaders/Source/Collision/ICollider.cpp diff --git a/Space-Invaders/Source/Collision/CollisionService.cpp b/Space-Invaders/Source/Collision/CollisionService.cpp new file mode 100644 index 000000000..b5c83a8c7 --- /dev/null +++ b/Space-Invaders/Source/Collision/CollisionService.cpp @@ -0,0 +1,66 @@ +#include "../../Header/Collision/CollisionService.h" +#include "../../Header/Collision/ICollider.h" + +namespace Collision +{ + CollisionService::CollisionService() { } + + CollisionService::~CollisionService() { } + + void CollisionService::initialize() { } + + void CollisionService::update() + { + processCollision(); + } + + void CollisionService::processCollision() + { + for (int i = 0; i < collider_list.size(); i++) + { + for (int j = i + 1; j < collider_list.size(); j++) + { + doCollision(i, j); + } + } + } + + void CollisionService::doCollision(int index_i, int index_j) + { + if (collider_list[index_i]->getCollisionState() == CollisionState::DISABLED || + collider_list[index_j]->getCollisionState() == CollisionState::DISABLED) return; + + if (hasCollisionOccurred(index_i, index_j)) + { + if (areActiveColliders(index_i, index_j)) + collider_list[index_i]->onCollision(collider_list[index_j]); + + if (areActiveColliders(index_i, index_j)) + collider_list[index_j]->onCollision(collider_list[index_i]); + } + } + + bool CollisionService::hasCollisionOccurred(int index_i, int index_j) + { + const sf::Sprite& collider_one_sprite = collider_list[index_i]->getColliderSprite(); + const sf::Sprite& collider_two_sprite = collider_list[index_j]->getColliderSprite(); + + return collider_one_sprite.getGlobalBounds().intersects(collider_two_sprite.getGlobalBounds()); + } + + bool CollisionService::areActiveColliders(int index_i, int index_j) + { + return (index_i < collider_list.size() && index_j < collider_list.size() && + collider_list[index_i] != nullptr && collider_list[index_j] != nullptr); + } + + void CollisionService::addCollider(ICollider* collider) + { + collider_list.push_back(collider); + } + + void CollisionService::removeCollider(ICollider* collider) + { + collider_list.erase(std::remove(collider_list.begin(), collider_list.end(), collider), collider_list.end()); + } +} \ No newline at end of file diff --git a/Space-Invaders/Source/Collision/ICollider.cpp b/Space-Invaders/Source/Collision/ICollider.cpp new file mode 100644 index 000000000..16829d4f6 --- /dev/null +++ b/Space-Invaders/Source/Collision/ICollider.cpp @@ -0,0 +1,14 @@ +#include "../../Header/Collision/ICollider.h" + +namespace Collision +{ + ICollider::ICollider() { collision_state = CollisionState::ENABLED; } + + ICollider::~ICollider() { } + + void ICollider::enableCollision() { collision_state = CollisionState::ENABLED; } + + void ICollider::disableCollision() { collision_state = CollisionState::DISABLED; } + + CollisionState ICollider::getCollisionState() { return collision_state; } +} From 05d83a2d8dcb1d8af7df664766f5e8897114579e Mon Sep 17 00:00:00 2001 From: Rishi Saxena Date: Wed, 14 Aug 2024 15:48:45 +0530 Subject: [PATCH 51/56] Added last changes to the bullets --- Space-Invaders/Header/Bullet/BulletConfig.h | 12 +++++ .../Header/Bullet/BulletController.h | 15 +++++- Space-Invaders/Header/Bullet/BulletModel.h | 5 +- Space-Invaders/Header/Bullet/BulletService.h | 6 +++ Space-Invaders/Header/Bullet/BulletView.h | 2 + .../Controllers/FrostBulletController.h | 2 +- .../Controllers/LaserBulletController.h | 2 +- .../Bullet/Controllers/TorpedoController.h | 2 +- .../Header/Element/Bunker/BunkerController.h | 7 ++- .../Header/Element/Bunker/BunkerView.h | 1 + .../Header/Element/ElementService.h | 6 +++ .../Enemy/Controllers/SubZeroController.h | 2 + .../Controllers/ThunderSnakeController.h | 2 + .../Header/Enemy/Controllers/UFOController.h | 2 + .../Enemy/Controllers/ZapperController.h | 2 + Space-Invaders/Header/Enemy/EnemyController.h | 7 ++- Space-Invaders/Header/Enemy/EnemyModel.h | 3 ++ Space-Invaders/Header/Enemy/EnemyService.h | 6 ++- Space-Invaders/Header/Enemy/EnemyView.h | 2 +- .../Header/Gameplay/GameplayService.h | 2 + Space-Invaders/Header/Global/ServiceLocator.h | 3 ++ Space-Invaders/Header/Main/GameService.h | 6 ++- .../Header/Player/PlayerController.h | 42 ++++++++++++++- Space-Invaders/Header/Player/PlayerModel.h | 45 +++++++++++++++- Space-Invaders/Header/Player/PlayerService.h | 9 ++++ Space-Invaders/Header/Player/PlayerView.h | 1 + .../Controllers/OutscalBombController.h | 1 + .../Controllers/RapidFireController.h | 1 + .../Powerups/Controllers/ShieldController.h | 1 + .../Controllers/TrippleLaserController.h | 1 + .../Header/Powerups/PowerupController.h | 9 +++- .../Header/Powerups/PowerupService.h | 3 ++ Space-Invaders/Header/Powerups/PowerupView.h | 1 + .../UI/GameplayUI/GameplayUIController.h | 51 +++++++++++++++++++ .../SplashScreen/SplashScreenUIController.h | 37 ++++++++++++++ .../Header/UI/UIElement/ImageView.h | 2 + Space-Invaders/Header/UI/UIService.h | 4 ++ 37 files changed, 286 insertions(+), 19 deletions(-) create mode 100644 Space-Invaders/Header/UI/GameplayUI/GameplayUIController.h create mode 100644 Space-Invaders/Header/UI/SplashScreen/SplashScreenUIController.h diff --git a/Space-Invaders/Header/Bullet/BulletConfig.h b/Space-Invaders/Header/Bullet/BulletConfig.h index 3d40244af..8a8b7d093 100644 --- a/Space-Invaders/Header/Bullet/BulletConfig.h +++ b/Space-Invaders/Header/Bullet/BulletConfig.h @@ -1,4 +1,6 @@ #pragma once +#include + namespace Bullet { enum class BulletType @@ -13,4 +15,14 @@ namespace Bullet UP, //player needs to shoot in upward direction DOWN, // enemies always shoot in downward direction }; + + class BulletConfig + { + public: + static const sf::String laser_bullet_texture_path; + static const sf::String torpedoe_texture_path; + static const sf::String frost_beam_texture_path; + + static sf::String getBulletTexturePath(BulletType bullet_type); + }; } \ No newline at end of file diff --git a/Space-Invaders/Header/Bullet/BulletController.h b/Space-Invaders/Header/Bullet/BulletController.h index 2d66e5f0b..e8ac207e3 100644 --- a/Space-Invaders/Header/Bullet/BulletController.h +++ b/Space-Invaders/Header/Bullet/BulletController.h @@ -1,7 +1,7 @@ #pragma once #include "../../Header/Projectile/IProjectile.h" -#include "../../Header/Bullet/BulletConfig.h" #include "../../Header/Entity/EntityConfig.h" +#include "../Collision/ICollider.h" namespace Bullet { @@ -9,7 +9,7 @@ namespace Bullet class BulletModel; enum class BulletType; - class BulletController : public Projectile::IProjectile + class BulletController : public Projectile::IProjectile, public Collision::ICollider { protected: @@ -18,6 +18,13 @@ namespace Bullet void updateProjectilePosition() override; + //Collision funcs + void processBulletCollision(ICollider* other_collider); + void processEnemyCollision(ICollider* other_collider); + void processPlayerCollision(ICollider* other_collider); + void processBunkerCollision(ICollider* other_collider); + + void moveUp(); void moveDown(); void handleOutOfBounds(); @@ -26,6 +33,7 @@ namespace Bullet BulletController(BulletType type, Entity::EntityType owner_type); virtual ~BulletController() override; + void initialize(sf::Vector2f position, Bullet::MovementDirection direction) override; void update() override; void render() override; @@ -33,5 +41,8 @@ namespace Bullet sf::Vector2f getProjectilePosition() override; BulletType getBulletType(); Entity::EntityType getOwnerEntityType(); + + const sf::Sprite& getColliderSprite() override; + void onCollision(ICollider* other_collider) override; }; } \ No newline at end of file diff --git a/Space-Invaders/Header/Bullet/BulletModel.h b/Space-Invaders/Header/Bullet/BulletModel.h index ad99418ec..ccb0fd0b9 100644 --- a/Space-Invaders/Header/Bullet/BulletModel.h +++ b/Space-Invaders/Header/Bullet/BulletModel.h @@ -29,14 +29,13 @@ namespace Bullet void setBulletPosition(sf::Vector2f position); BulletType getBulletType(); - void setBulletType(BulletType type); + + Entity::EntityType getOwnerEntityType(); MovementDirection getMovementDirection(); void setMovementDirection(MovementDirection direction); float getMovementSpeed(); void setMovementSpeed(float speed); - - Entity::EntityType getOwnerEntityType(); }; } \ No newline at end of file diff --git a/Space-Invaders/Header/Bullet/BulletService.h b/Space-Invaders/Header/Bullet/BulletService.h index 02f77423a..4b1b45fb0 100644 --- a/Space-Invaders/Header/Bullet/BulletService.h +++ b/Space-Invaders/Header/Bullet/BulletService.h @@ -14,9 +14,14 @@ namespace Bullet { private: + std::vector flagged_bullet_list; std::vector bullet_list; BulletController* createBullet(BulletType bullet_type, Entity::EntityType owner_type); + + bool isValidBullet(int index_i, std::vector& bullet_list); + void destroyFlaggedBullets(); + void destroy(); public: @@ -29,5 +34,6 @@ namespace Bullet BulletController* spawnBullet(BulletType bullet_type, sf::Vector2f position, MovementDirection direction, Entity::EntityType owner_type); void destroyBullet(BulletController* bullet_controller); + void reset(); }; } \ No newline at end of file diff --git a/Space-Invaders/Header/Bullet/BulletView.h b/Space-Invaders/Header/Bullet/BulletView.h index 52bf08af7..bc6018023 100644 --- a/Space-Invaders/Header/Bullet/BulletView.h +++ b/Space-Invaders/Header/Bullet/BulletView.h @@ -30,5 +30,7 @@ namespace Bullet void initialize(BulletController* controller); void update(); void render(); + + const sf::Sprite& getBulletSprite(); }; } \ No newline at end of file diff --git a/Space-Invaders/Header/Bullet/Controllers/FrostBulletController.h b/Space-Invaders/Header/Bullet/Controllers/FrostBulletController.h index 3188333d9..8a99046c9 100644 --- a/Space-Invaders/Header/Bullet/Controllers/FrostBulletController.h +++ b/Space-Invaders/Header/Bullet/Controllers/FrostBulletController.h @@ -11,7 +11,7 @@ namespace Bullet const float torpedo_movement_speed = 500.f; public: - FrostBulletController(BulletType type); + FrostBulletController(BulletType type, Entity::EntityType owner_type); ~FrostBulletController(); void initialize(sf::Vector2f position, MovementDirection direction) override; diff --git a/Space-Invaders/Header/Bullet/Controllers/LaserBulletController.h b/Space-Invaders/Header/Bullet/Controllers/LaserBulletController.h index 67a48b89f..ec61a727d 100644 --- a/Space-Invaders/Header/Bullet/Controllers/LaserBulletController.h +++ b/Space-Invaders/Header/Bullet/Controllers/LaserBulletController.h @@ -8,7 +8,7 @@ namespace Bullet class LaserBulletController : public BulletController { public: - LaserBulletController(BulletType type); + LaserBulletController(BulletType type, Entity::EntityType owner_type); ~LaserBulletController(); void initialize(sf::Vector2f position, MovementDirection direction) override; diff --git a/Space-Invaders/Header/Bullet/Controllers/TorpedoController.h b/Space-Invaders/Header/Bullet/Controllers/TorpedoController.h index 99ac2d88a..ea8b59782 100644 --- a/Space-Invaders/Header/Bullet/Controllers/TorpedoController.h +++ b/Space-Invaders/Header/Bullet/Controllers/TorpedoController.h @@ -11,7 +11,7 @@ namespace Bullet const float torpedo_movement_speed = 200.f; public: - TorpedoController(BulletType type); + TorpedoController(BulletType type, Entity::EntityType owner_type); ~TorpedoController(); void initialize(sf::Vector2f position, MovementDirection direction) override; diff --git a/Space-Invaders/Header/Element/Bunker/BunkerController.h b/Space-Invaders/Header/Element/Bunker/BunkerController.h index 3370da4b2..463be0627 100644 --- a/Space-Invaders/Header/Element/Bunker/BunkerController.h +++ b/Space-Invaders/Header/Element/Bunker/BunkerController.h @@ -1,5 +1,6 @@ #pragma once #include +#include "../../Collision/ICollider.h" #include "../../header/Element/Bunker/BunkerModel.h" namespace Element @@ -8,7 +9,7 @@ namespace Element { class BunkerView; - class BunkerController + class BunkerController : public Collision::ICollider { private: BunkerView* bunker_view; @@ -23,6 +24,10 @@ namespace Element void render(); sf::Vector2f getBunkerPosition(); + + //sprite get method using getsprite + const sf::Sprite& getColliderSprite() override; + void onCollision(ICollider* other_collider) override; }; } } \ No newline at end of file diff --git a/Space-Invaders/Header/Element/Bunker/BunkerView.h b/Space-Invaders/Header/Element/Bunker/BunkerView.h index 9bf2ac2de..64dd64d9e 100644 --- a/Space-Invaders/Header/Element/Bunker/BunkerView.h +++ b/Space-Invaders/Header/Element/Bunker/BunkerView.h @@ -27,6 +27,7 @@ namespace Element ~BunkerView(); void initialize(BunkerController* controller); + const sf::Sprite& getBunkerSprite(); void update(); void render(); }; diff --git a/Space-Invaders/Header/Element/ElementService.h b/Space-Invaders/Header/Element/ElementService.h index e9c4c8719..23ce7c62c 100644 --- a/Space-Invaders/Header/Element/ElementService.h +++ b/Space-Invaders/Header/Element/ElementService.h @@ -20,7 +20,10 @@ namespace Element Bunker::BunkerData(sf::Vector2f(1730.0f, 800.f)) }; std::vector bunker_list; + std::vector flagged_bunker_list; + void spawnBunkers(); + void destroyFlaggedBunkers(); void destroy(); public: @@ -30,5 +33,8 @@ namespace Element void initialize(); void update(); void render(); + + void reset(); + void destroyBunker(Bunker::BunkerController* bunker_controller); }; } \ No newline at end of file diff --git a/Space-Invaders/Header/Enemy/Controllers/SubZeroController.h b/Space-Invaders/Header/Enemy/Controllers/SubZeroController.h index d27ae5a7f..2a39d526d 100644 --- a/Space-Invaders/Header/Enemy/Controllers/SubZeroController.h +++ b/Space-Invaders/Header/Enemy/Controllers/SubZeroController.h @@ -18,6 +18,8 @@ namespace Enemy void fireBullet() override; + void destroy(); + public: SubzeroController(EnemyType type); diff --git a/Space-Invaders/Header/Enemy/Controllers/ThunderSnakeController.h b/Space-Invaders/Header/Enemy/Controllers/ThunderSnakeController.h index 77211e9ef..c31e0d291 100644 --- a/Space-Invaders/Header/Enemy/Controllers/ThunderSnakeController.h +++ b/Space-Invaders/Header/Enemy/Controllers/ThunderSnakeController.h @@ -19,6 +19,8 @@ namespace Enemy void fireBullet() override; + void destroy(); + MovementDirection getInitialMovementDirection(); public: diff --git a/Space-Invaders/Header/Enemy/Controllers/UFOController.h b/Space-Invaders/Header/Enemy/Controllers/UFOController.h index c11dc5e03..d829acb67 100644 --- a/Space-Invaders/Header/Enemy/Controllers/UFOController.h +++ b/Space-Invaders/Header/Enemy/Controllers/UFOController.h @@ -15,6 +15,7 @@ namespace Enemy void moveRight(); void fireBullet() override; + void destroy() override; Powerup::PowerupType getRandomPowerupType(); public: @@ -22,6 +23,7 @@ namespace Enemy ~UFOController(); void initialize() override; + void onCollision(ICollider* other_collider) override; }; } } \ No newline at end of file diff --git a/Space-Invaders/Header/Enemy/Controllers/ZapperController.h b/Space-Invaders/Header/Enemy/Controllers/ZapperController.h index fc5a3b414..90a0916eb 100644 --- a/Space-Invaders/Header/Enemy/Controllers/ZapperController.h +++ b/Space-Invaders/Header/Enemy/Controllers/ZapperController.h @@ -19,6 +19,8 @@ namespace Enemy void fireBullet() override; + void destroy(); + public: ZapperController(EnemyType type); diff --git a/Space-Invaders/Header/Enemy/EnemyController.h b/Space-Invaders/Header/Enemy/EnemyController.h index 7b2a2a3c0..8876770aa 100644 --- a/Space-Invaders/Header/Enemy/EnemyController.h +++ b/Space-Invaders/Header/Enemy/EnemyController.h @@ -1,5 +1,6 @@ #pragma once #include +#include "../../Header/Collision/ICollider.h" namespace Enemy { @@ -9,7 +10,7 @@ namespace Enemy enum class EnemyType; enum class EnemyState; - class EnemyController + class EnemyController : public Collision::ICollider { protected: @@ -30,6 +31,7 @@ namespace Enemy virtual void move() = 0; sf::Vector2f getRandomInitialPosition(); + virtual void destroy(); void handleOutOfBounds(); public: @@ -43,5 +45,8 @@ namespace Enemy sf::Vector2f getEnemyPosition(); EnemyState getEnemyState(); EnemyType getEnemyType(); + + const sf::Sprite& getColliderSprite() override; + virtual void onCollision(ICollider* other_collider) override; }; } \ No newline at end of file diff --git a/Space-Invaders/Header/Enemy/EnemyModel.h b/Space-Invaders/Header/Enemy/EnemyModel.h index 080cd9e83..f29b16c61 100644 --- a/Space-Invaders/Header/Enemy/EnemyModel.h +++ b/Space-Invaders/Header/Enemy/EnemyModel.h @@ -1,5 +1,6 @@ #pragma once #include +#include "../../header/Entity/EntityConfig.h" namespace Enemy { @@ -13,6 +14,7 @@ namespace Enemy sf::Vector2f reference_position = sf::Vector2f(50.f, 50.f); sf::Vector2f enemy_position; + Entity::EntityType entity_type; MovementDirection movement_direction; EnemyType enemy_type; EnemyState enemy_state; @@ -45,5 +47,6 @@ namespace Enemy void setEnemyType(EnemyType type); MovementDirection getMovementDirection(); void setMovementDirection(MovementDirection direction); + Entity::EntityType getEntityType(); }; } \ No newline at end of file diff --git a/Space-Invaders/Header/Enemy/EnemyService.h b/Space-Invaders/Header/Enemy/EnemyService.h index 8f9dd776f..16e5900bf 100644 --- a/Space-Invaders/Header/Enemy/EnemyService.h +++ b/Space-Invaders/Header/Enemy/EnemyService.h @@ -13,6 +13,7 @@ namespace Enemy const float spawn_interval = 2.f; std::vector enemy_list; + std::vector flagged_enemy_list; float spawn_timer; void updateSpawnTimer(); @@ -20,15 +21,18 @@ namespace Enemy EnemyType getRandomEnemyType(); EnemyController* createEnemy(EnemyType enemy_type); void destroy(); + void destroyFlaggedEnemies(); public: EnemyService(); - ~EnemyService(); + virtual ~EnemyService(); void initialize(); void update(); void render(); + void reset(); + EnemyController* spawnEnemy(); // Function to spawn enemy void destroyEnemy(EnemyController* enemy_controller); }; diff --git a/Space-Invaders/Header/Enemy/EnemyView.h b/Space-Invaders/Header/Enemy/EnemyView.h index 04258819c..e7908e6f6 100644 --- a/Space-Invaders/Header/Enemy/EnemyView.h +++ b/Space-Invaders/Header/Enemy/EnemyView.h @@ -26,7 +26,7 @@ namespace Enemy public: EnemyView(); ~EnemyView(); - + const sf::Sprite& getEnemySprite(); void initialize(EnemyController* controller); void update(); void render(); diff --git a/Space-Invaders/Header/Gameplay/GameplayService.h b/Space-Invaders/Header/Gameplay/GameplayService.h index 53efd34a5..2ca78e2e9 100644 --- a/Space-Invaders/Header/Gameplay/GameplayService.h +++ b/Space-Invaders/Header/Gameplay/GameplayService.h @@ -15,5 +15,7 @@ namespace Gameplay void initialize(); void update(); void render(); + + void restart(); }; } \ No newline at end of file diff --git a/Space-Invaders/Header/Global/ServiceLocator.h b/Space-Invaders/Header/Global/ServiceLocator.h index ba6b11743..d536edd94 100644 --- a/Space-Invaders/Header/Global/ServiceLocator.h +++ b/Space-Invaders/Header/Global/ServiceLocator.h @@ -10,6 +10,7 @@ #include "../../Header/Sound/SoundService.h" #include "../../Header/Bullet/BulletService.h" #include "../../Header/Powerups/PowerupService.h" +#include "../../Header/Collision/CollisionService.h" // ServiceLocator Class Summary: This class manages access to various services in the application. @@ -33,6 +34,7 @@ namespace Global Sound::SoundService* sound_service; Bullet::BulletService* bullet_service; Powerup::PowerupService* powerup_service; + Collision::CollisionService* collision_service; // Public Methods ServiceLocator(); @@ -62,6 +64,7 @@ namespace Global Sound::SoundService* getSoundService(); // Retrive the SoundService instance Bullet::BulletService* getBulletService(); // Retrive the BulletService instance Powerup::PowerupService* getPowerupService(); // Retrive the PowerupService instance + Collision::CollisionService* getCollisionService(); // Retrive the CollisionService instance void deleteServiceLocator(); }; } \ No newline at end of file diff --git a/Space-Invaders/Header/Main/GameService.h b/Space-Invaders/Header/Main/GameService.h index 5671190cb..047504ba1 100644 --- a/Space-Invaders/Header/Main/GameService.h +++ b/Space-Invaders/Header/Main/GameService.h @@ -9,10 +9,11 @@ namespace Main BOOT, MAIN_MENU, GAMEPLAY, + SPLASH_SCREEN, + INSTRUCTIONS, + CREDITS, }; - class ServiceLocator; - class GameService { private: @@ -27,6 +28,7 @@ namespace Main void initializeVariables();// Handles game initialization. void destroy(); // Handles cleanup tasks. void showMainMenu(); + void showSplashScreen(); public: GameService(); // Constructor for initializing the GameService object. diff --git a/Space-Invaders/Header/Player/PlayerController.h b/Space-Invaders/Header/Player/PlayerController.h index 09c3098fd..5815796ab 100644 --- a/Space-Invaders/Header/Player/PlayerController.h +++ b/Space-Invaders/Header/Player/PlayerController.h @@ -1,5 +1,8 @@ #pragma once #include +#include "../../Header/Collision/ICollider.h" +#include "../../Header/Powerups/PowerupConfig.h" +#include "../../Header/Player/PlayerModel.h" namespace Player { @@ -7,9 +10,15 @@ namespace Player class PlayerModel; enum class PlayerState; - class PlayerController + class PlayerController : public Collision::ICollider { private: + float elapsed_shield_duration; + float elapsed_rapid_fire_duration; + float elapsed_tripple_laser_duration; + + float elapsed_fire_duration; + float elapsed_freez_duration; PlayerView* player_view; PlayerModel* player_model; @@ -18,7 +27,22 @@ namespace Player void moveLeft(); void moveRight(); - void fireBullet(); + bool processBulletCollision(ICollider* other_collider); + bool processPowerupCollision(ICollider* other_collider); + bool processEnemyCollision(ICollider* other_collider); + void updateFreezeDuration(); + void freezePlayer(); + + void updateFireDuration(); + void processBulletFire(); + void fireBullet(bool b_tripple_laser = false); + void fireBullet(sf::Vector2f position); + + void updatePowerupDuration(); + + void disableShield(); + void disableRapidFire(); + void disableTrippleLaser(); public: PlayerController(); @@ -28,6 +52,20 @@ namespace Player void update(); void render(); + void reset(); + + void enableShield(); + void enableRapidFire(); + void enableTrippleLaser(); + sf::Vector2f getPlayerPosition(); + int getPlayerScore(); + PlayerState getPlayerState(); + + const sf::Sprite& getColliderSprite() override; + void onCollision(ICollider* other_collider) override; + + void decreasePlayerLive(); + inline void increaseEnemiesKilled(int val) { PlayerModel::enemies_killed += val; } }; } \ No newline at end of file diff --git a/Space-Invaders/Header/Player/PlayerModel.h b/Space-Invaders/Header/Player/PlayerModel.h index 4cb5016dc..ea3ad1bc5 100644 --- a/Space-Invaders/Header/Player/PlayerModel.h +++ b/Space-Invaders/Header/Player/PlayerModel.h @@ -1,30 +1,65 @@ #pragma once #include +#include "../../header/Entity/EntityConfig.h" +#include "../../header/UI/GameplayUI/GameplayUIController.h" namespace Player { enum class PlayerState //Our Enum { ALIVE, + FROZEN, DEAD, - // we will add more states later }; class PlayerModel { private: + friend class PlayerController; + friend void UI::GameplayUI::GameplayUIController::updateEnemiesKilledText(); + friend void UI::GameplayUI::GameplayUIController::drawPlayerLives(); + const sf::Vector2f initial_player_position = sf::Vector2f(950.f, 950.f); + const int max_player_lives = 3; sf::Vector2f player_position; + Entity::EntityType entity_type; PlayerState player_state; //Declaration int player_score; + static int player_lives; + static int enemies_killed; + + bool b_shield; + bool b_rapid_fire; + bool b_tripple_laser; + public: const sf::Vector2f left_most_position = sf::Vector2f(50.f, 950.f); const sf::Vector2f right_most_position = sf::Vector2f(1800.f, 950.f); const sf::Vector2f barrel_position_offset = sf::Vector2f(20.f, 50.f); + const sf::Vector2f second_weapon_position_offset = sf::Vector2f(45.f, 0.f); + const sf::Vector2f third_weapon_position_offset = sf::Vector2f(-45.f, 0.f); + + const float shiled_powerup_duration = 10.f; + const float rapid_fire_powerup_duration = 10.f; + const float tripple_laser_powerup_duration = 10.f; + + const float freeze_duration = 2.f; + + const float fire_cooldown_duration = 0.2f; + const float rapid_fire_cooldown_duration = 0.05f; + const float tripple_laser_position_offset = 30.f; + + float elapsed_shield_duration; + float elapsed_rapid_fire_duration; + float elapsed_tripple_laser_duration; + + float elapsed_fire_duration; + float elapsed_freeze_duration; const float player_movement_speed = 600.0f; + static const int invincible_player_alpha = 170.f; PlayerModel(); ~PlayerModel(); @@ -42,6 +77,14 @@ namespace Player PlayerState getPlayerState(); void setPlayerState(PlayerState state); + Entity::EntityType getEntityType(); + + bool isShieldEnabled(); + bool isRapidFireEnabled(); + bool isTrippleLaserEnabled(); + void setShieldState(bool value); + void setRapidFireState(bool value); + void setTrippleFireState(bool value); }; } diff --git a/Space-Invaders/Header/Player/PlayerService.h b/Space-Invaders/Header/Player/PlayerService.h index a978d53c5..34637c0d6 100644 --- a/Space-Invaders/Header/Player/PlayerService.h +++ b/Space-Invaders/Header/Player/PlayerService.h @@ -3,6 +3,8 @@ namespace Player { + class PlayerController; + class PlayerService { private: @@ -15,5 +17,12 @@ namespace Player void initialize(); void update(); void render(); + + void enableShield(); + void enableRapidFire(); + void enableTrippleLaser(); + + void reset(); + void increaseEnemiesKilled(int val); }; } diff --git a/Space-Invaders/Header/Player/PlayerView.h b/Space-Invaders/Header/Player/PlayerView.h index ec0eb5413..e3159ec97 100644 --- a/Space-Invaders/Header/Player/PlayerView.h +++ b/Space-Invaders/Header/Player/PlayerView.h @@ -25,6 +25,7 @@ namespace Player void update(); void render(); + const sf::Sprite& getPlayerSprite(); void initialize(PlayerController* controller); }; } \ No newline at end of file diff --git a/Space-Invaders/Header/Powerups/Controllers/OutscalBombController.h b/Space-Invaders/Header/Powerups/Controllers/OutscalBombController.h index a4b344127..0d9ed30d7 100644 --- a/Space-Invaders/Header/Powerups/Controllers/OutscalBombController.h +++ b/Space-Invaders/Header/Powerups/Controllers/OutscalBombController.h @@ -12,6 +12,7 @@ namespace Powerup virtual ~OutscalBombController(); void onCollected() override; + void applyPowerup(); }; } } \ No newline at end of file diff --git a/Space-Invaders/Header/Powerups/Controllers/RapidFireController.h b/Space-Invaders/Header/Powerups/Controllers/RapidFireController.h index 2661e3569..c1120a9a2 100644 --- a/Space-Invaders/Header/Powerups/Controllers/RapidFireController.h +++ b/Space-Invaders/Header/Powerups/Controllers/RapidFireController.h @@ -12,6 +12,7 @@ namespace Powerup virtual ~RapidFireController(); void onCollected() override; + void applyPowerup(); }; } } \ No newline at end of file diff --git a/Space-Invaders/Header/Powerups/Controllers/ShieldController.h b/Space-Invaders/Header/Powerups/Controllers/ShieldController.h index 7c9064149..2bc45a297 100644 --- a/Space-Invaders/Header/Powerups/Controllers/ShieldController.h +++ b/Space-Invaders/Header/Powerups/Controllers/ShieldController.h @@ -12,6 +12,7 @@ namespace Powerup virtual ~ShieldController(); void onCollected() override; + void applyPowerup(); }; } } \ No newline at end of file diff --git a/Space-Invaders/Header/Powerups/Controllers/TrippleLaserController.h b/Space-Invaders/Header/Powerups/Controllers/TrippleLaserController.h index e343116a7..85cef995f 100644 --- a/Space-Invaders/Header/Powerups/Controllers/TrippleLaserController.h +++ b/Space-Invaders/Header/Powerups/Controllers/TrippleLaserController.h @@ -12,6 +12,7 @@ namespace Powerup virtual ~TrippleLaserController(); void onCollected() override; + void applyPowerup(); }; } } \ No newline at end of file diff --git a/Space-Invaders/Header/Powerups/PowerupController.h b/Space-Invaders/Header/Powerups/PowerupController.h index fcbea0a3e..f13de6bdc 100644 --- a/Space-Invaders/Header/Powerups/PowerupController.h +++ b/Space-Invaders/Header/Powerups/PowerupController.h @@ -1,5 +1,6 @@ #pragma once #include "../../header/Collectible/ICollectible.h" +#include "../../Header/Collision/ICollider.h" namespace Powerup { @@ -8,12 +9,12 @@ namespace Powerup enum class PowerupType; - class PowerupController : public Collectible::ICollectible + class PowerupController : public Collectible::ICollectible, public Collision::ICollider { protected: PowerupView* powerup_view; PowerupModel* powerup_model; - + virtual void applyPowerup() = 0; void updatePowerupPosition(); void handleOutOfBounds(); @@ -29,5 +30,9 @@ namespace Powerup sf::Vector2f getCollectiblePosition() override; PowerupType getPowerupType(); + + //Collision + const sf::Sprite& getColliderSprite() override; + void onCollision(ICollider* other_collider) override; }; } diff --git a/Space-Invaders/Header/Powerups/PowerupService.h b/Space-Invaders/Header/Powerups/PowerupService.h index 908ce8e57..35d76192d 100644 --- a/Space-Invaders/Header/Powerups/PowerupService.h +++ b/Space-Invaders/Header/Powerups/PowerupService.h @@ -8,13 +8,16 @@ namespace Powerup class PowerupController; enum class PowerupType; + enum class MovementDirection; class PowerupService { private: std::vector powerup_list; + std::vector flagged_powerup_list; PowerupController* createPowerup(PowerupType powerup_type); + void destroyFlaggedPowerup(); void destroy(); public: diff --git a/Space-Invaders/Header/Powerups/PowerupView.h b/Space-Invaders/Header/Powerups/PowerupView.h index d63947915..d33eef621 100644 --- a/Space-Invaders/Header/Powerups/PowerupView.h +++ b/Space-Invaders/Header/Powerups/PowerupView.h @@ -29,5 +29,6 @@ namespace Powerup void initialize(PowerupController* controller); void update(); void render(); + const sf::Sprite& getPowerupSprite(); }; } \ No newline at end of file diff --git a/Space-Invaders/Header/UI/GameplayUI/GameplayUIController.h b/Space-Invaders/Header/UI/GameplayUI/GameplayUIController.h new file mode 100644 index 000000000..03c3dc3ad --- /dev/null +++ b/Space-Invaders/Header/UI/GameplayUI/GameplayUIController.h @@ -0,0 +1,51 @@ +#pragma once +#include "../../header/UI/Interface/IUIController.h" +#include "../../header/UI/UIElement/ImageView.h" +#include "../../header/UI/UIElement/ButtonView.h" +#include "../../header/UI/UIElement/TextView.h" + +namespace UI +{ + namespace GameplayUI + { + class GameplayUIController : public Interface::IUIController + { + private: + // Constants: + const float font_size = 40.f; + + const float text_y_position = 15.f; + const float enemies_killed_text_x_position = 60.f; + + const float player_lives_y_offset = 25.f; + const float player_lives_x_offset = 1850.f; + const float player_lives_spacing = 60.f; + + const float player_sprite_width = 30.f; + const float player_sprite_height = 30.f; + + const sf::Color text_color = sf::Color::White; + + UI::UIElement::ImageView* player_image; + UI::UIElement::TextView* enemies_killed_text; + + void createUIElements(); + void initializeImage(); + void initializeText(); + + void destroy(); + + public: + GameplayUIController(); + ~GameplayUIController(); + + void initialize(); + void update(); + void render(); + void show(); + + void updateEnemiesKilledText(); + void drawPlayerLives(); + }; + } +} \ No newline at end of file diff --git a/Space-Invaders/Header/UI/SplashScreen/SplashScreenUIController.h b/Space-Invaders/Header/UI/SplashScreen/SplashScreenUIController.h new file mode 100644 index 000000000..bff6f2177 --- /dev/null +++ b/Space-Invaders/Header/UI/SplashScreen/SplashScreenUIController.h @@ -0,0 +1,37 @@ +#pragma once +#include "../../header/UI/Interface/IUIController.h" +#include "../../header/UI/UIElement/ImageView.h" + +namespace UI +{ + namespace SplashScreen + { + class SplashScreenUIController : public Interface::IUIController + { + private: + // Constants: + const float splash_screen_duration = 2.0f; + float elapsed_duration = 0.0f; + const float logo_width = 600.f; + const float logo_height = 134.f; + + UIElement::ImageView* outscal_logo_view; + + void initializeOutscalLogo(); + void updateTimer(); + void showMainMenu(); + sf::Vector2f getLogoPosition(); + + public: + + + SplashScreenUIController(); + ~SplashScreenUIController(); + + void initialize() override; + void update() override; + void render() override; + void show() override; + }; + } +} \ No newline at end of file diff --git a/Space-Invaders/Header/UI/UIElement/ImageView.h b/Space-Invaders/Header/UI/UIElement/ImageView.h index 875bf69d0..df800fb00 100644 --- a/Space-Invaders/Header/UI/UIElement/ImageView.h +++ b/Space-Invaders/Header/UI/UIElement/ImageView.h @@ -26,6 +26,8 @@ namespace UI virtual void setOriginAtCentre(); virtual void setImageAlpha(float alpha); virtual void setCentreAlinged(); + + const virtual sf::Sprite& getSprite(); }; } } \ No newline at end of file diff --git a/Space-Invaders/Header/UI/UIService.h b/Space-Invaders/Header/UI/UIService.h index 1acbeb81b..8d94aecdb 100644 --- a/Space-Invaders/Header/UI/UIService.h +++ b/Space-Invaders/Header/UI/UIService.h @@ -1,5 +1,7 @@ #pragma once #include "../../Header/UI/MainMenu/MainMenuUIController.h" +#include "../../header/UI/SplashScreen/SplashScreenUIController.h" +#include "../../header/UI/GameplayUI/GameplayUIController.h" #include "../../Header/UI/Interface/IUIController.h" namespace UI @@ -8,6 +10,8 @@ namespace UI { private: MainMenu::MainMenuUIController* main_menu_controller; + GameplayUI::GameplayUIController* gameplay_ui_controller; + SplashScreen::SplashScreenUIController* splash_screen_ui_controller; void createControllers(); void initializeControllers(); From 724cf227984700d508dca57cc963c1fd69daa5e4 Mon Sep 17 00:00:00 2001 From: Rishi Saxena Date: Wed, 14 Aug 2024 15:54:24 +0530 Subject: [PATCH 52/56] Added collision to bullets and bunkers --- Space-Invaders/Source/Bullet/BulletConfig.cpp | 25 ++ .../Source/Bullet/BulletController.cpp | 63 ++++- Space-Invaders/Source/Bullet/BulletModel.cpp | 7 +- .../Source/Bullet/BulletService.cpp | 56 ++++- Space-Invaders/Source/Bullet/BulletView.cpp | 5 + .../Controllers/FrostBulletController.cpp | 2 +- .../Controllers/LaserBulletController.cpp | 2 +- .../Bullet/Controllers/TorpedoController.cpp | 2 +- .../Element/Bunker/BunkerController.cpp | 23 ++ .../Source/Element/Bunker/BunkerView.cpp | 5 + .../Source/Element/ElementService.cpp | 59 ++++- .../Enemy/Controllers/SubZeroController.cpp | 10 +- .../Controllers/ThunderSnakeController.cpp | 8 +- .../Enemy/Controllers/UFOController.cpp | 33 ++- .../Enemy/Controllers/ZapperController.cpp | 8 +- .../Source/Enemy/EnemyController.cpp | 38 +++ Space-Invaders/Source/Enemy/EnemyModel.cpp | 10 +- Space-Invaders/Source/Enemy/EnemyService.cpp | 38 ++- Space-Invaders/Source/Enemy/EnemyView.cpp | 5 + .../Source/Gameplay/GameplayService.cpp | 19 +- .../Source/Global/ServiceLocator.cpp | 8 +- Space-Invaders/Source/Main/GameService.cpp | 54 ++-- .../Source/Player/PlayerController.cpp | 235 +++++++++++++++++- Space-Invaders/Source/Player/PlayerModel.cpp | 53 +++- .../Source/Player/PlayerService.cpp | 25 ++ Space-Invaders/Source/Player/PlayerView.cpp | 6 +- .../Controllers/OutscalBombController.cpp | 8 + .../Controllers/RapidFireController.cpp | 8 + .../Powerups/Controllers/ShieldController.cpp | 9 + .../Controllers/TrippleLaserController.cpp | 21 ++ .../Source/Powerups/PowerupController.cpp | 17 ++ .../Source/Powerups/PowerupService.cpp | 25 +- .../Source/Powerups/PowerupView.cpp | 5 + .../UI/GameplayUI/GameplayUIController.cpp | 85 +++++++ .../SplashScreen/SplashScreenUIController.cpp | 81 ++++++ .../Source/UI/UIElement/ImageView.cpp | 5 + Space-Invaders/Source/UI/UIService.cpp | 33 ++- 37 files changed, 993 insertions(+), 103 deletions(-) create mode 100644 Space-Invaders/Source/Bullet/BulletConfig.cpp create mode 100644 Space-Invaders/Source/Powerups/Controllers/TrippleLaserController.cpp create mode 100644 Space-Invaders/Source/UI/GameplayUI/GameplayUIController.cpp create mode 100644 Space-Invaders/Source/UI/SplashScreen/SplashScreenUIController.cpp diff --git a/Space-Invaders/Source/Bullet/BulletConfig.cpp b/Space-Invaders/Source/Bullet/BulletConfig.cpp new file mode 100644 index 000000000..2d29edd85 --- /dev/null +++ b/Space-Invaders/Source/Bullet/BulletConfig.cpp @@ -0,0 +1,25 @@ +#include "../../Header/Bullet/BulletConfig.h" + +namespace Bullet +{ + const sf::String BulletConfig::laser_bullet_texture_path = "assets/textures/laser_bullet.png"; + + const sf::String BulletConfig::torpedoe_texture_path = "assets/textures/torpedoe.png"; + + const sf::String BulletConfig::frost_beam_texture_path = "assets/textures/frost_beam.png"; + + sf::String BulletConfig::getBulletTexturePath(BulletType bullet_type) + { + switch (bullet_type) + { + case::Bullet::BulletType::LASER_BULLET: + return laser_bullet_texture_path; + + case::Bullet::BulletType::FROST_BULLET: + return frost_beam_texture_path; + + case::Bullet::BulletType::TORPEDO: + return torpedoe_texture_path; + } + } +} \ No newline at end of file diff --git a/Space-Invaders/Source/Bullet/BulletController.cpp b/Space-Invaders/Source/Bullet/BulletController.cpp index f284b3139..caec18081 100644 --- a/Space-Invaders/Source/Bullet/BulletController.cpp +++ b/Space-Invaders/Source/Bullet/BulletController.cpp @@ -3,10 +3,17 @@ #include "../../Header/Bullet/BulletModel.h" #include "../../Header/Bullet/BulletConfig.h" #include "../../Header/Global/ServiceLocator.h" +#include "../../Header/Player/PlayerController.h" +#include "../../Header/Enemy/EnemyController.h" +#include "../../Header/Element/Bunker/BunkerController.h" namespace Bullet { using namespace Global; + using namespace Entity; + using namespace Player; + using namespace Enemy; + using namespace Element::Bunker; void Bullet::BulletController::updateProjectilePosition() { @@ -53,7 +60,7 @@ namespace Bullet BulletController::BulletController(BulletType type, Entity::EntityType owner_type) { bullet_view = new BulletView(); - bullet_model = new BulletModel(type); + bullet_model = new BulletModel(type, owner_type); } BulletController::~BulletController() @@ -89,4 +96,58 @@ namespace Bullet { return bullet_model->getBulletType(); } + + Entity::EntityType BulletController::getOwnerEntityType() + { + return bullet_model->getOwnerEntityType(); + } + + const sf::Sprite& BulletController::getColliderSprite() + { + return bullet_view->getBulletSprite(); + } + + void BulletController::onCollision(ICollider* other_collider) + { + processPlayerCollision(other_collider); + processEnemyCollision(other_collider); + processBunkerCollision(other_collider); + processBulletCollision(other_collider); + } + + void BulletController::processBulletCollision(ICollider* other_collider) + { + BulletController* bullet_controller = dynamic_cast(other_collider); + + if (bullet_controller) + ServiceLocator::getInstance()->getBulletService()->destroyBullet(this); + } + + void BulletController::processEnemyCollision(ICollider* other_collider) + { + EnemyController* enemy_controller = dynamic_cast(other_collider); + + if (enemy_controller && getOwnerEntityType() != EntityType::ENEMY) + { + ServiceLocator::getInstance()->getBulletService()->destroyBullet(this); + } + } + + void BulletController::processPlayerCollision(ICollider* other_collider) + { + PlayerController* player_controller = dynamic_cast(other_collider); + + if (player_controller && getOwnerEntityType() != EntityType::PLAYER) + { + ServiceLocator::getInstance()->getBulletService()->destroyBullet(this); + } + } + + void BulletController::processBunkerCollision(ICollider* other_collider) + { + BunkerController* bunker_controller = dynamic_cast(other_collider); + + if (bunker_controller) + ServiceLocator::getInstance()->getBulletService()->destroyBullet(this); + } } diff --git a/Space-Invaders/Source/Bullet/BulletModel.cpp b/Space-Invaders/Source/Bullet/BulletModel.cpp index 5f6181cea..c73853ffb 100644 --- a/Space-Invaders/Source/Bullet/BulletModel.cpp +++ b/Space-Invaders/Source/Bullet/BulletModel.cpp @@ -4,7 +4,8 @@ namespace Bullet { BulletModel::BulletModel(BulletType type, Entity::EntityType owner_type) { - bullet_type = type; + this->bullet_type = type; + this->owner_type = owner_type; } BulletModel::~BulletModel() { } @@ -30,9 +31,9 @@ namespace Bullet return bullet_type; } - void BulletModel::setBulletType(BulletType type) + Entity::EntityType BulletModel::getOwnerEntityType() { - bullet_type = type; + return owner_type; } MovementDirection BulletModel::getMovementDirection() diff --git a/Space-Invaders/Source/Bullet/BulletService.cpp b/Space-Invaders/Source/Bullet/BulletService.cpp index e868b0a64..0cea2a7d3 100644 --- a/Space-Invaders/Source/Bullet/BulletService.cpp +++ b/Space-Invaders/Source/Bullet/BulletService.cpp @@ -4,21 +4,31 @@ #include "../../Header/Bullet/Controllers/FrostBulletController.h" #include "../../Header/Bullet/Controllers/LaserBulletController.h" #include "../../Header/Bullet/Controllers/TorpedoController.h" +#include "../../Header/Collision/ICollider.h" +#include "../../Header/Global/ServiceLocator.h" namespace Bullet { using namespace Controller; using namespace Projectile; + using namespace Entity; + using namespace Global; + using namespace Collision; BulletService::BulletService() { } BulletService::~BulletService() { destroy(); } - void BulletService::initialize() { } + void BulletService::initialize() + { + bullet_list.clear(); + flagged_bullet_list.clear(); + } void BulletService::update() { for (int i = 0; i < bullet_list.size(); i++) bullet_list[i]->update(); + destroyFlaggedBullets(); } void BulletService::render() @@ -31,19 +41,43 @@ namespace Bullet switch (bullet_type) { case::Bullet::BulletType::LASER_BULLET: - return new LaserBulletController(Bullet::BulletType::LASER_BULLET); + return new LaserBulletController(Bullet::BulletType::LASER_BULLET, owner_type); case::Bullet::BulletType::FROST_BULLET: - return new FrostBulletController(Bullet::BulletType::FROST_BULLET); + return new FrostBulletController(Bullet::BulletType::FROST_BULLET, owner_type); case::Bullet::BulletType::TORPEDO: - return new TorpedoController(Bullet::BulletType::TORPEDO); + return new TorpedoController(Bullet::BulletType::TORPEDO, owner_type); } } + bool BulletService::isValidBullet(int index, std::vector& bullet_list) + { + return index >= 0 && index < bullet_list.size() && bullet_list[index] != nullptr; + } + + void BulletService::destroyFlaggedBullets() + { + for (int i = 0; i < flagged_bullet_list.size(); i++) + { + if (!isValidBullet(i, flagged_bullet_list)) continue; + + ServiceLocator::getInstance()->getCollisionService()->removeCollider(dynamic_cast(flagged_bullet_list[i])); + delete (flagged_bullet_list[i]); + } + flagged_bullet_list.clear(); + } + void BulletService::destroy() { - for (int i = 0; i < bullet_list.size(); i++) delete (bullet_list[i]); + for (int i = 0; i < bullet_list.size(); i++) + { + if (!isValidBullet(i, bullet_list)) continue; + + ServiceLocator::getInstance()->getCollisionService()->removeCollider(dynamic_cast(bullet_list[i])); + delete (bullet_list[i]); + } + bullet_list.clear(); } BulletController* BulletService::spawnBullet(BulletType bullet_type, sf::Vector2f position, MovementDirection direction, Entity::EntityType owner_type) @@ -57,7 +91,15 @@ namespace Bullet void BulletService::destroyBullet(BulletController* bullet_controller) { - bullet_list.erase(std::remove(bullet_list.begin(), bullet_list.end(), bullet_controller), bullet_list.end()); - delete(bullet_controller); + if (std::find(flagged_bullet_list.begin(), flagged_bullet_list.end(), bullet_controller) == flagged_bullet_list.end()) + { + flagged_bullet_list.push_back(bullet_controller); + bullet_list.erase(std::remove(bullet_list.begin(), bullet_list.end(), bullet_controller), bullet_list.end()); + } + } + + void BulletService::reset() + { + destroy(); } } \ No newline at end of file diff --git a/Space-Invaders/Source/Bullet/BulletView.cpp b/Space-Invaders/Source/Bullet/BulletView.cpp index 09e98db32..b9aa6280e 100644 --- a/Space-Invaders/Source/Bullet/BulletView.cpp +++ b/Space-Invaders/Source/Bullet/BulletView.cpp @@ -40,6 +40,11 @@ namespace Bullet bullet_image->render(); } + const sf::Sprite& BulletView::getBulletSprite() + { + return bullet_image->getSprite(); + } + sf::String BulletView::getBulletTexturePath() { switch (bullet_controller->getBulletType()) diff --git a/Space-Invaders/Source/Bullet/Controllers/FrostBulletController.cpp b/Space-Invaders/Source/Bullet/Controllers/FrostBulletController.cpp index 3cd929822..f91befa6d 100644 --- a/Space-Invaders/Source/Bullet/Controllers/FrostBulletController.cpp +++ b/Space-Invaders/Source/Bullet/Controllers/FrostBulletController.cpp @@ -5,7 +5,7 @@ namespace Bullet { namespace Controller { - FrostBulletController::FrostBulletController(BulletType type) : BulletController(type) { } + FrostBulletController::FrostBulletController(BulletType type, Entity::EntityType owner_type) : BulletController(type, owner_type) { } FrostBulletController::~FrostBulletController() { } diff --git a/Space-Invaders/Source/Bullet/Controllers/LaserBulletController.cpp b/Space-Invaders/Source/Bullet/Controllers/LaserBulletController.cpp index 170970514..fd9f7194b 100644 --- a/Space-Invaders/Source/Bullet/Controllers/LaserBulletController.cpp +++ b/Space-Invaders/Source/Bullet/Controllers/LaserBulletController.cpp @@ -4,7 +4,7 @@ namespace Bullet { namespace Controller { - LaserBulletController::LaserBulletController(BulletType type) : BulletController(type) { } + LaserBulletController::LaserBulletController(BulletType type, Entity::EntityType owner_type) : BulletController(type, owner_type) { } LaserBulletController::~LaserBulletController() { } diff --git a/Space-Invaders/Source/Bullet/Controllers/TorpedoController.cpp b/Space-Invaders/Source/Bullet/Controllers/TorpedoController.cpp index 712702699..87fd16ca2 100644 --- a/Space-Invaders/Source/Bullet/Controllers/TorpedoController.cpp +++ b/Space-Invaders/Source/Bullet/Controllers/TorpedoController.cpp @@ -5,7 +5,7 @@ namespace Bullet { namespace Controller { - TorpedoController::TorpedoController(BulletType type) : BulletController(type) { } + TorpedoController::TorpedoController(BulletType type, Entity::EntityType owner_type) : BulletController(type, owner_type) { } TorpedoController::~TorpedoController() { } diff --git a/Space-Invaders/Source/Element/Bunker/BunkerController.cpp b/Space-Invaders/Source/Element/Bunker/BunkerController.cpp index 8e3d95064..882500eb6 100644 --- a/Space-Invaders/Source/Element/Bunker/BunkerController.cpp +++ b/Space-Invaders/Source/Element/Bunker/BunkerController.cpp @@ -1,10 +1,18 @@ #include "../../header/Element/Bunker/BunkerController.h" #include "../../header/Element/Bunker/BunkerView.h" +#include "../../../header/Bullet/BulletController.h" +#include "../../../header/Entity/EntityConfig.h" +#include "../../header/Global/ServiceLocator.h" +#include "../../../header/Bullet/BulletConfig.h" namespace Element { namespace Bunker { + using namespace Bullet; + using namespace Entity; + using namespace Global; + BunkerController::BunkerController() { bunker_view = new BunkerView(); } BunkerController::~BunkerController() { delete(bunker_view); } @@ -20,5 +28,20 @@ namespace Element void BunkerController::render() { bunker_view->render(); } sf::Vector2f BunkerController::getBunkerPosition() { return bunker_data.position; } + + const sf::Sprite& BunkerController::getColliderSprite() + { + return bunker_view->getBunkerSprite(); + } + + void BunkerController::onCollision(ICollider* other_collider) + { + BulletController* bullet_controller = dynamic_cast(other_collider); + + if (bullet_controller && bullet_controller->getBulletType() == BulletType::TORPEDO) + { + ServiceLocator::getInstance()->getElementService()->destroyBunker(this); + } + } } } \ No newline at end of file diff --git a/Space-Invaders/Source/Element/Bunker/BunkerView.cpp b/Space-Invaders/Source/Element/Bunker/BunkerView.cpp index 1958ea3e9..25e56380f 100644 --- a/Space-Invaders/Source/Element/Bunker/BunkerView.cpp +++ b/Space-Invaders/Source/Element/Bunker/BunkerView.cpp @@ -21,6 +21,11 @@ namespace Element initializeImage(); } + const sf::Sprite& BunkerView::getBunkerSprite() + { + return bunker_image->getSprite(); + } + void BunkerView::createUIElements() { bunker_image = new ImageView(); diff --git a/Space-Invaders/Source/Element/ElementService.cpp b/Space-Invaders/Source/Element/ElementService.cpp index 1aeff50b4..1d6f11db0 100644 --- a/Space-Invaders/Source/Element/ElementService.cpp +++ b/Space-Invaders/Source/Element/ElementService.cpp @@ -1,12 +1,48 @@ #include "../../header/Element/ElementService.h" +#include "../../header/Collision/ICollider.h" +#include "../../header/Global/ServiceLocator.h" namespace Element { + using namespace Global; + using namespace Collision; + ElementService::ElementService() { } ElementService::~ElementService() { destroy(); } void ElementService::initialize() + { + spawnBunkers(); + } + + void ElementService::update() + { + for (Bunker::BunkerController* bunker : bunker_list) + bunker->update(); + + destroyFlaggedBunkers(); + } + + void ElementService::render() + { + for (Bunker::BunkerController* bunker : bunker_list) + bunker->render(); + } + + void ElementService::reset() + { + destroy(); + spawnBunkers(); + } + + void ElementService::destroyBunker(Bunker::BunkerController* bunker_controller) + { + flagged_bunker_list.push_back(bunker_controller); + bunker_list.erase(std::remove(bunker_list.begin(), bunker_list.end(), bunker_controller), bunker_list.end()); + } + + void ElementService::spawnBunkers() { for (int i = 0; i < bunker_data_list.size(); i++) { @@ -14,21 +50,28 @@ namespace Element bunker_controller->initialize(bunker_data_list[i]); bunker_list.push_back(bunker_controller); - } - } - void ElementService::update() - { - for (int i = 0; i < bunker_list.size(); i++) bunker_list[i]->update(); + ServiceLocator::getInstance()->getCollisionService()->addCollider(dynamic_cast(bunker_controller)); + } } - void ElementService::render() + void ElementService::destroyFlaggedBunkers() { - for (int i = 0; i < bunker_list.size(); i++) bunker_list[i]->render(); + for (int i = 0; i < flagged_bunker_list.size(); i++) + { + ServiceLocator::getInstance()->getCollisionService()->removeCollider(dynamic_cast(flagged_bunker_list[i])); + delete (flagged_bunker_list[i]); + } + flagged_bunker_list.clear(); } void ElementService::destroy() { - for (int i = 0; i < bunker_list.size(); i++) delete(bunker_list[i]); + for (int i = 0; i < bunker_list.size(); i++) + { + ServiceLocator::getInstance()->getCollisionService()->removeCollider(dynamic_cast(bunker_list[i])); + delete(bunker_list[i]); + } + bunker_list.clear(); } } \ No newline at end of file diff --git a/Space-Invaders/Source/Enemy/Controllers/SubZeroController.cpp b/Space-Invaders/Source/Enemy/Controllers/SubZeroController.cpp index 5c6fbcd0e..ce2f1371b 100644 --- a/Space-Invaders/Source/Enemy/Controllers/SubZeroController.cpp +++ b/Space-Invaders/Source/Enemy/Controllers/SubZeroController.cpp @@ -1,11 +1,14 @@ #include "../../Header/Enemy/Controllers/SubZeroController.h" +#include "../../header/Enemy/EnemyView.h" #include "../../Header/Enemy/EnemyModel.h" #include "../../header/Enemy/EnemyConfig.h" #include "../../Header/Global/ServiceLocator.h" +#include "../../header/Bullet/BulletConfig.h" namespace Enemy { using namespace Global; + using namespace Time; using namespace Bullet; namespace Controller @@ -43,7 +46,12 @@ namespace Enemy { ServiceLocator::getInstance()->getBulletService()->spawnBullet(BulletType::FROST_BULLET, enemy_model->getEnemyPosition() + enemy_model->barrel_position_offset, - Bullet::MovementDirection::DOWN); + Bullet::MovementDirection::DOWN, enemy_model->getEntityType()); + } + + void SubzeroController::destroy() + { + EnemyController::destroy(); } } } \ No newline at end of file diff --git a/Space-Invaders/Source/Enemy/Controllers/ThunderSnakeController.cpp b/Space-Invaders/Source/Enemy/Controllers/ThunderSnakeController.cpp index 27cbc9cd5..42d615247 100644 --- a/Space-Invaders/Source/Enemy/Controllers/ThunderSnakeController.cpp +++ b/Space-Invaders/Source/Enemy/Controllers/ThunderSnakeController.cpp @@ -1,6 +1,7 @@ #include "../../Header/Enemy/Controllers/ThunderSnakeController.h" #include "../../Header/Enemy/EnemyView.h" #include "../../Header/Enemy/EnemyModel.h" +#include "../../header/Enemy/EnemyConfig.h" #include "../../Header/Global/ServiceLocator.h" #include "../../Header/Bullet/BulletConfig.h" @@ -115,7 +116,12 @@ namespace Enemy { ServiceLocator::getInstance()->getBulletService()->spawnBullet(BulletType::TORPEDO, enemy_model->getEnemyPosition() + enemy_model->barrel_position_offset, - Bullet::MovementDirection::DOWN); + Bullet::MovementDirection::DOWN, enemy_model->getEntityType()); + } + + void ThunderSnakeController::destroy() + { + EnemyController::destroy(); } } } \ No newline at end of file diff --git a/Space-Invaders/Source/Enemy/Controllers/UFOController.cpp b/Space-Invaders/Source/Enemy/Controllers/UFOController.cpp index 2202f5fc3..6b800a9cc 100644 --- a/Space-Invaders/Source/Enemy/Controllers/UFOController.cpp +++ b/Space-Invaders/Source/Enemy/Controllers/UFOController.cpp @@ -1,14 +1,20 @@ -#include "../../Header/Enemy/Controllers/UFOController.h" -#include "../../Header/Enemy/EnemyModel.h" -#include "../../Header/Enemy/EnemyConfig.h" -#include "../../Header/Bullet/BulletConfig.h" -#include "../../Header/Global/ServiceLocator.h" +#include "../../header/Enemy/Controllers/UFOController.h" +#include "../../header/Enemy/EnemyView.h" +#include "../../header/Enemy/EnemyModel.h" +#include "../../header/Enemy/EnemyConfig.h" +#include "../../header/Global/ServiceLocator.h" +#include "../../header/Bullet/BulletConfig.h" +#include "../../header/Powerups/PowerupService.h" +#include "../../header/Bullet/BulletController.h" +#include "../../header/Entity/EntityConfig.h" namespace Enemy { using namespace Global; using namespace Bullet; + using namespace Time; + using namespace Entity; namespace Controller { @@ -75,5 +81,22 @@ namespace Enemy } else enemy_model->setEnemyPosition(currentPosition); } + + void UFOController::onCollision(ICollider* other_collider) + { + EnemyController::onCollision(other_collider); + BulletController* bullet_controller = dynamic_cast(other_collider); + + if (bullet_controller && bullet_controller->getOwnerEntityType() != EntityType::ENEMY) + { + ServiceLocator::getInstance()->getPowerupService()->spawnPowerup(getRandomPowerupType(), enemy_model->getEnemyPosition()); + return; + } + } + void UFOController::destroy() + { + + EnemyController::destroy(); + } } } \ No newline at end of file diff --git a/Space-Invaders/Source/Enemy/Controllers/ZapperController.cpp b/Space-Invaders/Source/Enemy/Controllers/ZapperController.cpp index baa90a730..a61cd17af 100644 --- a/Space-Invaders/Source/Enemy/Controllers/ZapperController.cpp +++ b/Space-Invaders/Source/Enemy/Controllers/ZapperController.cpp @@ -1,5 +1,6 @@ #include "../../Header/Enemy/Controllers/ZapperController.h" #include "../../Header/Enemy/EnemyModel.h" +#include "../../Header/Enemy/EnemyView.h" #include "../../Header/Enemy/EnemyConfig.h" #include "../../Header/Global/ServiceLocator.h" #include "../../Header/Bullet/BulletConfig.h" @@ -120,7 +121,12 @@ namespace Enemy { ServiceLocator::getInstance()->getBulletService()->spawnBullet(BulletType::LASER_BULLET, enemy_model->getEnemyPosition() + enemy_model->barrel_position_offset, - Bullet::MovementDirection::DOWN); + Bullet::MovementDirection::DOWN, enemy_model->getEntityType()); + } + + void ZapperController::destroy() + { + EnemyController::destroy(); } } } \ No newline at end of file diff --git a/Space-Invaders/Source/Enemy/EnemyController.cpp b/Space-Invaders/Source/Enemy/EnemyController.cpp index b89da8838..c9bba5a4c 100644 --- a/Space-Invaders/Source/Enemy/EnemyController.cpp +++ b/Space-Invaders/Source/Enemy/EnemyController.cpp @@ -1,8 +1,14 @@ #include "../../header/Enemy/EnemyController.h" #include "../../header/Enemy/EnemyView.h" #include "../../header/Enemy/EnemyModel.h" +#include "../../header/Enemy/EnemyConfig.h" #include "../../header/Global/ServiceLocator.h" #include "../../header/Event/EventService.h" +#include "../../header/Bullet/BulletConfig.h" +#include "../../header/Entity/EntityConfig.h" +#include "../../header/Bullet/BulletController.h" +#include "../../header/Player/PlayerController.h" +#include "../../header/Sound/SoundService.h" namespace Enemy { @@ -10,6 +16,10 @@ namespace Enemy using namespace Event; using namespace Time; using namespace Bullet; + using namespace Collision; + using namespace Entity; + using namespace Player; + using namespace Sound; EnemyController::EnemyController(EnemyType type) { @@ -111,4 +121,32 @@ namespace Enemy { return enemy_model->getEnemyType(); } + + const sf::Sprite& EnemyController::getColliderSprite() + { + return enemy_view->getEnemySprite(); + } + + void EnemyController::onCollision(ICollider* other_collider) + { + BulletController* bullet_controller = dynamic_cast(other_collider); + if (bullet_controller && bullet_controller->getOwnerEntityType() != EntityType::ENEMY) + { + destroy(); + return; + } + + PlayerController* player_controller = dynamic_cast(other_collider); + if (player_controller) + { + destroy(); + return; + } + } + + void EnemyController::destroy() + { + ServiceLocator::getInstance()->getPlayerService()->increaseEnemiesKilled(1); + ServiceLocator::getInstance()->getEnemyService()->destroyEnemy(this); + } } \ No newline at end of file diff --git a/Space-Invaders/Source/Enemy/EnemyModel.cpp b/Space-Invaders/Source/Enemy/EnemyModel.cpp index 052bffabc..534bc2beb 100644 --- a/Space-Invaders/Source/Enemy/EnemyModel.cpp +++ b/Space-Invaders/Source/Enemy/EnemyModel.cpp @@ -3,7 +3,11 @@ namespace Enemy { - EnemyModel::EnemyModel(EnemyType type) { enemy_type = type; } + EnemyModel::EnemyModel(EnemyType type) + { + enemy_type = type; + entity_type = Entity::EntityType::ENEMY; + } EnemyModel::~EnemyModel() { } @@ -64,4 +68,8 @@ namespace Enemy movement_direction = direction; } + Entity::EntityType EnemyModel::getEntityType() + { + return entity_type; + } } \ No newline at end of file diff --git a/Space-Invaders/Source/Enemy/EnemyService.cpp b/Space-Invaders/Source/Enemy/EnemyService.cpp index 4b178ac0a..3f7764262 100644 --- a/Space-Invaders/Source/Enemy/EnemyService.cpp +++ b/Space-Invaders/Source/Enemy/EnemyService.cpp @@ -7,12 +7,14 @@ #include "../../Header/Enemy/Controllers/ZapperController.h" #include "../../Header/Enemy/Controllers/ThunderSnakeController.h" #include "../../Header/Enemy/Controllers/UFOController.h" +#include "../../Header/Collision/ICollider.h" namespace Enemy { using namespace Global; using namespace Time; using namespace Controller; + using namespace Collision; EnemyService::EnemyService() { std::srand(static_cast(std::time(nullptr))); } @@ -28,12 +30,22 @@ namespace Enemy updateSpawnTimer(); processEnemySpawn(); - for (int i = 0; i < enemy_list.size(); i++) enemy_list[i]->update(); + for (EnemyController* enemy : enemy_list) + enemy->update(); + + destroyFlaggedEnemies(); } void EnemyService::render() { - for (int i = 0; i < enemy_list.size(); i++) enemy_list[i]->render(); + for (EnemyController* enemy : enemy_list) + enemy->render(); + } + + void EnemyService::reset() + { + destroy(); + spawn_timer = 0.0f; } EnemyController* EnemyService::spawnEnemy() @@ -49,10 +61,9 @@ namespace Enemy void EnemyService::destroyEnemy(EnemyController* enemy_controller) { + dynamic_cast(enemy_controller)->disableCollision(); + flagged_enemy_list.push_back(enemy_controller); enemy_list.erase(std::remove(enemy_list.begin(), enemy_list.end(), enemy_controller), enemy_list.end()); - - // Delete the enemy_controller object from memory to free up resources. - delete(enemy_controller); } void EnemyService::updateSpawnTimer() @@ -95,6 +106,21 @@ namespace Enemy void EnemyService::destroy() { - for (int i = 0; i < enemy_list.size(); i++) delete (enemy_list[i]); //delete all enemies + for (int i = 0; i < enemy_list.size(); i++) + { + ServiceLocator::getInstance()->getCollisionService()->removeCollider(dynamic_cast(enemy_list[i])); + delete (enemy_list[i]); + } + enemy_list.clear(); + } + + void EnemyService::destroyFlaggedEnemies() + { + for (int i = 0; i < flagged_enemy_list.size(); i++) + { + ServiceLocator::getInstance()->getCollisionService()->removeCollider(dynamic_cast(flagged_enemy_list[i])); + delete (flagged_enemy_list[i]); + } + flagged_enemy_list.clear(); } } \ No newline at end of file diff --git a/Space-Invaders/Source/Enemy/EnemyView.cpp b/Space-Invaders/Source/Enemy/EnemyView.cpp index 2fa9d3305..2ef883621 100644 --- a/Space-Invaders/Source/Enemy/EnemyView.cpp +++ b/Space-Invaders/Source/Enemy/EnemyView.cpp @@ -15,6 +15,11 @@ namespace Enemy EnemyView::~EnemyView() { destroy(); } + const sf::Sprite& EnemyView::getEnemySprite() + { + return enemy_image->getSprite(); + } + void EnemyView::initialize(EnemyController* controller) { enemy_controller = controller; diff --git a/Space-Invaders/Source/Gameplay/GameplayService.cpp b/Space-Invaders/Source/Gameplay/GameplayService.cpp index 91b7e9761..4991f2d90 100644 --- a/Space-Invaders/Source/Gameplay/GameplayService.cpp +++ b/Space-Invaders/Source/Gameplay/GameplayService.cpp @@ -1,8 +1,15 @@ -#include "../../header/Gameplay/GameplayService.h" -#include "../../header/Gameplay/GameplayController.h" +#include "../../Header/Gameplay/GameplayService.h" +#include "../../Header/Gameplay/GameplayController.h" +#include "../../Header/Global/ServiceLocator.h" namespace Gameplay { + using namespace Global; + using namespace Player; + using namespace Enemy; + using namespace Element; + using namespace Bullet; + GameplayService::GameplayService() { gameplay_controller = new GameplayController(); } GameplayService::~GameplayService() { delete (gameplay_controller); } @@ -12,4 +19,12 @@ namespace Gameplay void GameplayService::update() { gameplay_controller->update(); } void GameplayService::render() { gameplay_controller->render(); } + + void GameplayService::restart() + { + ServiceLocator::getInstance()->getPlayerService()->reset(); + ServiceLocator::getInstance()->getEnemyService()->reset(); + ServiceLocator::getInstance()->getBulletService()->reset(); + ServiceLocator::getInstance()->getElementService()->reset(); + } } \ No newline at end of file diff --git a/Space-Invaders/Source/Global/ServiceLocator.cpp b/Space-Invaders/Source/Global/ServiceLocator.cpp index 26942b9e1..e57f7f00e 100644 --- a/Space-Invaders/Source/Global/ServiceLocator.cpp +++ b/Space-Invaders/Source/Global/ServiceLocator.cpp @@ -15,6 +15,7 @@ namespace Global using namespace Sound; using namespace Bullet; using namespace Powerup; + using namespace Collision; ServiceLocator::ServiceLocator() @@ -30,6 +31,7 @@ namespace Global sound_service = nullptr; bullet_service = nullptr; powerup_service = nullptr; + collision_service = nullptr; createServices(); } ServiceLocator::~ServiceLocator() @@ -50,6 +52,7 @@ namespace Global sound_service = new SoundService(); bullet_service = new BulletService(); powerup_service = new PowerupService(); + collision_service = new CollisionService(); } void ServiceLocator::clearAllServices() @@ -65,6 +68,7 @@ namespace Global delete(sound_service); delete(bullet_service); delete(powerup_service); + delete(collision_service); } ServiceLocator* ServiceLocator::getInstance() @@ -86,6 +90,7 @@ namespace Global sound_service->initialize(); bullet_service->initialize(); powerup_service->initialize(); + collision_service->initialize(); } void ServiceLocator::update() @@ -101,6 +106,7 @@ namespace Global enemy_service->update(); bullet_service->update(); powerup_service->update(); + collision_service->update(); element_service->update(); } @@ -137,10 +143,10 @@ namespace Global SoundService* ServiceLocator::getSoundService() { return sound_service; } BulletService* ServiceLocator::getBulletService() { return bullet_service; } PowerupService* ServiceLocator::getPowerupService() { return powerup_service; } + CollisionService* ServiceLocator::getCollisionService(){return collision_service;} void ServiceLocator::deleteServiceLocator() { delete(this); } - } \ No newline at end of file diff --git a/Space-Invaders/Source/Main/GameService.cpp b/Space-Invaders/Source/Main/GameService.cpp index 0118a4dab..9456a7890 100644 --- a/Space-Invaders/Source/Main/GameService.cpp +++ b/Space-Invaders/Source/Main/GameService.cpp @@ -1,39 +1,36 @@ #include "../../Header/Main/GameService.h" #include "../../Header/Graphic/GraphicService.h" #include "../../Header/Global/ServiceLocator.h" +#include "../../header/Event/EventService.h" +#include "../../header/UI/UIService.h" namespace Main { using namespace Global; using namespace Graphics; using namespace Event; + using namespace UI; GameState GameService::current_state = GameState::BOOT; - // Constructor: Initializes pointers to null. GameService::GameService() { - service_locator = nullptr; // Set service locator to null - game_window = nullptr; // Set game window to null + service_locator = nullptr; } - // Destructor: Calls the destroy function to clean up resources. GameService::~GameService() { - destroy(); // Clean up and release resources + destroy(); } - // Prepares the game service for use by obtaining the service locator instance and initializing services. void GameService::ignite() { service_locator = Global::ServiceLocator::getInstance(); // Get ServiceLocator initialize(); // Initialize services. } - //initialize service locator and other variables void GameService::initialize() { service_locator->initialize(); initializeVariables(); - // set the gamestate to main menu - showMainMenu(); + showSplashScreen(); } void GameService::initializeVariables() @@ -41,43 +38,40 @@ namespace Main game_window = service_locator->getGraphicService()->getGameWindow(); //set game window (it was null before this) } - void GameService::destroy() - { - // don't need to do anything here for now. - } - void GameService::showMainMenu() { setGameState(GameState::MAIN_MENU); } - // Updates the game logic by delegating to the service locator's update method. - void GameService::update() { + void GameService::showSplashScreen() + { + setGameState(GameState::SPLASH_SCREEN); + ServiceLocator::getInstance()->getUIService()->showScreen(); + } + void GameService::update() + { service_locator->getEventService()->processEvents(); - - service_locator->update(); // Call update on the service locator which then updates all its managed services + service_locator->update(); } - // Clears the window then display it. - void GameService::render() { - // Clears the game window with the background color provided by the graphic service + void GameService::render() + { game_window->clear(service_locator->getGraphicService()->getWindowColor()); - service_locator->render(); // Render the current frame using the service locator - game_window->display(); // Display the rendered frame on the game window + service_locator->render(); + game_window->display(); } - - // Checks if the game is still running by querying the graphic service's window open status. - bool GameService::isRunning() { - // Returns true if the game window is open, indicating the game is still running + + bool GameService::isRunning() + { return service_locator->getGraphicService()->isGameWindowOpen(); } - - // Setter function foro the game state + void GameService::setGameState(GameState new_state) { current_state = new_state; } - // Getter function for the current game state GameState GameService::getGameState() { return current_state; } + + void GameService::destroy() { service_locator->deleteServiceLocator(); } } diff --git a/Space-Invaders/Source/Player/PlayerController.cpp b/Space-Invaders/Source/Player/PlayerController.cpp index 49ac671f9..707cb7bbf 100644 --- a/Space-Invaders/Source/Player/PlayerController.cpp +++ b/Space-Invaders/Source/Player/PlayerController.cpp @@ -3,6 +3,11 @@ #include "../../Header/Player/PlayerView.h" #include "../../Header/Event/EventService.h" #include "../../Header/Global/ServiceLocator.h" +#include "../../Header/Bullet/BulletConfig.h" +#include "../../Header/Entity/EntityConfig.h" +#include "../../Header/Bullet/BulletController.h" +#include "../../Header/Enemy/EnemyController.h" +#include "../../Header/Powerups/PowerupController.h" #include namespace Player @@ -11,6 +16,9 @@ namespace Player using namespace Event; using namespace Time; using namespace Bullet; + using namespace Entity; + using namespace Enemy; + using namespace Powerup; PlayerController::PlayerController() { @@ -23,24 +31,39 @@ namespace Player delete (player_view); delete (player_model); } - //the controller is responsible for calling the lifecycle methods for the other two + void PlayerController::initialize() { player_model->initialize(); - - //This will give an error right now since we haven't included the controller in the view. - player_view->initialize(this); // 'this' refers to the class we are currently inside + player_view->initialize(this); } void PlayerController::update() { - processPlayerInput(); - player_view->update(); // we update() the view + switch (player_model->getPlayerState()) + { + case::Player::PlayerState::ALIVE: + processPlayerInput(); + break; + + case::Player::PlayerState::FROZEN: + updateFreezeDuration(); + break; + } + + updatePowerupDuration(); + updateFireDuration(); + player_view->update(); } void PlayerController::render() { - player_view->render(); // render the view + player_view->render(); + } + + void PlayerController::reset() + { + player_model->reset(); } sf::Vector2f PlayerController::getPlayerPosition() @@ -48,6 +71,146 @@ namespace Player return player_model->getPlayerPosition(); } + int PlayerController::getPlayerScore() + { + return player_model->getPlayerScore(); + } + + PlayerState PlayerController::getPlayerState() + { + return player_model->getPlayerState(); + } + + const sf::Sprite& PlayerController::getColliderSprite() + { + return player_view->getPlayerSprite(); + } + + void PlayerController::onCollision(ICollider* other_collider) + { + if (processPowerupCollision(other_collider)) + return; + + if (processBulletCollision(other_collider)) + return; + + processEnemyCollision(other_collider); + } + + void PlayerController::decreasePlayerLive() + { + PlayerModel::player_lives -= 1; + if (PlayerModel::player_lives <= 0) + { + reset(); //game over condition + } + } + + bool PlayerController::processBulletCollision(ICollider* other_collider) + { + if (player_model->isShieldEnabled()) + return false; + + BulletController* bullet_controller = dynamic_cast(other_collider); + + if (bullet_controller && bullet_controller->getOwnerEntityType() != EntityType::PLAYER) + { + if (bullet_controller->getBulletType() == BulletType::FROST_BULLET) + { + player_model->setPlayerState(PlayerState::FROZEN); + player_model->elapsed_freeze_duration = player_model->freeze_duration; + } + else ServiceLocator::getInstance()->getGameplayService()->restart(); + return true; + } + + return false; + } + + bool PlayerController::processEnemyCollision(ICollider* other_collider) + { + if (player_model->isShieldEnabled()) + return false; + + EnemyController* enemy_controller = dynamic_cast(other_collider); + if (enemy_controller) + { + ServiceLocator::getInstance()->getGameplayService()->restart(); + return true; + } + return false; + } + + bool PlayerController::processPowerupCollision(ICollider* other_collider) + { + PowerupController* powerup_controller = dynamic_cast(other_collider); + if (powerup_controller) + { + return true; + } + return false; + } + + void PlayerController::updatePowerupDuration() + { + if (player_model->elapsed_shield_duration > 0) + { + player_model->elapsed_shield_duration -= ServiceLocator::getInstance()->getTimeService()->getDeltaTime(); + + if (player_model->elapsed_shield_duration <= 0) + disableShield(); + } + + if (player_model->elapsed_rapid_fire_duration > 0) + { + player_model->elapsed_rapid_fire_duration -= ServiceLocator::getInstance()->getTimeService()->getDeltaTime(); + + if (player_model->elapsed_rapid_fire_duration <= 0) + disableRapidFire(); + } + + if (player_model->elapsed_tripple_laser_duration > 0) + { + player_model->elapsed_tripple_laser_duration -= ServiceLocator::getInstance()->getTimeService()->getDeltaTime(); + + if (player_model->elapsed_tripple_laser_duration <= 0) + disableTrippleLaser(); + } + } + + void PlayerController::enableShield() + { + player_model->elapsed_shield_duration = player_model->shiled_powerup_duration; + player_model->setShieldState(true); + } + + void PlayerController::disableShield() + { + player_model->setShieldState(false); + } + + void PlayerController::enableRapidFire() + { + player_model->elapsed_rapid_fire_duration = player_model->rapid_fire_powerup_duration; + player_model->setRapidFireState(true); + } + + void PlayerController::disableRapidFire() + { + player_model->setRapidFireState(false); + } + + void PlayerController::enableTrippleLaser() + { + player_model->elapsed_tripple_laser_duration = player_model->tripple_laser_powerup_duration; + player_model->setTrippleFireState(true); + } + + void PlayerController::disableTrippleLaser() + { + player_model->setTrippleFireState(false); + } + void PlayerController::processPlayerInput() { @@ -87,10 +250,62 @@ namespace Player player_model->setPlayerPosition(currentPosition); } - void PlayerController::fireBullet() + void PlayerController::updateFireDuration() + { + if (player_model->elapsed_fire_duration >= 0) + { + player_model->elapsed_fire_duration -= ServiceLocator::getInstance()->getTimeService()->getDeltaTime(); + } + } + + void PlayerController::updateFreezeDuration() + { + if (player_model->elapsed_freeze_duration > 0) + { + player_model->elapsed_fire_duration -= ServiceLocator::getInstance()->getTimeService()->getDeltaTime(); + + if (player_model->elapsed_freeze_duration <= 0) + player_model->setPlayerState(PlayerState::ALIVE); + } + } + + void PlayerController::freezePlayer() + { + player_model->setPlayerState(PlayerState::FROZEN); + elapsed_freez_duration = player_model->freeze_duration; + //player_view->setPlayerHighlight(true); - to be added + } + + void PlayerController::processBulletFire() + { + if (player_model->elapsed_fire_duration > 0) return; + + if (player_model->isTrippleLaserEnabled()) + fireBullet(true); + + else fireBullet(); + + if (player_model->isRapidFireEnabled()) + player_model->elapsed_fire_duration = player_model->rapid_fire_cooldown_duration; + + else player_model->elapsed_fire_duration = player_model->fire_cooldown_duration; + } + + void PlayerController::fireBullet(bool b_tripple_laser) + { + sf::Vector2f bullet_position = player_model->getPlayerPosition() + player_model->barrel_position_offset; + fireBullet(bullet_position); + + if (b_tripple_laser) + { + fireBullet(bullet_position + player_model->second_weapon_position_offset); + fireBullet(bullet_position + player_model->third_weapon_position_offset); + } + } + + void PlayerController::fireBullet(sf::Vector2f position) { ServiceLocator::getInstance()->getBulletService()->spawnBullet(BulletType::LASER_BULLET, - player_model->getPlayerPosition() + player_model->barrel_position_offset, - Bullet::MovementDirection::UP); + position, Bullet::MovementDirection::UP, player_model->getEntityType()); } } \ No newline at end of file diff --git a/Space-Invaders/Source/Player/PlayerModel.cpp b/Space-Invaders/Source/Player/PlayerModel.cpp index 3f519eb06..ac56e089e 100644 --- a/Space-Invaders/Source/Player/PlayerModel.cpp +++ b/Space-Invaders/Source/Player/PlayerModel.cpp @@ -2,17 +2,26 @@ namespace Player { - PlayerModel::PlayerModel() { } + int PlayerModel::player_lives; + int PlayerModel::enemies_killed; + + PlayerModel::PlayerModel() { entity_type = Entity::EntityType::PLAYER; } PlayerModel::~PlayerModel() { } - void PlayerModel::initialize() { reset(); } // remember to call reset() + void PlayerModel::initialize() { reset(); } // reset the player void PlayerModel::reset() { - player_state = PlayerState::ALIVE; // set state to alive + player_state = PlayerState::ALIVE; player_position = initial_player_position; - player_score = 0; + //lives set to max of 3 at restart + player_lives = max_player_lives; + enemies_killed = 0; + //powerups + b_shield = false; + b_rapid_fire = false; + b_tripple_laser = false; } sf::Vector2f PlayerModel::getPlayerPosition() @@ -35,7 +44,6 @@ namespace Player player_score = score; } - //.. PlayerState PlayerModel::getPlayerState() { return player_state; @@ -45,4 +53,39 @@ namespace Player { player_state = state; } + + Entity::EntityType PlayerModel::getEntityType() + { + return entity_type; + } + + bool PlayerModel::isShieldEnabled() + { + return b_shield; + } + + bool PlayerModel::isRapidFireEnabled() + { + return b_rapid_fire; + } + + bool PlayerModel::isTrippleLaserEnabled() + { + return b_tripple_laser; + } + + void PlayerModel::setShieldState(bool value) + { + b_shield = value; + } + + void PlayerModel::setRapidFireState(bool value) + { + b_rapid_fire = value; + } + + void PlayerModel::setTrippleFireState(bool value) + { + b_tripple_laser = value; + } } \ No newline at end of file diff --git a/Space-Invaders/Source/Player/PlayerService.cpp b/Space-Invaders/Source/Player/PlayerService.cpp index e5ccd9d05..8e4ecffeb 100644 --- a/Space-Invaders/Source/Player/PlayerService.cpp +++ b/Space-Invaders/Source/Player/PlayerService.cpp @@ -27,4 +27,29 @@ namespace Player { player_controller->render(); } + + void PlayerService::enableShield() + { + player_controller->enableShield(); + } + + void PlayerService::enableRapidFire() + { + player_controller->enableRapidFire(); + } + + void PlayerService::enableTrippleLaser() + { + player_controller->enableTrippleLaser(); + } + + void PlayerService::reset() + { + player_controller->reset(); + } + + void PlayerService::increaseEnemiesKilled(int val) + { + player_controller->increaseEnemiesKilled(val); + } } \ No newline at end of file diff --git a/Space-Invaders/Source/Player/PlayerView.cpp b/Space-Invaders/Source/Player/PlayerView.cpp index d40d94e90..badc71c47 100644 --- a/Space-Invaders/Source/Player/PlayerView.cpp +++ b/Space-Invaders/Source/Player/PlayerView.cpp @@ -31,7 +31,6 @@ namespace Player void PlayerView::update() { - //set the updated position before we render player_image->setPosition(player_controller->getPlayerPosition()); player_image->update(); } @@ -41,6 +40,11 @@ namespace Player player_image->render(); } + const sf::Sprite& PlayerView::getPlayerSprite() + { + return player_image->getSprite(); + } + void PlayerView::destroy() { delete(player_image); diff --git a/Space-Invaders/Source/Powerups/Controllers/OutscalBombController.cpp b/Space-Invaders/Source/Powerups/Controllers/OutscalBombController.cpp index 9dc17d85e..385f95301 100644 --- a/Space-Invaders/Source/Powerups/Controllers/OutscalBombController.cpp +++ b/Space-Invaders/Source/Powerups/Controllers/OutscalBombController.cpp @@ -1,13 +1,21 @@ #include "../../Header/Powerups/Controllers/OutscalBombController.h" +#include "../../header/Global/ServiceLocator.h" namespace Powerup { namespace Controller { + using namespace Global; + OutscalBombController::OutscalBombController(PowerupType type) : PowerupController(type) {} OutscalBombController::~OutscalBombController() {} void OutscalBombController::onCollected() {}; + + void OutscalBombController::applyPowerup() + { + ServiceLocator::getInstance()->getEnemyService()->reset(); + } } } \ No newline at end of file diff --git a/Space-Invaders/Source/Powerups/Controllers/RapidFireController.cpp b/Space-Invaders/Source/Powerups/Controllers/RapidFireController.cpp index caddf6b1a..9a182c805 100644 --- a/Space-Invaders/Source/Powerups/Controllers/RapidFireController.cpp +++ b/Space-Invaders/Source/Powerups/Controllers/RapidFireController.cpp @@ -1,13 +1,21 @@ #include "../../Header/Powerups/Controllers/RapidFireController.h" +#include "../../Header/Global/ServiceLocator.h" namespace Powerup { namespace Controller { + using namespace Global; + RapidFireController::RapidFireController(PowerupType type) : PowerupController(type) {} RapidFireController::~RapidFireController() {} void RapidFireController::onCollected() {}; + + void RapidFireController::applyPowerup() + { + ServiceLocator::getInstance()->getPlayerService()->enableRapidFire(); + } } } \ No newline at end of file diff --git a/Space-Invaders/Source/Powerups/Controllers/ShieldController.cpp b/Space-Invaders/Source/Powerups/Controllers/ShieldController.cpp index beb4a5068..522e0ded3 100644 --- a/Space-Invaders/Source/Powerups/Controllers/ShieldController.cpp +++ b/Space-Invaders/Source/Powerups/Controllers/ShieldController.cpp @@ -1,7 +1,11 @@ #include "../../Header/Powerups/Controllers/ShieldController.h" +#include "../../header/Global/ServiceLocator.h" + namespace Powerup { + using namespace Global; + namespace Controller { ShieldController::ShieldController(PowerupType type) : PowerupController(type) {} @@ -9,5 +13,10 @@ namespace Powerup ShieldController::~ShieldController() {} void ShieldController::onCollected() {}; + + void ShieldController::applyPowerup() + { + ServiceLocator::getInstance()->getPlayerService()->enableShield(); + } } } \ No newline at end of file diff --git a/Space-Invaders/Source/Powerups/Controllers/TrippleLaserController.cpp b/Space-Invaders/Source/Powerups/Controllers/TrippleLaserController.cpp new file mode 100644 index 000000000..0009562f4 --- /dev/null +++ b/Space-Invaders/Source/Powerups/Controllers/TrippleLaserController.cpp @@ -0,0 +1,21 @@ +#include "../../Header/Powerups/Controllers/TrippleLaserController.h" +#include "../../Header/Global/ServiceLocator.h" + +namespace Powerup +{ + namespace Controller + { + using namespace Global; + + TrippleLaserController::TrippleLaserController(PowerupType type) : PowerupController(type) {} + + TrippleLaserController::~TrippleLaserController() {} + + void TrippleLaserController::onCollected() {} + + void TrippleLaserController::applyPowerup() + { + ServiceLocator::getInstance()->getPlayerService()->enableTrippleLaser(); + } + } +} \ No newline at end of file diff --git a/Space-Invaders/Source/Powerups/PowerupController.cpp b/Space-Invaders/Source/Powerups/PowerupController.cpp index deda31070..b6a92202b 100644 --- a/Space-Invaders/Source/Powerups/PowerupController.cpp +++ b/Space-Invaders/Source/Powerups/PowerupController.cpp @@ -2,10 +2,12 @@ #include "../../Header/Powerups/PowerupView.h" #include "../../Header/Powerups/PowerupModel.h" #include "../../Header/Global/ServiceLocator.h" +#include "../../Header/Player/PlayerController.h" namespace Powerup { using namespace Global; + using namespace Player; PowerupController::PowerupController(PowerupType type) { @@ -38,6 +40,7 @@ namespace Powerup void PowerupController::onCollected() { + applyPowerup(); } void PowerupController::updatePowerupPosition() @@ -69,4 +72,18 @@ namespace Powerup { return powerup_model->getPowerupType(); } + const sf::Sprite& PowerupController::getColliderSprite() + { + return powerup_view->getPowerupSprite(); + } + void PowerupController::onCollision(ICollider* other_collider) + { + PlayerController* player_controller = dynamic_cast(other_collider); + + if (player_controller) + { + onCollected(); + ServiceLocator::getInstance()->getPowerupService()->destroyPowerup(this); + } + } } \ No newline at end of file diff --git a/Space-Invaders/Source/Powerups/PowerupService.cpp b/Space-Invaders/Source/Powerups/PowerupService.cpp index 3d0b8b947..65acf150f 100644 --- a/Space-Invaders/Source/Powerups/PowerupService.cpp +++ b/Space-Invaders/Source/Powerups/PowerupService.cpp @@ -2,6 +2,7 @@ #include "../../header/Powerups/PowerupController.h" #include "../../header/Powerups/PowerupConfig.h" #include "../../header/Global/ServiceLocator.h" +#include "../../header/Collision/ICollider.h" #include "../../header/Powerups/Controllers/OutscalBombController.h" #include "../../header/Powerups/Controllers/RapidFireController.h" #include "../../header/Powerups/Controllers/ShieldController.h" @@ -12,6 +13,7 @@ namespace Powerup using namespace Global; using namespace Controller; using namespace Collectible; + using namespace Collision; PowerupService::PowerupService() { } @@ -21,12 +23,16 @@ namespace Powerup void PowerupService::update() { - for (int i = 0; i < powerup_list.size(); i++) powerup_list[i]->update(); //loop and update + for (Collectible::ICollectible* powerup : powerup_list) + powerup->update(); + + destroyFlaggedPowerup(); } void PowerupService::render() { - for (int i = 0; i < powerup_list.size(); i++) powerup_list[i]->render(); //loop and render + for (Collectible::ICollectible* powerup : powerup_list) + powerup->render(); } PowerupController* PowerupService::createPowerup(PowerupType powerup_type) //creates and returns a pointer to the created powerup @@ -47,6 +53,14 @@ namespace Powerup } } + void PowerupService::destroyFlaggedPowerup() + { + for (Collectible::ICollectible* powerup : flagged_powerup_list) + delete (powerup); + + flagged_powerup_list.clear(); + } + PowerupController* PowerupService::spawnPowerup(PowerupType powerup_type, sf::Vector2f position) //initialize a powerup { PowerupController* powerup_controller = createPowerup(powerup_type); @@ -58,12 +72,15 @@ namespace Powerup void PowerupService::destroyPowerup(PowerupController* powerup_controller) //destroy the powerup by controller type { + ServiceLocator::getInstance()->getCollisionService()->removeCollider(dynamic_cast(powerup_controller)); + + flagged_powerup_list.push_back(powerup_controller); powerup_list.erase(std::remove(powerup_list.begin(), powerup_list.end(), powerup_controller), powerup_list.end()); - delete(powerup_controller); } void PowerupService::destroy() { - for (int i = 0; i < powerup_list.size(); i++) delete (powerup_list[i]); + for (Collectible::ICollectible* powerup : powerup_list) + delete (powerup); } } \ No newline at end of file diff --git a/Space-Invaders/Source/Powerups/PowerupView.cpp b/Space-Invaders/Source/Powerups/PowerupView.cpp index a8f8d48f2..e3d884e7e 100644 --- a/Space-Invaders/Source/Powerups/PowerupView.cpp +++ b/Space-Invaders/Source/Powerups/PowerupView.cpp @@ -41,6 +41,11 @@ namespace Powerup powerup_image->render(); } + const sf::Sprite& PowerupView::getPowerupSprite() + { + return powerup_image->getSprite(); + } + sf::String PowerupView::getPowerupTexturePath() { switch (powerup_controller->getPowerupType()) diff --git a/Space-Invaders/Source/UI/GameplayUI/GameplayUIController.cpp b/Space-Invaders/Source/UI/GameplayUI/GameplayUIController.cpp new file mode 100644 index 000000000..356214c14 --- /dev/null +++ b/Space-Invaders/Source/UI/GameplayUI/GameplayUIController.cpp @@ -0,0 +1,85 @@ +#include "../../header/UI/GameplayUI/GameplayUIController.h" +#include "../../header/Global/Config.h" +#include "../../header/Global/ServiceLocator.h" +#include "../../header/Gameplay/GameplayService.h" +#include "../../header/Sound/SoundService.h" +#include "../../header/Main/GameService.h" +#include "../../header/Player/PlayerModel.h" + +namespace UI +{ + namespace GameplayUI + { + using namespace Main; + using namespace Sound; + using namespace Global; + using namespace Player; + using namespace UI::UIElement; + + GameplayUIController::GameplayUIController() { createUIElements(); } + + GameplayUIController::~GameplayUIController() { destroy(); } + + void GameplayUIController::initialize() + { + initializeImage(); + initializeText(); + } + + void GameplayUIController::createUIElements() + { + player_image = new ImageView(); + enemies_killed_text = new TextView(); + } + + void GameplayUIController::initializeImage() + { + player_image->initialize(Config::player_texture_path, player_sprite_width, player_sprite_height, sf::Vector2f(0, 0)); + } + + void GameplayUIController::initializeText() + { + sf::String enemies_killed_string = "Enemies Killed : 0"; + enemies_killed_text->initialize(enemies_killed_string, sf::Vector2f(enemies_killed_text_x_position, text_y_position), FontType::BUBBLE_BOBBLE, font_size, text_color); + } + + void GameplayUIController::update() + { + updateEnemiesKilledText(); + } + + void GameplayUIController::render() + { + enemies_killed_text->render(); + drawPlayerLives(); + } + + void GameplayUIController::show() + { + + } + + void GameplayUIController::updateEnemiesKilledText() + { + sf::String enemies_killed_string = "Enemies Killed : " + std::to_string(PlayerModel::enemies_killed); + enemies_killed_text->setText(enemies_killed_string); + } + + void GameplayUIController::drawPlayerLives() + { + sf::RenderWindow* game_window = Global::ServiceLocator::getInstance()->getGraphicService()->getGameWindow(); + + for (int i = 0; i < PlayerModel::player_lives; i++) + { + player_image->setPosition(sf::Vector2f(player_lives_x_offset - (i * player_lives_spacing), player_lives_y_offset)); + player_image->render(); + } + } + + void GameplayUIController::destroy() + { + delete(player_image); + delete(enemies_killed_text); + } + } +} \ No newline at end of file diff --git a/Space-Invaders/Source/UI/SplashScreen/SplashScreenUIController.cpp b/Space-Invaders/Source/UI/SplashScreen/SplashScreenUIController.cpp new file mode 100644 index 000000000..007e4cd3d --- /dev/null +++ b/Space-Invaders/Source/UI/SplashScreen/SplashScreenUIController.cpp @@ -0,0 +1,81 @@ +#include "../../header/UI/SplashScreen/SplashScreenUIController.h" +#include "../../header/Main/GameService.h" +#include "../../header/Global/ServiceLocator.h" +#include "../../header/Graphic/GraphicService.h" +#include "../../header/Sound/SoundService.h" +#include "../../header/Global/Config.h" + +namespace UI +{ + namespace SplashScreen + { + using namespace Main; + using namespace Graphics; + using namespace Global; + using namespace UIElement; + using namespace Sound; + + SplashScreenUIController::SplashScreenUIController() + { + outscal_logo_view = new ImageView(); + } + + SplashScreenUIController::~SplashScreenUIController() + { + delete (outscal_logo_view); + } + + void SplashScreenUIController::initialize() + { + initializeOutscalLogo(); + } + + void SplashScreenUIController::update() + { + updateTimer(); + showMainMenu(); + } + + void SplashScreenUIController::render() + { + outscal_logo_view->render(); + } + + void SplashScreenUIController::initializeOutscalLogo() + { + sf::Vector2f position = getLogoPosition(); + outscal_logo_view->initialize(Config::outscal_logo_texture_path, logo_width, logo_height, position); + + } + + void SplashScreenUIController::showMainMenu() + { + if (elapsed_duration >= splash_screen_duration) + { + Global::ServiceLocator::getInstance()->getSoundService()->playBackgroundMusic(); + GameService::setGameState(GameState::MAIN_MENU); + } + + } + + void SplashScreenUIController::updateTimer() + { + elapsed_duration += Global::ServiceLocator::getInstance()->getTimeService()->getDeltaTime(); + } + + sf::Vector2f SplashScreenUIController::getLogoPosition() + { + sf::RenderWindow* game_window = Global::ServiceLocator::getInstance()->getGraphicService()->getGameWindow(); + + float x_position = (game_window->getSize().x - logo_width) / 2.0f; + float y_position = (game_window->getSize().y - logo_height) / 2.0f; + + return sf::Vector2f(x_position, y_position); + } + + void SplashScreenUIController::show() + { + + } + } +} \ No newline at end of file diff --git a/Space-Invaders/Source/UI/UIElement/ImageView.cpp b/Space-Invaders/Source/UI/UIElement/ImageView.cpp index c9e934c8c..7b4265e7c 100644 --- a/Space-Invaders/Source/UI/UIElement/ImageView.cpp +++ b/Space-Invaders/Source/UI/UIElement/ImageView.cpp @@ -76,5 +76,10 @@ namespace UI image_sprite.setPosition(x_position, y_position); } + + const sf::Sprite& ImageView::getSprite() + { + return image_sprite; //returns the sprite. + } } } \ No newline at end of file diff --git a/Space-Invaders/Source/UI/UIService.cpp b/Space-Invaders/Source/UI/UIService.cpp index 5ca4a2768..810d66c40 100644 --- a/Space-Invaders/Source/UI/UIService.cpp +++ b/Space-Invaders/Source/UI/UIService.cpp @@ -6,19 +6,24 @@ namespace UI { using namespace Main; using namespace MainMenu; + using namespace GameplayUI; using namespace UIElement; using namespace Interface; + using namespace SplashScreen; UIService::UIService() { main_menu_controller = nullptr; - + gameplay_ui_controller = nullptr; + splash_screen_ui_controller = nullptr; createControllers(); } void UIService::createControllers() { main_menu_controller = new MainMenuUIController(); + gameplay_ui_controller = new GameplayUIController(); + splash_screen_ui_controller = new SplashScreenUIController(); } UIService::~UIService() @@ -34,22 +39,14 @@ namespace UI void UIService::update() { - switch (GameService::getGameState()) - { - case GameState::MAIN_MENU: - return main_menu_controller->update();; - break; - } + IUIController* ui_controller = getCurrentUIController(); + if (ui_controller) ui_controller->update(); } void UIService::render() { - switch (GameService::getGameState()) - { - case GameState::MAIN_MENU: - return main_menu_controller->render(); - break; - } + IUIController* ui_controller = getCurrentUIController(); + if (ui_controller) ui_controller->render(); } void UIService::showScreen() @@ -61,6 +58,8 @@ namespace UI void UIService::initializeControllers() { main_menu_controller->initialize(); + gameplay_ui_controller->initialize(); + splash_screen_ui_controller->initialize(); } IUIController* UIService::getCurrentUIController() @@ -70,6 +69,12 @@ namespace UI case GameState::MAIN_MENU: return main_menu_controller; + case GameState::GAMEPLAY: + return gameplay_ui_controller; + + case GameState::SPLASH_SCREEN: + return splash_screen_ui_controller; + default: return nullptr; } @@ -78,5 +83,7 @@ namespace UI void UIService::destroy() { delete(main_menu_controller); + delete(gameplay_ui_controller); + delete(splash_screen_ui_controller); } } \ No newline at end of file From 535222d9721b21b05417d01310af5424a26f6768 Mon Sep 17 00:00:00 2001 From: Rishi Saxena Date: Fri, 16 Aug 2024 13:00:59 +0530 Subject: [PATCH 53/56] Added Animation config and added explosion texture path to the global config file --- .../AnimationSystem/AnimationSystemConfig.h | 30 ++++++++++ .../AnimationSystemConfigData.h | 8 +++ Space-Invaders/Header/Global/Config.h | 2 + .../SplashScreen/SplashScreenUIController.h | 11 ++-- .../Header/UI/UIElement/AnimatedImageView.h | 56 +++++++++++++++++++ 5 files changed, 101 insertions(+), 6 deletions(-) create mode 100644 Space-Invaders/Header/AnimationSystem/AnimationSystemConfig.h create mode 100644 Space-Invaders/Header/AnimationSystem/AnimationSystemConfigData.h create mode 100644 Space-Invaders/Header/UI/UIElement/AnimatedImageView.h diff --git a/Space-Invaders/Header/AnimationSystem/AnimationSystemConfig.h b/Space-Invaders/Header/AnimationSystem/AnimationSystemConfig.h new file mode 100644 index 000000000..9d1ff6e9d --- /dev/null +++ b/Space-Invaders/Header/AnimationSystem/AnimationSystemConfig.h @@ -0,0 +1,30 @@ +#pragma once +namespace Animation +{ + struct AnimationSystemConfig + { + sf::String Animation_texture_path; + + float sprite_sheet_width; + float sprite_sheet_height; + + //one frame of the sprite sheet - W x H + float tile_width; + float tile_height; + + int number_of_animation_frames; //total frames + float frame_duration; //duration of a single frame - the amount to wait for next frame in the animation spritesheet + + AnimationSystemConfig() = default; // Use default for default constructor + + //this will allow us to initialize an animation with it's configuration. + AnimationSystemConfig(sf::String texture_path, float sprite_width, float sprite_height, float t_width, float t_height, int frames, float duration) : + Animation_texture_path(texture_path), + sprite_sheet_width(sprite_width), + sprite_sheet_height(sprite_height), + tile_width(t_width), + tile_height(t_height), + number_of_animation_frames(frames), + frame_duration(duration) {} + }; +} \ No newline at end of file diff --git a/Space-Invaders/Header/AnimationSystem/AnimationSystemConfigData.h b/Space-Invaders/Header/AnimationSystem/AnimationSystemConfigData.h new file mode 100644 index 000000000..21b62b375 --- /dev/null +++ b/Space-Invaders/Header/AnimationSystem/AnimationSystemConfigData.h @@ -0,0 +1,8 @@ +#pragma once +#include "AnimationSystemConfig.h" +#include "../../header/Global/Config.h" + +namespace Animation +{ + const AnimationSystemConfig explosion_animation_config(Global::Config::explosion_texture_path, 70.0f, 80.0f, 14.28f, 20.0f, 7, 0.03f); +} \ No newline at end of file diff --git a/Space-Invaders/Header/Global/Config.h b/Space-Invaders/Header/Global/Config.h index 385d119df..b44bc92c1 100644 --- a/Space-Invaders/Header/Global/Config.h +++ b/Space-Invaders/Header/Global/Config.h @@ -16,6 +16,8 @@ namespace Global static const sf::String ufo_texture_path; static const sf::String bunker_texture_path; + static const sf::String explosion_texture_path; + static const sf::String shield_texture_path; static const sf::String tripple_laser_texture_path; static const sf::String rapid_fire_texture_path; diff --git a/Space-Invaders/Header/UI/SplashScreen/SplashScreenUIController.h b/Space-Invaders/Header/UI/SplashScreen/SplashScreenUIController.h index bff6f2177..c1042b4c3 100644 --- a/Space-Invaders/Header/UI/SplashScreen/SplashScreenUIController.h +++ b/Space-Invaders/Header/UI/SplashScreen/SplashScreenUIController.h @@ -1,6 +1,6 @@ #pragma once #include "../../header/UI/Interface/IUIController.h" -#include "../../header/UI/UIElement/ImageView.h" +#include "../../header/UI/UIElement/AnimatedImageView.h" namespace UI { @@ -10,16 +10,15 @@ namespace UI { private: // Constants: - const float splash_screen_duration = 2.0f; - float elapsed_duration = 0.0f; + const float logo_animation_duration = 2.0f; const float logo_width = 600.f; const float logo_height = 134.f; - UIElement::ImageView* outscal_logo_view; + UIElement::AnimatedImageView* outscal_logo_view; void initializeOutscalLogo(); - void updateTimer(); - void showMainMenu(); + void fadeInAnimationCallback(); + void fadeOutAnimationCallback(); sf::Vector2f getLogoPosition(); public: diff --git a/Space-Invaders/Header/UI/UIElement/AnimatedImageView.h b/Space-Invaders/Header/UI/UIElement/AnimatedImageView.h new file mode 100644 index 000000000..a7b380960 --- /dev/null +++ b/Space-Invaders/Header/UI/UIElement/AnimatedImageView.h @@ -0,0 +1,56 @@ +#pragma once +#include "../../header/UI/UIElement/ImageView.h" +#include + +namespace UI +{ + namespace UIElement + { + enum class AnimationType + { + FADE_IN, + FADE_OUT, + }; + + class AnimatedImageView : public ImageView + { + private: + // Define a function pointer type for the callback function + using CallbackFunction = std::function; + + // Store the callback function + CallbackFunction callback_function = nullptr; + + void updateElapsedDuration(); + void handleAnimationProgress(); + void updateAnimation(); + + protected: + const float default_animation_duration = 2.0f; + + AnimationType animation_type; + float animation_duration; + float elapsed_duration; + sf::Clock clock; + + virtual void reset(); + void setAnimationDuration(float duration); + void setAnimationType(AnimationType type); + + virtual void fadeIn(); + virtual void fadeOut(); + + public: + AnimatedImageView(); + virtual ~AnimatedImageView(); + + virtual void initialize(sf::String texture_path, float image_width, float image_height, sf::Vector2f position) override; + virtual void update() override; + virtual void render() override; + + virtual void playAnimation(AnimationType type, float duration, CallbackFunction animation_end_callback); + + void registerCallbackFuntion(CallbackFunction animation_end_callback); + }; + } +} \ No newline at end of file From ee2ed05b4695cfa21c8cf4863796c3e26e42339e Mon Sep 17 00:00:00 2001 From: Rishi Saxena Date: Fri, 16 Aug 2024 13:02:09 +0530 Subject: [PATCH 54/56] Added animation service folder mvc --- .../SplashScreen/SplashScreenUIController.cpp | 31 +++--- .../Source/UI/UIElement/AnimatedImageView.cpp | 104 ++++++++++++++++++ 2 files changed, 117 insertions(+), 18 deletions(-) create mode 100644 Space-Invaders/Source/UI/UIElement/AnimatedImageView.cpp diff --git a/Space-Invaders/Source/UI/SplashScreen/SplashScreenUIController.cpp b/Space-Invaders/Source/UI/SplashScreen/SplashScreenUIController.cpp index 007e4cd3d..1a7961700 100644 --- a/Space-Invaders/Source/UI/SplashScreen/SplashScreenUIController.cpp +++ b/Space-Invaders/Source/UI/SplashScreen/SplashScreenUIController.cpp @@ -17,7 +17,7 @@ namespace UI SplashScreenUIController::SplashScreenUIController() { - outscal_logo_view = new ImageView(); + outscal_logo_view = new AnimatedImageView(); } SplashScreenUIController::~SplashScreenUIController() @@ -32,8 +32,7 @@ namespace UI void SplashScreenUIController::update() { - updateTimer(); - showMainMenu(); + outscal_logo_view->update(); } void SplashScreenUIController::render() @@ -48,21 +47,6 @@ namespace UI } - void SplashScreenUIController::showMainMenu() - { - if (elapsed_duration >= splash_screen_duration) - { - Global::ServiceLocator::getInstance()->getSoundService()->playBackgroundMusic(); - GameService::setGameState(GameState::MAIN_MENU); - } - - } - - void SplashScreenUIController::updateTimer() - { - elapsed_duration += Global::ServiceLocator::getInstance()->getTimeService()->getDeltaTime(); - } - sf::Vector2f SplashScreenUIController::getLogoPosition() { sf::RenderWindow* game_window = Global::ServiceLocator::getInstance()->getGraphicService()->getGameWindow(); @@ -75,7 +59,18 @@ namespace UI void SplashScreenUIController::show() { + outscal_logo_view->playAnimation(AnimationType::FADE_IN, logo_animation_duration, std::bind(&SplashScreenUIController::fadeInAnimationCallback, this)); + } + + void SplashScreenUIController::fadeInAnimationCallback() + { + outscal_logo_view->playAnimation(AnimationType::FADE_OUT, logo_animation_duration, std::bind(&SplashScreenUIController::fadeOutAnimationCallback, this)); + } + void SplashScreenUIController::fadeOutAnimationCallback() + { + ServiceLocator::getInstance()->getSoundService()->playBackgroundMusic(); + GameService::setGameState(GameState::MAIN_MENU); } } } \ No newline at end of file diff --git a/Space-Invaders/Source/UI/UIElement/AnimatedImageView.cpp b/Space-Invaders/Source/UI/UIElement/AnimatedImageView.cpp new file mode 100644 index 000000000..b07e25481 --- /dev/null +++ b/Space-Invaders/Source/UI/UIElement/AnimatedImageView.cpp @@ -0,0 +1,104 @@ +#include "../../Header/UI/UIElement/AnimatedImageView.h" + +namespace UI +{ + namespace UIElement + { + AnimatedImageView::AnimatedImageView() = default; + + AnimatedImageView::~AnimatedImageView() = default; + + void AnimatedImageView::initialize(sf::String texture_path, float image_width, float image_height, sf::Vector2f position) + { + ImageView::initialize(texture_path, image_width, image_height, position); + } + + void AnimatedImageView::registerCallbackFuntion(CallbackFunction animation_end_callback) + { + callback_function = animation_end_callback; + } + + void AnimatedImageView::update() + { + ImageView::update(); + + if (ui_state == UIState::VISIBLE) + { + updateElapsedDuration(); + handleAnimationProgress(); + updateAnimation(); + } + } + + void AnimatedImageView::render() + { + ImageView::render(); + } + + void AnimatedImageView::playAnimation(AnimationType type, float duration, CallbackFunction animation_end_callback) + { + ImageView::show(); + reset(); + setAnimationType(type); + setAnimationDuration(duration); + registerCallbackFuntion(animation_end_callback); + } + + void AnimatedImageView::updateElapsedDuration() + { + float deltaTime = clock.restart().asSeconds(); + elapsed_duration += deltaTime; + } + + void AnimatedImageView::handleAnimationProgress() + { + if (elapsed_duration >= animation_duration && callback_function) + { + callback_function(); + } + } + + void AnimatedImageView::updateAnimation() + { + switch (animation_type) + { + case AnimationType::FADE_IN: + fadeIn(); + break; + case AnimationType::FADE_OUT: + fadeOut(); + break; + } + } + + void AnimatedImageView::setAnimationDuration(float duration) + { + animation_duration = duration; + } + + void AnimatedImageView::setAnimationType(AnimationType type) + { + animation_type = type; + } + + void AnimatedImageView::fadeIn() + { + float alpha = std::min(1.0f, elapsed_duration / animation_duration); + image_sprite.setColor(sf::Color(255, 255, 255, static_cast(alpha * 255))); + } + + void AnimatedImageView::fadeOut() + { + float alpha = std::max(0.0f, 1.0f - (elapsed_duration / animation_duration)); + image_sprite.setColor(sf::Color(255, 255, 255, static_cast(alpha * 255))); + } + + void AnimatedImageView::reset() + { + animation_duration = default_animation_duration; + animation_type = AnimationType::FADE_IN; + clock.restart(); + elapsed_duration = 0.0f; + } + } +} \ No newline at end of file From 5e3d67a09487eb838fa326133912f3691213d058 Mon Sep 17 00:00:00 2001 From: Rishi Saxena Date: Sat, 31 Aug 2024 13:15:39 +0530 Subject: [PATCH 55/56] Header update bug fix --- .../Header/AnimationSystem/AnimationService.h | 36 +++++++++++++++++++ .../Header/AnimationSystem/AnimationSystem.h | 33 +++++++++++++++++ .../AnimationSystemConfigData.h | 2 +- .../Header/Bullet/BulletController.h | 2 +- Space-Invaders/Header/Bullet/BulletModel.h | 3 +- Space-Invaders/Header/Bullet/BulletService.h | 8 ++--- Space-Invaders/Header/Bullet/BulletView.h | 2 -- .../Controllers/FrostBulletController.h | 2 +- .../Enemy/Controllers/SubZeroController.h | 7 ++-- .../Controllers/ThunderSnakeController.h | 2 +- .../Enemy/Controllers/ZapperController.h | 6 ++-- Space-Invaders/Header/Enemy/EnemyModel.h | 15 ++++---- Space-Invaders/Header/Enemy/EnemyView.h | 4 +-- Space-Invaders/Header/Event/EventService.h | 11 +++--- Space-Invaders/Header/Global/Config.h | 3 ++ Space-Invaders/Header/Global/ServiceLocator.h | 17 +++++---- .../Header/Graphic/GraphicService.h | 2 +- Space-Invaders/Header/Main/GameService.h | 1 - .../Header/Player/PlayerController.h | 11 +++--- Space-Invaders/Header/Player/PlayerModel.h | 13 ++----- Space-Invaders/Header/Player/PlayerService.h | 2 +- Space-Invaders/Header/Player/PlayerView.h | 3 +- Space-Invaders/Header/Sound/SoundService.h | 13 ++++++- .../Header/UI/UIElement/ImageView.h | 3 ++ 24 files changed, 137 insertions(+), 64 deletions(-) create mode 100644 Space-Invaders/Header/AnimationSystem/AnimationService.h create mode 100644 Space-Invaders/Header/AnimationSystem/AnimationSystem.h diff --git a/Space-Invaders/Header/AnimationSystem/AnimationService.h b/Space-Invaders/Header/AnimationSystem/AnimationService.h new file mode 100644 index 000000000..38b033cc4 --- /dev/null +++ b/Space-Invaders/Header/AnimationSystem/AnimationService.h @@ -0,0 +1,36 @@ +#pragma once +#include +#include +#include "../../header/AnimationSystem/AnimationSystem.h" + +namespace Animation +{ + enum class AnimationType + { + EXPLOSION, + }; + + class AnimationService + { + private: + std::vector animation_system_list; + std::vector flagged_animation_system_list; + + AnimationSystemConfig getAnimationSystemConfig(AnimationType animation_type); + void destroyFlaggedAnimationSystem(); + void destroy(); + + public: + AnimationService(); + virtual ~AnimationService(); + + void initialize(); + void update(); + void render(); + + void reset(); + + void spawnAnimationSystem(sf::Vector2f position, AnimationType animation_type); + void destroyAnimationSystem(AnimationSystem* animation_system); + }; +} \ No newline at end of file diff --git a/Space-Invaders/Header/AnimationSystem/AnimationSystem.h b/Space-Invaders/Header/AnimationSystem/AnimationSystem.h new file mode 100644 index 000000000..4c5e8406f --- /dev/null +++ b/Space-Invaders/Header/AnimationSystem/AnimationSystem.h @@ -0,0 +1,33 @@ +#pragma once +#include +#include "../../header/AnimationSystem/AnimationSystemConfig.h" +#include "../../header/UI/UIElement/ImageView.h" + +namespace Animation +{ + class AnimationSystem + { + private: + AnimationSystemConfig animation_system_config; + + sf::Vector2f animation_position; + UI::UIElement::ImageView* animation_image; + + void createUIElements(); + void initializeImage(); + + int current_frame; + sf::Clock clock; + sf::Time frame_time; + + public: + AnimationSystem(AnimationSystemConfig config); + ~AnimationSystem(); + + void initialize(sf::Vector2f position); + void update(); + void render(); + + void destroy(); + }; +} \ No newline at end of file diff --git a/Space-Invaders/Header/AnimationSystem/AnimationSystemConfigData.h b/Space-Invaders/Header/AnimationSystem/AnimationSystemConfigData.h index 21b62b375..3c8978dc9 100644 --- a/Space-Invaders/Header/AnimationSystem/AnimationSystemConfigData.h +++ b/Space-Invaders/Header/AnimationSystem/AnimationSystemConfigData.h @@ -1,6 +1,6 @@ #pragma once #include "AnimationSystemConfig.h" -#include "../../header/Global/Config.h" +#include "../../Header/Global/Config.h" namespace Animation { diff --git a/Space-Invaders/Header/Bullet/BulletController.h b/Space-Invaders/Header/Bullet/BulletController.h index e8ac207e3..363f1407e 100644 --- a/Space-Invaders/Header/Bullet/BulletController.h +++ b/Space-Invaders/Header/Bullet/BulletController.h @@ -32,7 +32,7 @@ namespace Bullet public: BulletController(BulletType type, Entity::EntityType owner_type); - virtual ~BulletController() override; + virtual ~BulletController(); void initialize(sf::Vector2f position, Bullet::MovementDirection direction) override; void update() override; diff --git a/Space-Invaders/Header/Bullet/BulletModel.h b/Space-Invaders/Header/Bullet/BulletModel.h index ccb0fd0b9..5eaebd2fb 100644 --- a/Space-Invaders/Header/Bullet/BulletModel.h +++ b/Space-Invaders/Header/Bullet/BulletModel.h @@ -14,9 +14,8 @@ namespace Bullet sf::Vector2f bullet_position; BulletType bullet_type; - MovementDirection movement_direction; - Entity::EntityType owner_type; + MovementDirection movement_direction; public: diff --git a/Space-Invaders/Header/Bullet/BulletService.h b/Space-Invaders/Header/Bullet/BulletService.h index 4b1b45fb0..79983d32f 100644 --- a/Space-Invaders/Header/Bullet/BulletService.h +++ b/Space-Invaders/Header/Bullet/BulletService.h @@ -1,8 +1,8 @@ #pragma once #include #include "SFML/System/Vector2.hpp" -#include "../../Header/Projectile/IProjectile.h" #include "../../Header/Entity/EntityConfig.h" +#include "../../Header/Projectile/IProjectile.h" namespace Bullet { @@ -17,7 +17,7 @@ namespace Bullet std::vector flagged_bullet_list; std::vector bullet_list; - BulletController* createBullet(BulletType bullet_type, Entity::EntityType owner_type); + BulletController* createBullet(BulletType type, Entity::EntityType owner_type); bool isValidBullet(int index_i, std::vector& bullet_list); void destroyFlaggedBullets(); @@ -31,9 +31,9 @@ namespace Bullet void initialize(); void update(); void render(); + void reset(); - BulletController* spawnBullet(BulletType bullet_type, sf::Vector2f position, MovementDirection direction, Entity::EntityType owner_type); + BulletController* spawnBullet(BulletType type, sf::Vector2f position, MovementDirection direction, Entity::EntityType owner_type); void destroyBullet(BulletController* bullet_controller); - void reset(); }; } \ No newline at end of file diff --git a/Space-Invaders/Header/Bullet/BulletView.h b/Space-Invaders/Header/Bullet/BulletView.h index bc6018023..ba6068000 100644 --- a/Space-Invaders/Header/Bullet/BulletView.h +++ b/Space-Invaders/Header/Bullet/BulletView.h @@ -1,12 +1,10 @@ #pragma once #include -#include "../../Header/Bullet/BulletController.h" #include "../../Header/UI/UIElement/ImageView.h" namespace Bullet { class BulletController; - enum class BulletType; class BulletView { diff --git a/Space-Invaders/Header/Bullet/Controllers/FrostBulletController.h b/Space-Invaders/Header/Bullet/Controllers/FrostBulletController.h index 8a99046c9..37132c5e3 100644 --- a/Space-Invaders/Header/Bullet/Controllers/FrostBulletController.h +++ b/Space-Invaders/Header/Bullet/Controllers/FrostBulletController.h @@ -8,7 +8,7 @@ namespace Bullet class FrostBulletController : public BulletController { private: - const float torpedo_movement_speed = 500.f; + const float frost_bullet_movement_speed = 500.f; public: FrostBulletController(BulletType type, Entity::EntityType owner_type); diff --git a/Space-Invaders/Header/Enemy/Controllers/SubZeroController.h b/Space-Invaders/Header/Enemy/Controllers/SubZeroController.h index 2a39d526d..bc9acee12 100644 --- a/Space-Invaders/Header/Enemy/Controllers/SubZeroController.h +++ b/Space-Invaders/Header/Enemy/Controllers/SubZeroController.h @@ -1,6 +1,5 @@ #pragma once - -#include "../../header/Enemy/EnemyController.h" +#include "../../Header/Enemy/EnemyController.h" namespace Enemy { @@ -10,7 +9,7 @@ namespace Enemy { private: - float vertical_movement_speed = 100.f; + float subzero_vertical_movement_speed = 100.f; const float subzero_rate_of_fire = 2.f; void move() override; @@ -18,7 +17,7 @@ namespace Enemy void fireBullet() override; - void destroy(); + void destroy() override; public: diff --git a/Space-Invaders/Header/Enemy/Controllers/ThunderSnakeController.h b/Space-Invaders/Header/Enemy/Controllers/ThunderSnakeController.h index c31e0d291..b083435e5 100644 --- a/Space-Invaders/Header/Enemy/Controllers/ThunderSnakeController.h +++ b/Space-Invaders/Header/Enemy/Controllers/ThunderSnakeController.h @@ -19,7 +19,7 @@ namespace Enemy void fireBullet() override; - void destroy(); + void destroy() override; MovementDirection getInitialMovementDirection(); diff --git a/Space-Invaders/Header/Enemy/Controllers/ZapperController.h b/Space-Invaders/Header/Enemy/Controllers/ZapperController.h index 90a0916eb..1a4eeb54a 100644 --- a/Space-Invaders/Header/Enemy/Controllers/ZapperController.h +++ b/Space-Invaders/Header/Enemy/Controllers/ZapperController.h @@ -1,6 +1,5 @@ #pragma once - -#include "../../header/Enemy/EnemyController.h" +#include "../../Header/Enemy/EnemyController.h" namespace Enemy { @@ -18,8 +17,7 @@ namespace Enemy void moveDown(); void fireBullet() override; - - void destroy(); + void destroy() override; public: diff --git a/Space-Invaders/Header/Enemy/EnemyModel.h b/Space-Invaders/Header/Enemy/EnemyModel.h index f29b16c61..c33c311a6 100644 --- a/Space-Invaders/Header/Enemy/EnemyModel.h +++ b/Space-Invaders/Header/Enemy/EnemyModel.h @@ -20,33 +20,32 @@ namespace Enemy EnemyState enemy_state; public: - EnemyModel(EnemyType type); - ~EnemyModel(); - //const settings for enemy const sf::Vector2f left_most_position = sf::Vector2f(50.f, 50.f); const sf::Vector2f right_most_position = sf::Vector2f(1800.f, 50.f); const sf::Vector2f barrel_position_offset = sf::Vector2f(20.f, 50.f); - const float vertical_travel_distance = 100.f; - const float enemy_movement_speed = 250.0f; - - float vertical_movement_speed = 30.0f; - float horizontal_movement_speed = 100.0f; + EnemyModel(EnemyType type); + ~EnemyModel(); void initialize(); // Getters and Setters sf::Vector2f getEnemyPosition(); void setEnemyPosition(sf::Vector2f position); + sf::Vector2f getReferencePosition(); void setReferencePosition(sf::Vector2f position); + EnemyState getEnemyState(); void setEnemyState(EnemyState state); + EnemyType getEnemyType(); void setEnemyType(EnemyType type); + MovementDirection getMovementDirection(); void setMovementDirection(MovementDirection direction); + Entity::EntityType getEntityType(); }; } \ No newline at end of file diff --git a/Space-Invaders/Header/Enemy/EnemyView.h b/Space-Invaders/Header/Enemy/EnemyView.h index e7908e6f6..d494f85b8 100644 --- a/Space-Invaders/Header/Enemy/EnemyView.h +++ b/Space-Invaders/Header/Enemy/EnemyView.h @@ -1,7 +1,6 @@ #pragma once #include -#include "../../Header/Enemy/EnemyConfig.h" #include "../../Header/UI/UIElement/ImageView.h" namespace Enemy @@ -26,9 +25,10 @@ namespace Enemy public: EnemyView(); ~EnemyView(); - const sf::Sprite& getEnemySprite(); + void initialize(EnemyController* controller); void update(); void render(); + const sf::Sprite& getEnemySprite(); }; } \ No newline at end of file diff --git a/Space-Invaders/Header/Event/EventService.h b/Space-Invaders/Header/Event/EventService.h index ebecfd5d6..87772f930 100644 --- a/Space-Invaders/Header/Event/EventService.h +++ b/Space-Invaders/Header/Event/EventService.h @@ -18,10 +18,6 @@ namespace Event sf::Event game_event; //event var sf::RenderWindow* game_window; //ptr to our game window - bool isGameWindowOpen(); - bool gameWindowWasClosed(); //for the condition we already had - the title bar cross. - bool hasQuitGame(); //for our new 'ESC' condition - //Button States ButtonState left_mouse_button_state; ButtonState right_mouse_button_state; @@ -30,6 +26,10 @@ namespace Event ButtonState A_button_state; ButtonState D_button_state; + bool isGameWindowOpen(); + bool gameWindowWasClosed(); //for the condition we already had - the title bar cross. + bool hasQuitGame(); //for our new 'ESC' condition + //Button and mouse state functions void updateMouseButtonsState(ButtonState& current_button_state, sf::Mouse::Button mouse_button); void updateKeyboardButtonsState(ButtonState& current_button_state, sf::Keyboard::Key keyboard_button); @@ -42,6 +42,8 @@ namespace Event void initialize(); void update(); void processEvents(); // while window is open we will check for events + + // Inputs bool pressedEscapeKey(); bool isKeyboardEvent(); bool pressedLeftKey(); // getting inputs for the player @@ -50,7 +52,6 @@ namespace Event bool pressedRightMouseButton(); bool pressedAKey(); // AD held check bool pressedDKey(); - }; } diff --git a/Space-Invaders/Header/Global/Config.h b/Space-Invaders/Header/Global/Config.h index b44bc92c1..37cac583b 100644 --- a/Space-Invaders/Header/Global/Config.h +++ b/Space-Invaders/Header/Global/Config.h @@ -37,5 +37,8 @@ namespace Global static const sf::String background_music_path; static const sf::String button_click_sound_path; + static const sf::String bullet_fire_sound_path; + static const sf::String powerup_enabled_sound_path; + static const sf::String powerup_disabled_sound_path; }; } diff --git a/Space-Invaders/Header/Global/ServiceLocator.h b/Space-Invaders/Header/Global/ServiceLocator.h index d536edd94..a337fc025 100644 --- a/Space-Invaders/Header/Global/ServiceLocator.h +++ b/Space-Invaders/Header/Global/ServiceLocator.h @@ -1,16 +1,17 @@ #pragma once #include "../../Header/Graphic/GraphicService.h" #include "../../Header/Event/EventService.h" +#include "../../Header/UI/UIService.h" #include "../../Header/Player/PlayerService.h" #include "../../Header/Time/TimeService.h" -#include "../../Header/UI/UIService.h" #include "../../Header/Enemy/EnemyService.h" #include "../../Header/Gameplay/GameplayService.h" #include "../../Header/Element/ElementService.h" -#include "../../Header/Sound/SoundService.h" #include "../../Header/Bullet/BulletService.h" #include "../../Header/Powerups/PowerupService.h" +#include "../../Header/Sound/SoundService.h" #include "../../Header/Collision/CollisionService.h" +#include "../../Header/AnimationSystem/AnimationService.h" // ServiceLocator Class Summary: This class manages access to various services in the application. @@ -23,18 +24,19 @@ namespace Global private: // Private Attributes: - Graphics::GraphicService* graphic_service; Event::EventService* event_service; - Player::PlayerService* player_service; - Time::TimeService* time_service; + Graphics::GraphicService* graphic_service; UI::UIService* ui_service; - Enemy::EnemyService* enemy_service; + Time::TimeService* time_service; Gameplay::GameplayService* gameplay_service; + Player::PlayerService* player_service; + Enemy::EnemyService* enemy_service; Element::ElementService* element_service; - Sound::SoundService* sound_service; Bullet::BulletService* bullet_service; Powerup::PowerupService* powerup_service; + Sound::SoundService* sound_service; Collision::CollisionService* collision_service; + Animation::AnimationService* animation_service; // Public Methods ServiceLocator(); @@ -65,6 +67,7 @@ namespace Global Bullet::BulletService* getBulletService(); // Retrive the BulletService instance Powerup::PowerupService* getPowerupService(); // Retrive the PowerupService instance Collision::CollisionService* getCollisionService(); // Retrive the CollisionService instance + Animation::AnimationService* getAnimationService(); // Retrive the AnimationService instance void deleteServiceLocator(); }; } \ No newline at end of file diff --git a/Space-Invaders/Header/Graphic/GraphicService.h b/Space-Invaders/Header/Graphic/GraphicService.h index a0514d024..f14989a3e 100644 --- a/Space-Invaders/Header/Graphic/GraphicService.h +++ b/Space-Invaders/Header/Graphic/GraphicService.h @@ -34,7 +34,7 @@ namespace Graphics void update(); //.. void render(); //.. bool isGameWindowOpen(); //check if the window is open - + void setFrameRate(int); sf::RenderWindow* getGameWindow(); //getter for the game window instance sf::Color getWindowColor();//get the color }; diff --git a/Space-Invaders/Header/Main/GameService.h b/Space-Invaders/Header/Main/GameService.h index 047504ba1..0cce5b481 100644 --- a/Space-Invaders/Header/Main/GameService.h +++ b/Space-Invaders/Header/Main/GameService.h @@ -27,7 +27,6 @@ namespace Main void initialize(); // Handles game initialization. void initializeVariables();// Handles game initialization. void destroy(); // Handles cleanup tasks. - void showMainMenu(); void showSplashScreen(); public: diff --git a/Space-Invaders/Header/Player/PlayerController.h b/Space-Invaders/Header/Player/PlayerController.h index 5815796ab..b409006f4 100644 --- a/Space-Invaders/Header/Player/PlayerController.h +++ b/Space-Invaders/Header/Player/PlayerController.h @@ -7,7 +7,6 @@ namespace Player { class PlayerView; - class PlayerModel; enum class PlayerState; class PlayerController : public Collision::ICollider @@ -18,7 +17,7 @@ namespace Player float elapsed_tripple_laser_duration; float elapsed_fire_duration; - float elapsed_freez_duration; + float elapsed_freeze_duration; PlayerView* player_view; PlayerModel* player_model; @@ -54,18 +53,18 @@ namespace Player void reset(); + void decreasePlayerLive(); + inline void increaseEnemiesKilled(int val) { PlayerModel::enemies_killed += val; } + inline void increaseBulletsFired(int val) { PlayerModel::bullets_fired += val; } + void enableShield(); void enableRapidFire(); void enableTrippleLaser(); sf::Vector2f getPlayerPosition(); - int getPlayerScore(); PlayerState getPlayerState(); const sf::Sprite& getColliderSprite() override; void onCollision(ICollider* other_collider) override; - - void decreasePlayerLive(); - inline void increaseEnemiesKilled(int val) { PlayerModel::enemies_killed += val; } }; } \ No newline at end of file diff --git a/Space-Invaders/Header/Player/PlayerModel.h b/Space-Invaders/Header/Player/PlayerModel.h index ea3ad1bc5..aebfb54f5 100644 --- a/Space-Invaders/Header/Player/PlayerModel.h +++ b/Space-Invaders/Header/Player/PlayerModel.h @@ -25,10 +25,11 @@ namespace Player sf::Vector2f player_position; Entity::EntityType entity_type; PlayerState player_state; //Declaration - int player_score; static int player_lives; + static int player_score; static int enemies_killed; + static int bullets_fired; bool b_shield; bool b_rapid_fire; @@ -51,13 +52,6 @@ namespace Player const float rapid_fire_cooldown_duration = 0.05f; const float tripple_laser_position_offset = 30.f; - float elapsed_shield_duration; - float elapsed_rapid_fire_duration; - float elapsed_tripple_laser_duration; - - float elapsed_fire_duration; - float elapsed_freeze_duration; - const float player_movement_speed = 600.0f; static const int invincible_player_alpha = 170.f; @@ -70,9 +64,6 @@ namespace Player sf::Vector2f getPlayerPosition(); void setPlayerPosition(sf::Vector2f position); - int getPlayerScore(); - void setPlayerScore(int score); - //new getter and setter PlayerState getPlayerState(); void setPlayerState(PlayerState state); diff --git a/Space-Invaders/Header/Player/PlayerService.h b/Space-Invaders/Header/Player/PlayerService.h index 34637c0d6..3a5c47b01 100644 --- a/Space-Invaders/Header/Player/PlayerService.h +++ b/Space-Invaders/Header/Player/PlayerService.h @@ -1,5 +1,4 @@ #pragma once -#include "../../Header/Player/PlayerController.h" namespace Player { @@ -23,6 +22,7 @@ namespace Player void enableTrippleLaser(); void reset(); + void increaseEnemiesKilled(int val); }; } diff --git a/Space-Invaders/Header/Player/PlayerView.h b/Space-Invaders/Header/Player/PlayerView.h index e3159ec97..51eaa26aa 100644 --- a/Space-Invaders/Header/Player/PlayerView.h +++ b/Space-Invaders/Header/Player/PlayerView.h @@ -1,6 +1,5 @@ #pragma once #include -#include "../../Header/Player/PlayerController.h" #include "../../Header/UI/UIElement/ImageView.h" namespace Player @@ -25,6 +24,8 @@ namespace Player void update(); void render(); + + void setPlayerHighlight(bool b_highlight); const sf::Sprite& getPlayerSprite(); void initialize(PlayerController* controller); }; diff --git a/Space-Invaders/Header/Sound/SoundService.h b/Space-Invaders/Header/Sound/SoundService.h index 93b0dd509..195d86835 100644 --- a/Space-Invaders/Header/Sound/SoundService.h +++ b/Space-Invaders/Header/Sound/SoundService.h @@ -6,16 +6,27 @@ namespace Sound enum class SoundType { BUTTON_CLICK, + BULLET_FIRE, + EXPLOSION, + POWERUP_ENABLED, + POWERUP_DISABLED, }; class SoundService { private: - const int background_music_volume = 30; + const int background_music_volume = 20; sf::Music background_music; sf::Sound sound_effect; + sf::Sound explosion_sound_effect; + sf::Sound powerup_sound_effect; + sf::SoundBuffer buffer_button_click; + sf::SoundBuffer buffer_bullet_fire; + sf::SoundBuffer buffer_explosion; + sf::SoundBuffer buffer_powerup_enabled; + sf::SoundBuffer buffer_powerup_disabled; void loadBackgroundMusicFromFile(); void loadSoundFromFile(); diff --git a/Space-Invaders/Header/UI/UIElement/ImageView.h b/Space-Invaders/Header/UI/UIElement/ImageView.h index df800fb00..2c23b9db5 100644 --- a/Space-Invaders/Header/UI/UIElement/ImageView.h +++ b/Space-Invaders/Header/UI/UIElement/ImageView.h @@ -26,6 +26,9 @@ namespace UI virtual void setOriginAtCentre(); virtual void setImageAlpha(float alpha); virtual void setCentreAlinged(); + // animation sprite variants of scale and set + virtual void setTextureRect(sf::IntRect texture_rect); + virtual void setScale(float width, float height, float tile_width, float tile_height); const virtual sf::Sprite& getSprite(); }; From d1e344321a80f1d7e05ff663c5a3d31f946f5906 Mon Sep 17 00:00:00 2001 From: Rishi Saxena Date: Sat, 31 Aug 2024 13:17:33 +0530 Subject: [PATCH 56/56] Fixed collision bug --- .../AnimationSystem/AnimationService.cpp | 63 +++++++++++++++ .../AnimationSystem/AnimationSystem.cpp | 72 +++++++++++++++++ .../Source/Bullet/BulletController.cpp | 80 +++++++++---------- Space-Invaders/Source/Bullet/BulletModel.cpp | 4 +- .../Source/Bullet/BulletService.cpp | 26 +++--- Space-Invaders/Source/Bullet/BulletView.cpp | 10 +-- .../Controllers/FrostBulletController.cpp | 2 +- .../Bullet/Controllers/TorpedoController.cpp | 2 + .../Enemy/Controllers/SubZeroController.cpp | 1 + .../Controllers/ThunderSnakeController.cpp | 15 ++-- .../Enemy/Controllers/UFOController.cpp | 24 +++--- .../Enemy/Controllers/ZapperController.cpp | 27 +------ .../Source/Enemy/EnemyController.cpp | 51 ++++-------- Space-Invaders/Source/Enemy/EnemyView.cpp | 33 ++++---- Space-Invaders/Source/Event/EventService.cpp | 17 +--- .../Source/Gameplay/GameplayView.cpp | 3 +- Space-Invaders/Source/Global/Config.cpp | 7 ++ .../Source/Global/ServiceLocator.cpp | 12 ++- .../Source/Graphic/GraphicService.cpp | 33 ++++---- Space-Invaders/Source/Main/GameService.cpp | 10 +-- .../Source/Player/PlayerController.cpp | 79 ++++++++++-------- Space-Invaders/Source/Player/PlayerModel.cpp | 13 +-- .../Source/Player/PlayerService.cpp | 7 ++ Space-Invaders/Source/Player/PlayerView.cpp | 7 ++ Space-Invaders/Source/Sound/SoundService.cpp | 31 ++++++- .../Source/UI/UIElement/ImageView.cpp | 13 +++ 26 files changed, 394 insertions(+), 248 deletions(-) create mode 100644 Space-Invaders/Source/AnimationSystem/AnimationService.cpp create mode 100644 Space-Invaders/Source/AnimationSystem/AnimationSystem.cpp diff --git a/Space-Invaders/Source/AnimationSystem/AnimationService.cpp b/Space-Invaders/Source/AnimationSystem/AnimationService.cpp new file mode 100644 index 000000000..47360e71a --- /dev/null +++ b/Space-Invaders/Source/AnimationSystem/AnimationService.cpp @@ -0,0 +1,63 @@ +#include "../../header/AnimationSystem/AnimationService.h" +#include "../../header/AnimationSystem/AnimationSystemConfigData.h" + +namespace Animation +{ + AnimationService::AnimationService() { } + + AnimationService::~AnimationService() { destroy(); } + + void AnimationService::initialize() { } + + void AnimationService::update() + { + for (AnimationSystem* animation_system : animation_system_list) + animation_system->update(); + + destroyFlaggedAnimationSystem(); + } + + void AnimationService::render() + { + for (AnimationSystem* animation_system : animation_system_list) + animation_system->render(); + } + + void AnimationService::spawnAnimationSystem(sf::Vector2f position, AnimationType animation_type) + { + AnimationSystem* animation_system = new AnimationSystem(getAnimationSystemConfig(animation_type)); + animation_system->initialize(position); + animation_system_list.push_back(animation_system); + } + + void AnimationService::destroyAnimationSystem(AnimationSystem* animation_system) + { + flagged_animation_system_list.push_back(animation_system); + animation_system_list.erase(std::remove(animation_system_list.begin(), animation_system_list.end(), animation_system), animation_system_list.end()); + } + + AnimationSystemConfig AnimationService::getAnimationSystemConfig(AnimationType animation_type) + { + switch (animation_type) + { + case Animation::AnimationType::EXPLOSION: + return explosion_animation_config; + } + } + + void AnimationService::destroyFlaggedAnimationSystem() + { + for (AnimationSystem* particle_system : flagged_animation_system_list) + delete (particle_system); + + flagged_animation_system_list.clear(); + } + + void AnimationService::reset() { destroy(); } + + void AnimationService::destroy() + { + for (AnimationSystem* animation_system : animation_system_list) + delete (animation_system); + } +} \ No newline at end of file diff --git a/Space-Invaders/Source/AnimationSystem/AnimationSystem.cpp b/Space-Invaders/Source/AnimationSystem/AnimationSystem.cpp new file mode 100644 index 000000000..ea516759e --- /dev/null +++ b/Space-Invaders/Source/AnimationSystem/AnimationSystem.cpp @@ -0,0 +1,72 @@ +#include "../../header/AnimationSystem/AnimationSystem.h" +#include "../../header/Global/Config.h" +#include "../../header/Global/ServiceLocator.h" +#include "../../header/AnimationSystem/AnimationService.h" + +namespace Animation +{ + using namespace Global; + using namespace UI::UIElement; + + AnimationSystem::AnimationSystem(AnimationSystemConfig config) + { + animation_system_config = config; + createUIElements(); + } + + AnimationSystem::~AnimationSystem() + { + delete(animation_image); + } + + void AnimationSystem::initialize(sf::Vector2f position) + { + animation_position = position; + current_frame = 0; + frame_time = sf::seconds(animation_system_config.frame_duration); + + initializeImage(); + } + + void AnimationSystem::createUIElements() + { + animation_image = new ImageView(); + } + + void AnimationSystem::initializeImage() + { + animation_image->initialize(Config::explosion_texture_path, 0, 0, animation_position); + animation_image->setTextureRect(sf::IntRect(0, 0, animation_system_config.tile_width, animation_system_config.tile_height)); + + animation_image->setScale(animation_system_config.sprite_sheet_width, animation_system_config.sprite_sheet_height, animation_system_config.tile_width, animation_system_config.tile_height); + } + + void AnimationSystem::update() + { + if (clock.getElapsedTime() >= frame_time) + { + if (current_frame + 1 >= animation_system_config.number_of_animation_frames) + destroy(); + + current_frame = (current_frame + 1) % animation_system_config.number_of_animation_frames; + clock.restart(); + + animation_image->setTextureRect(sf::IntRect( + current_frame * animation_system_config.tile_width, + 0, + animation_system_config.tile_width, + animation_system_config.tile_height)); + } + animation_image->update(); + } + + void AnimationSystem::render() + { + animation_image->render(); + } + + void AnimationSystem::destroy() + { + ServiceLocator::getInstance()->getAnimationService()->destroyAnimationSystem(this); + } +} \ No newline at end of file diff --git a/Space-Invaders/Source/Bullet/BulletController.cpp b/Space-Invaders/Source/Bullet/BulletController.cpp index caec18081..0ba4beb69 100644 --- a/Space-Invaders/Source/Bullet/BulletController.cpp +++ b/Space-Invaders/Source/Bullet/BulletController.cpp @@ -15,18 +15,34 @@ namespace Bullet using namespace Enemy; using namespace Element::Bunker; - void Bullet::BulletController::updateProjectilePosition() + BulletController::BulletController(BulletType type, Entity::EntityType owner_type) { - switch (bullet_model->getMovementDirection()) - { - case::Bullet::MovementDirection::UP: - moveUp(); - break; + bullet_view = new BulletView(); + bullet_model = new BulletModel(type, owner_type); + } - case::Bullet::MovementDirection::DOWN: - moveDown(); - break; - } + BulletController::~BulletController() + { + delete (bullet_view); + delete (bullet_model); + } + + void BulletController::initialize(sf::Vector2f position, Bullet::MovementDirection direction) + { + bullet_view->initialize(this); + bullet_model->initialize(position, direction); + } + + void BulletController::update() + { + updateProjectilePosition(); + bullet_view->update(); + handleOutOfBounds(); + } + + void BulletController::render() + { + bullet_view->render(); } void Bullet::BulletController::moveUp() @@ -57,36 +73,6 @@ namespace Bullet } } - BulletController::BulletController(BulletType type, Entity::EntityType owner_type) - { - bullet_view = new BulletView(); - bullet_model = new BulletModel(type, owner_type); - } - - BulletController::~BulletController() - { - delete (bullet_view); - delete (bullet_model); - } - - void BulletController::initialize(sf::Vector2f position, Bullet::MovementDirection direction) - { - bullet_view->initialize(this); - bullet_model->initialize(position, direction); - } - - void BulletController::update() - { - updateProjectilePosition(); - bullet_view->update(); - handleOutOfBounds(); - } - - void BulletController::render() - { - bullet_view->render(); - } - sf::Vector2f BulletController::getProjectilePosition() { return bullet_model->getBulletPosition(); @@ -115,6 +101,20 @@ namespace Bullet processBulletCollision(other_collider); } + void Bullet::BulletController::updateProjectilePosition() + { + switch (bullet_model->getMovementDirection()) + { + case::Bullet::MovementDirection::UP: + moveUp(); + break; + + case::Bullet::MovementDirection::DOWN: + moveDown(); + break; + } + } + void BulletController::processBulletCollision(ICollider* other_collider) { BulletController* bullet_controller = dynamic_cast(other_collider); diff --git a/Space-Invaders/Source/Bullet/BulletModel.cpp b/Space-Invaders/Source/Bullet/BulletModel.cpp index c73853ffb..f0020975b 100644 --- a/Space-Invaders/Source/Bullet/BulletModel.cpp +++ b/Space-Invaders/Source/Bullet/BulletModel.cpp @@ -2,7 +2,9 @@ namespace Bullet { - BulletModel::BulletModel(BulletType type, Entity::EntityType owner_type) + using namespace Entity; + + BulletModel::BulletModel(BulletType type, EntityType owner_type) { this->bullet_type = type; this->owner_type = owner_type; diff --git a/Space-Invaders/Source/Bullet/BulletService.cpp b/Space-Invaders/Source/Bullet/BulletService.cpp index 0cea2a7d3..1750745c3 100644 --- a/Space-Invaders/Source/Bullet/BulletService.cpp +++ b/Space-Invaders/Source/Bullet/BulletService.cpp @@ -27,18 +27,21 @@ namespace Bullet void BulletService::update() { - for (int i = 0; i < bullet_list.size(); i++) bullet_list[i]->update(); + for (Projectile::IProjectile* bullet : bullet_list) + bullet->update(); + destroyFlaggedBullets(); } void BulletService::render() { - for (int i = 0; i < bullet_list.size(); i++) bullet_list[i]->render(); + for (Projectile::IProjectile* bullet : bullet_list) + bullet->render(); } - BulletController* BulletService::createBullet(BulletType bullet_type, Entity::EntityType owner_type) + BulletController* BulletService::createBullet(BulletType type, Entity::EntityType owner_type) { - switch (bullet_type) + switch (type) { case::Bullet::BulletType::LASER_BULLET: return new LaserBulletController(Bullet::BulletType::LASER_BULLET, owner_type); @@ -80,22 +83,21 @@ namespace Bullet bullet_list.clear(); } - BulletController* BulletService::spawnBullet(BulletType bullet_type, sf::Vector2f position, MovementDirection direction, Entity::EntityType owner_type) + BulletController* BulletService::spawnBullet(BulletType type, sf::Vector2f position, MovementDirection direction, Entity::EntityType owner_type) { - BulletController* bullet_controller = createBullet(bullet_type, owner_type); - + BulletController* bullet_controller = createBullet(type, owner_type); bullet_controller->initialize(position, direction); + + ServiceLocator::getInstance()->getCollisionService()->addCollider(dynamic_cast(bullet_controller)); bullet_list.push_back(bullet_controller); return bullet_controller; } void BulletService::destroyBullet(BulletController* bullet_controller) { - if (std::find(flagged_bullet_list.begin(), flagged_bullet_list.end(), bullet_controller) == flagged_bullet_list.end()) - { - flagged_bullet_list.push_back(bullet_controller); - bullet_list.erase(std::remove(bullet_list.begin(), bullet_list.end(), bullet_controller), bullet_list.end()); - } + dynamic_cast(bullet_controller)->disableCollision(); + flagged_bullet_list.push_back(bullet_controller); + bullet_list.erase(std::remove(bullet_list.begin(), bullet_list.end(), bullet_controller), bullet_list.end()); } void BulletService::reset() diff --git a/Space-Invaders/Source/Bullet/BulletView.cpp b/Space-Invaders/Source/Bullet/BulletView.cpp index b9aa6280e..5084b2355 100644 --- a/Space-Invaders/Source/Bullet/BulletView.cpp +++ b/Space-Invaders/Source/Bullet/BulletView.cpp @@ -40,11 +40,6 @@ namespace Bullet bullet_image->render(); } - const sf::Sprite& BulletView::getBulletSprite() - { - return bullet_image->getSprite(); - } - sf::String BulletView::getBulletTexturePath() { switch (bullet_controller->getBulletType()) @@ -60,6 +55,11 @@ namespace Bullet } } + const sf::Sprite& BulletView::getBulletSprite() + { + return bullet_image->getSprite(); + } + void BulletView::destroy() { delete (bullet_image); diff --git a/Space-Invaders/Source/Bullet/Controllers/FrostBulletController.cpp b/Space-Invaders/Source/Bullet/Controllers/FrostBulletController.cpp index f91befa6d..d2033ebcc 100644 --- a/Space-Invaders/Source/Bullet/Controllers/FrostBulletController.cpp +++ b/Space-Invaders/Source/Bullet/Controllers/FrostBulletController.cpp @@ -12,7 +12,7 @@ namespace Bullet void FrostBulletController::initialize(sf::Vector2f position, MovementDirection direction) { BulletController::initialize(position, direction); - bullet_model->setMovementSpeed(torpedo_movement_speed); + bullet_model->setMovementSpeed(frost_bullet_movement_speed); } } } \ No newline at end of file diff --git a/Space-Invaders/Source/Bullet/Controllers/TorpedoController.cpp b/Space-Invaders/Source/Bullet/Controllers/TorpedoController.cpp index 87fd16ca2..6f4a177e5 100644 --- a/Space-Invaders/Source/Bullet/Controllers/TorpedoController.cpp +++ b/Space-Invaders/Source/Bullet/Controllers/TorpedoController.cpp @@ -5,6 +5,8 @@ namespace Bullet { namespace Controller { + using namespace Entity; + TorpedoController::TorpedoController(BulletType type, Entity::EntityType owner_type) : BulletController(type, owner_type) { } TorpedoController::~TorpedoController() { } diff --git a/Space-Invaders/Source/Enemy/Controllers/SubZeroController.cpp b/Space-Invaders/Source/Enemy/Controllers/SubZeroController.cpp index ce2f1371b..bc204a90c 100644 --- a/Space-Invaders/Source/Enemy/Controllers/SubZeroController.cpp +++ b/Space-Invaders/Source/Enemy/Controllers/SubZeroController.cpp @@ -22,6 +22,7 @@ namespace Enemy EnemyController::initialize(); enemy_model->setMovementDirection(MovementDirection::DOWN); rate_of_fire = subzero_rate_of_fire; + vertical_movement_speed = subzero_vertical_movement_speed; } void SubzeroController::move() diff --git a/Space-Invaders/Source/Enemy/Controllers/ThunderSnakeController.cpp b/Space-Invaders/Source/Enemy/Controllers/ThunderSnakeController.cpp index 42d615247..92a84f7eb 100644 --- a/Space-Invaders/Source/Enemy/Controllers/ThunderSnakeController.cpp +++ b/Space-Invaders/Source/Enemy/Controllers/ThunderSnakeController.cpp @@ -1,7 +1,6 @@ #include "../../Header/Enemy/Controllers/ThunderSnakeController.h" #include "../../Header/Enemy/EnemyView.h" #include "../../Header/Enemy/EnemyModel.h" -#include "../../header/Enemy/EnemyConfig.h" #include "../../Header/Global/ServiceLocator.h" #include "../../Header/Bullet/BulletConfig.h" @@ -21,7 +20,7 @@ namespace Enemy { EnemyController::initialize(); enemy_model->setMovementDirection(getInitialMovementDirection()); - enemy_model->horizontal_movement_speed = thunder_snake_horizontal_movement_speed; + horizontal_movement_speed = thunder_snake_horizontal_movement_speed; } MovementDirection ThunderSnakeController::getInitialMovementDirection() @@ -65,7 +64,7 @@ namespace Enemy void ThunderSnakeController::moveLeft() { sf::Vector2f currentPosition = enemy_model->getEnemyPosition(); - currentPosition.x -= enemy_model->horizontal_movement_speed * ServiceLocator::getInstance()->getTimeService()->getDeltaTime(); + currentPosition.x -= horizontal_movement_speed * ServiceLocator::getInstance()->getTimeService()->getDeltaTime(); if (currentPosition.x <= enemy_model->left_most_position.x) { @@ -77,7 +76,7 @@ namespace Enemy void ThunderSnakeController::moveRight() { sf::Vector2f currentPosition = enemy_model->getEnemyPosition(); - currentPosition.x += enemy_model->horizontal_movement_speed * ServiceLocator::getInstance()->getTimeService()->getDeltaTime(); + currentPosition.x += horizontal_movement_speed * ServiceLocator::getInstance()->getTimeService()->getDeltaTime(); if (currentPosition.x >= enemy_model->right_most_position.x) { @@ -89,8 +88,8 @@ namespace Enemy void ThunderSnakeController::moveDiagonalLeft() { sf::Vector2f currentPosition = enemy_model->getEnemyPosition(); - currentPosition.y += enemy_model->vertical_movement_speed * ServiceLocator::getInstance()->getTimeService()->getDeltaTime(); - currentPosition.x -= enemy_model->horizontal_movement_speed * ServiceLocator::getInstance()->getTimeService()->getDeltaTime(); + currentPosition.y += vertical_movement_speed * ServiceLocator::getInstance()->getTimeService()->getDeltaTime(); + currentPosition.x -= horizontal_movement_speed * ServiceLocator::getInstance()->getTimeService()->getDeltaTime(); if (currentPosition.x <= enemy_model->left_most_position.x) { @@ -102,8 +101,8 @@ namespace Enemy void ThunderSnakeController::moveDiagonalRight() { sf::Vector2f currentPosition = enemy_model->getEnemyPosition(); - currentPosition.y += enemy_model->vertical_movement_speed * ServiceLocator::getInstance()->getTimeService()->getDeltaTime(); - currentPosition.x += enemy_model->horizontal_movement_speed * ServiceLocator::getInstance()->getTimeService()->getDeltaTime(); + currentPosition.y += vertical_movement_speed * ServiceLocator::getInstance()->getTimeService()->getDeltaTime(); + currentPosition.x += horizontal_movement_speed * ServiceLocator::getInstance()->getTimeService()->getDeltaTime(); if (currentPosition.x >= enemy_model->right_most_position.x) { diff --git a/Space-Invaders/Source/Enemy/Controllers/UFOController.cpp b/Space-Invaders/Source/Enemy/Controllers/UFOController.cpp index 6b800a9cc..7eb92e493 100644 --- a/Space-Invaders/Source/Enemy/Controllers/UFOController.cpp +++ b/Space-Invaders/Source/Enemy/Controllers/UFOController.cpp @@ -1,12 +1,12 @@ -#include "../../header/Enemy/Controllers/UFOController.h" -#include "../../header/Enemy/EnemyView.h" -#include "../../header/Enemy/EnemyModel.h" -#include "../../header/Enemy/EnemyConfig.h" -#include "../../header/Global/ServiceLocator.h" -#include "../../header/Bullet/BulletConfig.h" -#include "../../header/Powerups/PowerupService.h" -#include "../../header/Bullet/BulletController.h" -#include "../../header/Entity/EntityConfig.h" +#include "../../Header/Enemy/Controllers/UFOController.h" +#include "../../Header/Enemy/EnemyView.h" +#include "../../Header/Enemy/EnemyModel.h" +#include "../../Header/Enemy/EnemyConfig.h" +#include "../../Header/Global/ServiceLocator.h" +#include "../../Header/Bullet/BulletConfig.h" +#include "../../Header/Powerups/PowerupService.h" +#include "../../Header/Bullet/BulletController.h" +#include "../../Header/Entity/EntityConfig.h" namespace Enemy @@ -53,13 +53,12 @@ namespace Enemy moveRight(); break; } - } void UFOController::moveLeft() { sf::Vector2f currentPosition = enemy_model->getEnemyPosition(); - currentPosition.x -= enemy_model->horizontal_movement_speed * ServiceLocator::getInstance()->getTimeService()->getDeltaTime(); + currentPosition.x -= horizontal_movement_speed * ServiceLocator::getInstance()->getTimeService()->getDeltaTime(); if (currentPosition.x <= enemy_model->left_most_position.x) { @@ -72,7 +71,7 @@ namespace Enemy void UFOController::moveRight() { sf::Vector2f currentPosition = enemy_model->getEnemyPosition(); - currentPosition.x += enemy_model->horizontal_movement_speed * ServiceLocator::getInstance()->getTimeService()->getDeltaTime(); + currentPosition.x += horizontal_movement_speed * ServiceLocator::getInstance()->getTimeService()->getDeltaTime(); if (currentPosition.x >= enemy_model->right_most_position.x) { @@ -95,7 +94,6 @@ namespace Enemy } void UFOController::destroy() { - EnemyController::destroy(); } } diff --git a/Space-Invaders/Source/Enemy/Controllers/ZapperController.cpp b/Space-Invaders/Source/Enemy/Controllers/ZapperController.cpp index a61cd17af..b1660bf2e 100644 --- a/Space-Invaders/Source/Enemy/Controllers/ZapperController.cpp +++ b/Space-Invaders/Source/Enemy/Controllers/ZapperController.cpp @@ -8,6 +8,7 @@ namespace Enemy { using namespace Global; + using namespace Time; using namespace Bullet; namespace Controller @@ -45,74 +46,54 @@ namespace Enemy void ZapperController::moveLeft() { - // Get the current position of the enemy sf::Vector2f currentPosition = enemy_model->getEnemyPosition(); + currentPosition.x -= horizontal_movement_speed * ServiceLocator::getInstance()->getTimeService()->getDeltaTime(); - // Update the position to move left - currentPosition.x -= enemy_model->enemy_movement_speed * ServiceLocator::getInstance()->getTimeService()->getDeltaTime(); - - // Check if the enemy reached the leftmost position if (currentPosition.x <= enemy_model->left_most_position.x) { - // Set movement direction to DOWN and update reference position enemy_model->setMovementDirection(MovementDirection::DOWN); enemy_model->setReferencePosition(currentPosition); } else { - // Update the enemy position enemy_model->setEnemyPosition(currentPosition); } } void ZapperController::moveRight() { - // Get the current position of the enemy sf::Vector2f currentPosition = enemy_model->getEnemyPosition(); + currentPosition.x += horizontal_movement_speed * ServiceLocator::getInstance()->getTimeService()->getDeltaTime(); - // Update the position to move right - currentPosition.x += enemy_model->enemy_movement_speed * ServiceLocator::getInstance()->getTimeService()->getDeltaTime(); - - // Check if the enemy reached the rightmost position if (currentPosition.x >= enemy_model->right_most_position.x) { - // Set movement direction to DOWN and update reference position enemy_model->setMovementDirection(MovementDirection::DOWN); enemy_model->setReferencePosition(currentPosition); } else { - // Update the enemy position enemy_model->setEnemyPosition(currentPosition); } } void ZapperController::moveDown() { - // Get the current position of the enemy sf::Vector2f currentPosition = enemy_model->getEnemyPosition(); + currentPosition.y += horizontal_movement_speed * ServiceLocator::getInstance()->getTimeService()->getDeltaTime(); - // Update the position to move down - currentPosition.y += enemy_model->enemy_movement_speed * ServiceLocator::getInstance()->getTimeService()->getDeltaTime(); - - // Check if the enemy reached the reference position plus vertical travel distance if (currentPosition.y >= enemy_model->getReferencePosition().y + vertical_travel_distance) { - // Check if the enemy reference position is on the left side if (enemy_model->getReferencePosition().x <= enemy_model->left_most_position.x) { - // Set movement direction to RIGHT enemy_model->setMovementDirection(MovementDirection::RIGHT); } else { - // Set movement direction to LEFT enemy_model->setMovementDirection(MovementDirection::LEFT); } } else { - // Update the enemy position enemy_model->setEnemyPosition(currentPosition); } } diff --git a/Space-Invaders/Source/Enemy/EnemyController.cpp b/Space-Invaders/Source/Enemy/EnemyController.cpp index c9bba5a4c..8f4fb0387 100644 --- a/Space-Invaders/Source/Enemy/EnemyController.cpp +++ b/Space-Invaders/Source/Enemy/EnemyController.cpp @@ -1,20 +1,17 @@ -#include "../../header/Enemy/EnemyController.h" -#include "../../header/Enemy/EnemyView.h" -#include "../../header/Enemy/EnemyModel.h" -#include "../../header/Enemy/EnemyConfig.h" -#include "../../header/Global/ServiceLocator.h" -#include "../../header/Event/EventService.h" -#include "../../header/Bullet/BulletConfig.h" -#include "../../header/Entity/EntityConfig.h" -#include "../../header/Bullet/BulletController.h" -#include "../../header/Player/PlayerController.h" -#include "../../header/Sound/SoundService.h" +#include "../../Header/Enemy/EnemyController.h" +#include "../../Header/Enemy/EnemyView.h" +#include "../../Header/Enemy/EnemyModel.h" +#include "../../Header/Enemy/EnemyConfig.h" +#include "../../Header/Global/ServiceLocator.h" +#include "../../Header/Bullet/BulletConfig.h" +#include "../../Header/Entity/EntityConfig.h" +#include "../../Header/Bullet/BulletController.h" +#include "../../Header/Player/PlayerController.h" +#include "../../Header/Sound/SoundService.h" namespace Enemy { using namespace Global; - using namespace Event; - using namespace Time; using namespace Bullet; using namespace Collision; using namespace Entity; @@ -43,10 +40,9 @@ namespace Enemy void EnemyController::update() { move(); - updateFireTimer(); //new - processBulletFire(); //new + updateFireTimer(); + processBulletFire(); enemy_view->update(); - handleOutOfBounds(); } void EnemyController::render() @@ -54,24 +50,6 @@ namespace Enemy enemy_view->render(); } - /*void EnemyController::move() - { - switch (enemy_model->getMovementDirection()) - { - case::Enemy::MovementDirection::LEFT: - moveLeft(); - break; - - case::Enemy::MovementDirection::RIGHT: - moveRight(); - break; - - case::Enemy::MovementDirection::DOWN: - moveDown(); - break; - } - }*/ - void EnemyController::updateFireTimer() { elapsed_fire_duration += ServiceLocator::getInstance()->getTimeService()->getDeltaTime(); //update the elapsed duration @@ -146,6 +124,11 @@ namespace Enemy void EnemyController::destroy() { + ServiceLocator::getInstance()->getAnimationService()->spawnAnimationSystem(enemy_model->getEnemyPosition(), + Animation::AnimationType::EXPLOSION); + + ServiceLocator::getInstance()->getSoundService()->playSound(SoundType::EXPLOSION); + ServiceLocator::getInstance()->getPlayerService()->increaseEnemiesKilled(1); ServiceLocator::getInstance()->getEnemyService()->destroyEnemy(this); } diff --git a/Space-Invaders/Source/Enemy/EnemyView.cpp b/Space-Invaders/Source/Enemy/EnemyView.cpp index 2ef883621..9965adcab 100644 --- a/Space-Invaders/Source/Enemy/EnemyView.cpp +++ b/Space-Invaders/Source/Enemy/EnemyView.cpp @@ -1,9 +1,9 @@ #include "../../Header/Enemy/EnemyView.h" #include "../../Header/Global/ServiceLocator.h" +#include "../../Header/Global/Config.h" #include "../../Header/Graphic/GraphicService.h" #include "../../Header/Enemy/EnemyController.h" #include"../../Header/Enemy/EnemyConfig.h" -#include "../../Header/Global/Config.h" namespace Enemy { @@ -15,11 +15,6 @@ namespace Enemy EnemyView::~EnemyView() { destroy(); } - const sf::Sprite& EnemyView::getEnemySprite() - { - return enemy_image->getSprite(); - } - void EnemyView::initialize(EnemyController* controller) { enemy_controller = controller; @@ -36,6 +31,22 @@ namespace Enemy enemy_image->initialize(getEnemyTexturePath(), enemy_sprite_width, enemy_sprite_height, enemy_controller->getEnemyPosition()); } + void EnemyView::update() + { + enemy_image->setPosition(enemy_controller->getEnemyPosition()); + enemy_image->update(); + } + + void EnemyView::render() + { + enemy_image->render(); + } + + const sf::Sprite& EnemyView::getEnemySprite() + { + return enemy_image->getSprite(); + } + sf::String EnemyView::getEnemyTexturePath() { switch (enemy_controller->getEnemyType()) @@ -54,16 +65,6 @@ namespace Enemy } } - void EnemyView::update() - { - enemy_image->setPosition(enemy_controller->getEnemyPosition()); - } - - void EnemyView::render() - { - enemy_image->render(); - } - void EnemyView::destroy() { delete (enemy_image); diff --git a/Space-Invaders/Source/Event/EventService.cpp b/Space-Invaders/Source/Event/EventService.cpp index cd456eff0..ebeb4e732 100644 --- a/Space-Invaders/Source/Event/EventService.cpp +++ b/Space-Invaders/Source/Event/EventService.cpp @@ -1,17 +1,15 @@ #include "../../Header/Event/EventService.h" -#include "../../Header/Main/GameService.h" #include "../../Header/Graphic/GraphicService.h" #include "../../Header/Global/ServiceLocator.h" namespace Event { + using namespace Global; EventService::EventService() { game_window = nullptr; } EventService::~EventService() = default; //calls the default destructor - using namespace Global; - void EventService::initialize() { game_window = ServiceLocator::getInstance()->getGraphicService()->getGameWindow(); @@ -102,17 +100,4 @@ namespace Event bool EventService::pressedLeftMouseButton() { return left_mouse_button_state == ButtonState::PRESSED; } bool EventService::pressedRightMouseButton() { return right_mouse_button_state == ButtonState::PRESSED; } - - /*bool EventService::pressedLeftKey() { return game_event.key.code == sf::Keyboard::Left; } - bool EventService::pressedRightKey() { return game_event.key.code == sf::Keyboard::Right; } - bool EventService::pressedLeftMouseButton() - { - // check if a mouse button was pressed and which mouse button it was - return game_event.type == sf::Event::MouseButtonPressed && game_event.mouseButton.button == sf::Mouse::Left; - } - - bool EventService::pressedRightMouseButton() - { - return game_event.type == sf::Event::MouseButtonPressed && game_event.mouseButton.button == sf::Mouse::Right; - }*/ } \ No newline at end of file diff --git a/Space-Invaders/Source/Gameplay/GameplayView.cpp b/Space-Invaders/Source/Gameplay/GameplayView.cpp index 699e87969..91b223283 100644 --- a/Space-Invaders/Source/Gameplay/GameplayView.cpp +++ b/Space-Invaders/Source/Gameplay/GameplayView.cpp @@ -1,12 +1,11 @@ #include "../../header/Gameplay/GameplayView.h" #include "../../header/Global/ServiceLocator.h" -#include "../../header/Graphic/GraphicService.h" #include "../../Header/Global/Config.h" +#include "../../header/Graphic/GraphicService.h" namespace Gameplay { using namespace Global; - using namespace Graphics; using namespace UI::UIElement; GameplayView::GameplayView() { background_image = new ImageView(); } diff --git a/Space-Invaders/Source/Global/Config.cpp b/Space-Invaders/Source/Global/Config.cpp index bc8151e53..9fd478e69 100644 --- a/Space-Invaders/Source/Global/Config.cpp +++ b/Space-Invaders/Source/Global/Config.cpp @@ -19,6 +19,7 @@ namespace Global const sf::String Config::bunker_texture_path = "assets/textures/bunker.png"; + const sf::String Config::explosion_texture_path = "assets/textures/explosion.png"; const sf::String Config::shield_texture_path = "assets/textures/shield.png"; @@ -53,4 +54,10 @@ namespace Global const sf::String Config::background_music_path = "assets/sounds/background_music.mp3"; const sf::String Config::button_click_sound_path = "assets/sounds/button_click_sound.wav"; + + const sf::String Config::bullet_fire_sound_path = "assets/sounds/bullet_fire.ogg"; + + const sf::String Config::powerup_enabled_sound_path = "assets/sounds/powerup_enabled.ogg"; + + const sf::String Config::powerup_disabled_sound_path = "assets/sounds/powerup_disabled.ogg"; } \ No newline at end of file diff --git a/Space-Invaders/Source/Global/ServiceLocator.cpp b/Space-Invaders/Source/Global/ServiceLocator.cpp index e57f7f00e..0d42f9936 100644 --- a/Space-Invaders/Source/Global/ServiceLocator.cpp +++ b/Space-Invaders/Source/Global/ServiceLocator.cpp @@ -16,6 +16,7 @@ namespace Global using namespace Bullet; using namespace Powerup; using namespace Collision; + using namespace Animation; ServiceLocator::ServiceLocator() @@ -32,6 +33,7 @@ namespace Global bullet_service = nullptr; powerup_service = nullptr; collision_service = nullptr; + animation_service = nullptr; createServices(); } ServiceLocator::~ServiceLocator() @@ -53,6 +55,7 @@ namespace Global bullet_service = new BulletService(); powerup_service = new PowerupService(); collision_service = new CollisionService(); + animation_service = new AnimationService(); } void ServiceLocator::clearAllServices() @@ -69,6 +72,7 @@ namespace Global delete(bullet_service); delete(powerup_service); delete(collision_service); + delete(animation_service); } ServiceLocator* ServiceLocator::getInstance() @@ -91,6 +95,7 @@ namespace Global bullet_service->initialize(); powerup_service->initialize(); collision_service->initialize(); + animation_service->initialize(); } void ServiceLocator::update() @@ -104,10 +109,11 @@ namespace Global gameplay_service->update(); player_service->update(); enemy_service->update(); + element_service->update(); bullet_service->update(); powerup_service->update(); collision_service->update(); - element_service->update(); + animation_service->update(); } ui_service->update(); @@ -122,9 +128,10 @@ namespace Global gameplay_service->render(); player_service->render(); enemy_service->render(); + element_service->render(); bullet_service->render(); powerup_service->render(); - element_service->render(); + animation_service->render(); } ui_service->render(); @@ -144,6 +151,7 @@ namespace Global BulletService* ServiceLocator::getBulletService() { return bullet_service; } PowerupService* ServiceLocator::getPowerupService() { return powerup_service; } CollisionService* ServiceLocator::getCollisionService(){return collision_service;} + AnimationService* ServiceLocator::getAnimationService() { return animation_service; } void ServiceLocator::deleteServiceLocator() { diff --git a/Space-Invaders/Source/Graphic/GraphicService.cpp b/Space-Invaders/Source/Graphic/GraphicService.cpp index 98ab5cc20..968903a7c 100644 --- a/Space-Invaders/Source/Graphic/GraphicService.cpp +++ b/Space-Invaders/Source/Graphic/GraphicService.cpp @@ -2,26 +2,22 @@ namespace Graphics { - // Constructor: Initializes game window and video mode pointers to null. GraphicService::GraphicService() { - game_window = nullptr; // Initializes game window pointer to null - video_mode = nullptr; // Initializes video mode pointer to null + game_window = nullptr; + video_mode = nullptr; } - // Destructor: Cleans up resources by calling onDestroy. GraphicService::~GraphicService() { - onDestroy(); // Calls onDestroy method to clean up resources + onDestroy(); } - // Initializes the graphic service by creating a new game window. void GraphicService::initialize() { - game_window = createGameWindow(); // Assigns a new game window - game_window->setFramerateLimit(frame_rate); // setting a frame rate limit + game_window = createGameWindow(); + setFrameRate(frame_rate); } - // Creates a new SFML RenderWindow object with specified video mode and title. sf::RenderWindow* GraphicService::createGameWindow() { - setVideoMode(); // Sets up the video mode for the window + setVideoMode(); return new sf::RenderWindow(*video_mode, game_window_title, sf::Style::Fullscreen); // Creates and returns a new RenderWindow object } @@ -30,29 +26,28 @@ namespace Graphics video_mode = new sf::VideoMode(game_window_width, game_window_height, sf::VideoMode::getDesktopMode().bitsPerPixel); // Allocates and sets the video mode } - // Cleans up allocated memory for video mode and game window to avoid memory leaks. void GraphicService::onDestroy() { - delete(video_mode); // Deletes the video mode object - delete(game_window); // Deletes the game window object + delete(video_mode); + delete(game_window); } - // Placeholder function for game update logic. + void GraphicService::setFrameRate(int frame_rate_to_set) + { + game_window->setFramerateLimit(frame_rate_to_set); + } + void GraphicService::update() { } - // Placeholder function for game rendering logic. void GraphicService::render() { } - // Checks if the game window is currently open. bool GraphicService::isGameWindowOpen() { - return game_window->isOpen(); // Returns the open status of the game window + return game_window->isOpen(); } - // Returns a pointer to the game window object. sf::RenderWindow* GraphicService::getGameWindow() { return game_window; } - // Returns the configured window background color. sf::Color GraphicService::getWindowColor() { return window_color; } diff --git a/Space-Invaders/Source/Main/GameService.cpp b/Space-Invaders/Source/Main/GameService.cpp index 9456a7890..8b9766a03 100644 --- a/Space-Invaders/Source/Main/GameService.cpp +++ b/Space-Invaders/Source/Main/GameService.cpp @@ -1,6 +1,5 @@ #include "../../Header/Main/GameService.h" #include "../../Header/Graphic/GraphicService.h" -#include "../../Header/Global/ServiceLocator.h" #include "../../header/Event/EventService.h" #include "../../header/UI/UIService.h" @@ -38,11 +37,6 @@ namespace Main game_window = service_locator->getGraphicService()->getGameWindow(); //set game window (it was null before this) } - void GameService::showMainMenu() - { - setGameState(GameState::MAIN_MENU); - } - void GameService::showSplashScreen() { setGameState(GameState::SPLASH_SCREEN); @@ -57,7 +51,7 @@ namespace Main void GameService::render() { - game_window->clear(service_locator->getGraphicService()->getWindowColor()); + game_window->clear(); service_locator->render(); game_window->display(); } @@ -71,7 +65,7 @@ namespace Main GameState GameService::getGameState() { return current_state; } - void GameService::destroy() { service_locator->deleteServiceLocator(); } + void GameService::destroy() { } } diff --git a/Space-Invaders/Source/Player/PlayerController.cpp b/Space-Invaders/Source/Player/PlayerController.cpp index 707cb7bbf..f1ec41684 100644 --- a/Space-Invaders/Source/Player/PlayerController.cpp +++ b/Space-Invaders/Source/Player/PlayerController.cpp @@ -8,17 +8,20 @@ #include "../../Header/Bullet/BulletController.h" #include "../../Header/Enemy/EnemyController.h" #include "../../Header/Powerups/PowerupController.h" -#include +#include "../../header/Sound/SoundService.h" +#include "../../header/Main/GameService.h" namespace Player { using namespace Global; using namespace Event; - using namespace Time; using namespace Bullet; using namespace Entity; using namespace Enemy; using namespace Powerup; + using namespace Sound; + using namespace Main; + using namespace Gameplay; PlayerController::PlayerController() { @@ -71,11 +74,6 @@ namespace Player return player_model->getPlayerPosition(); } - int PlayerController::getPlayerScore() - { - return player_model->getPlayerScore(); - } - PlayerState PlayerController::getPlayerState() { return player_model->getPlayerState(); @@ -117,13 +115,11 @@ namespace Player { if (bullet_controller->getBulletType() == BulletType::FROST_BULLET) { - player_model->setPlayerState(PlayerState::FROZEN); - player_model->elapsed_freeze_duration = player_model->freeze_duration; + freezePlayer(); } - else ServiceLocator::getInstance()->getGameplayService()->restart(); + else decreasePlayerLive(); return true; } - return false; } @@ -135,7 +131,7 @@ namespace Player EnemyController* enemy_controller = dynamic_cast(other_collider); if (enemy_controller) { - ServiceLocator::getInstance()->getGameplayService()->restart(); + decreasePlayerLive(); return true; } return false; @@ -153,61 +149,69 @@ namespace Player void PlayerController::updatePowerupDuration() { - if (player_model->elapsed_shield_duration > 0) + if (elapsed_shield_duration > 0) { - player_model->elapsed_shield_duration -= ServiceLocator::getInstance()->getTimeService()->getDeltaTime(); + elapsed_shield_duration -= ServiceLocator::getInstance()->getTimeService()->getDeltaTime(); - if (player_model->elapsed_shield_duration <= 0) + if (elapsed_shield_duration <= 0) disableShield(); } - if (player_model->elapsed_rapid_fire_duration > 0) + if (elapsed_rapid_fire_duration > 0) { - player_model->elapsed_rapid_fire_duration -= ServiceLocator::getInstance()->getTimeService()->getDeltaTime(); + elapsed_rapid_fire_duration -= ServiceLocator::getInstance()->getTimeService()->getDeltaTime(); - if (player_model->elapsed_rapid_fire_duration <= 0) + if (elapsed_rapid_fire_duration <= 0) disableRapidFire(); } - if (player_model->elapsed_tripple_laser_duration > 0) + if (elapsed_tripple_laser_duration > 0) { - player_model->elapsed_tripple_laser_duration -= ServiceLocator::getInstance()->getTimeService()->getDeltaTime(); + elapsed_tripple_laser_duration -= ServiceLocator::getInstance()->getTimeService()->getDeltaTime(); - if (player_model->elapsed_tripple_laser_duration <= 0) + if (elapsed_tripple_laser_duration <= 0) disableTrippleLaser(); } } void PlayerController::enableShield() { - player_model->elapsed_shield_duration = player_model->shiled_powerup_duration; + ServiceLocator::getInstance()->getSoundService()->playSound(SoundType::POWERUP_ENABLED); + elapsed_shield_duration = player_model->shiled_powerup_duration; player_model->setShieldState(true); + player_view->setPlayerHighlight(true); } void PlayerController::disableShield() { + ServiceLocator::getInstance()->getSoundService()->playSound(SoundType::POWERUP_DISABLED); player_model->setShieldState(false); + player_view->setPlayerHighlight(false); } void PlayerController::enableRapidFire() { - player_model->elapsed_rapid_fire_duration = player_model->rapid_fire_powerup_duration; + ServiceLocator::getInstance()->getSoundService()->playSound(SoundType::POWERUP_ENABLED); + elapsed_rapid_fire_duration = player_model->rapid_fire_powerup_duration; player_model->setRapidFireState(true); } void PlayerController::disableRapidFire() { + ServiceLocator::getInstance()->getSoundService()->playSound(SoundType::POWERUP_DISABLED); player_model->setRapidFireState(false); } void PlayerController::enableTrippleLaser() { - player_model->elapsed_tripple_laser_duration = player_model->tripple_laser_powerup_duration; + ServiceLocator::getInstance()->getSoundService()->playSound(SoundType::POWERUP_ENABLED); + elapsed_tripple_laser_duration = player_model->tripple_laser_powerup_duration; player_model->setTrippleFireState(true); } void PlayerController::disableTrippleLaser() { + ServiceLocator::getInstance()->getSoundService()->playSound(SoundType::POWERUP_DISABLED); player_model->setTrippleFireState(false); } @@ -228,7 +232,7 @@ namespace Player if (event_service->pressedLeftMouseButton()) { - fireBullet(); + processBulletFire(); } } @@ -252,33 +256,36 @@ namespace Player void PlayerController::updateFireDuration() { - if (player_model->elapsed_fire_duration >= 0) + if (elapsed_fire_duration >= 0) { - player_model->elapsed_fire_duration -= ServiceLocator::getInstance()->getTimeService()->getDeltaTime(); + elapsed_fire_duration -= ServiceLocator::getInstance()->getTimeService()->getDeltaTime(); } } void PlayerController::updateFreezeDuration() { - if (player_model->elapsed_freeze_duration > 0) + if (elapsed_freeze_duration >= 0) { - player_model->elapsed_fire_duration -= ServiceLocator::getInstance()->getTimeService()->getDeltaTime(); + elapsed_freeze_duration -= ServiceLocator::getInstance()->getTimeService()->getDeltaTime(); - if (player_model->elapsed_freeze_duration <= 0) + if (elapsed_freeze_duration <= 0) + { player_model->setPlayerState(PlayerState::ALIVE); + player_view->setPlayerHighlight(false); + } } } void PlayerController::freezePlayer() { player_model->setPlayerState(PlayerState::FROZEN); - elapsed_freez_duration = player_model->freeze_duration; - //player_view->setPlayerHighlight(true); - to be added + elapsed_freeze_duration = player_model->freeze_duration; + player_view->setPlayerHighlight(true); } void PlayerController::processBulletFire() { - if (player_model->elapsed_fire_duration > 0) return; + if (elapsed_fire_duration > 0) return; if (player_model->isTrippleLaserEnabled()) fireBullet(true); @@ -286,9 +293,9 @@ namespace Player else fireBullet(); if (player_model->isRapidFireEnabled()) - player_model->elapsed_fire_duration = player_model->rapid_fire_cooldown_duration; + elapsed_fire_duration = player_model->rapid_fire_cooldown_duration; - else player_model->elapsed_fire_duration = player_model->fire_cooldown_duration; + else elapsed_fire_duration = player_model->fire_cooldown_duration; } void PlayerController::fireBullet(bool b_tripple_laser) @@ -301,10 +308,12 @@ namespace Player fireBullet(bullet_position + player_model->second_weapon_position_offset); fireBullet(bullet_position + player_model->third_weapon_position_offset); } + ServiceLocator::getInstance()->getSoundService()->playSound(SoundType::BULLET_FIRE); } void PlayerController::fireBullet(sf::Vector2f position) { + increaseBulletsFired(1); ServiceLocator::getInstance()->getBulletService()->spawnBullet(BulletType::LASER_BULLET, position, Bullet::MovementDirection::UP, player_model->getEntityType()); } diff --git a/Space-Invaders/Source/Player/PlayerModel.cpp b/Space-Invaders/Source/Player/PlayerModel.cpp index ac56e089e..a4b36ba13 100644 --- a/Space-Invaders/Source/Player/PlayerModel.cpp +++ b/Space-Invaders/Source/Player/PlayerModel.cpp @@ -4,6 +4,7 @@ namespace Player { int PlayerModel::player_lives; int PlayerModel::enemies_killed; + int PlayerModel::bullets_fired; PlayerModel::PlayerModel() { entity_type = Entity::EntityType::PLAYER; } @@ -17,7 +18,9 @@ namespace Player player_position = initial_player_position; //lives set to max of 3 at restart player_lives = max_player_lives; + enemies_killed = 0; + bullets_fired = 0; //powerups b_shield = false; b_rapid_fire = false; @@ -34,16 +37,6 @@ namespace Player player_position = position; } - int PlayerModel::getPlayerScore() - { - return player_score; - } - - void PlayerModel::setPlayerScore(int score) - { - player_score = score; - } - PlayerState PlayerModel::getPlayerState() { return player_state; diff --git a/Space-Invaders/Source/Player/PlayerService.cpp b/Space-Invaders/Source/Player/PlayerService.cpp index 8e4ecffeb..f7cb67877 100644 --- a/Space-Invaders/Source/Player/PlayerService.cpp +++ b/Space-Invaders/Source/Player/PlayerService.cpp @@ -1,8 +1,13 @@ #include "../../Header/Player/PlayerService.h" #include "../../Header/Player/PlayerController.h" +#include "../../header/Global/ServiceLocator.h" +#include "../../header/Collision/ICollider.h" namespace Player { + using namespace Global; + using namespace Collision; + PlayerService::PlayerService() { player_controller = new PlayerController(); @@ -10,12 +15,14 @@ namespace Player PlayerService::~PlayerService() { + ServiceLocator::getInstance()->getCollisionService()->removeCollider(dynamic_cast(player_controller)); delete (player_controller); } void PlayerService::initialize() { player_controller->initialize(); + ServiceLocator::getInstance()->getCollisionService()->addCollider(dynamic_cast(player_controller)); } void PlayerService::update() diff --git a/Space-Invaders/Source/Player/PlayerView.cpp b/Space-Invaders/Source/Player/PlayerView.cpp index badc71c47..0e38b71f2 100644 --- a/Space-Invaders/Source/Player/PlayerView.cpp +++ b/Space-Invaders/Source/Player/PlayerView.cpp @@ -3,6 +3,7 @@ #include "../../Header/Global/Config.h" #include "../../Header/Graphic/GraphicService.h" #include "../../Header/Player/PlayerController.h" +#include "../../header/Player/PlayerModel.h" namespace Player { @@ -45,6 +46,12 @@ namespace Player return player_image->getSprite(); } + void PlayerView::setPlayerHighlight(bool b_highlight) + { + if (b_highlight) player_image->setImageAlpha(PlayerModel::invincible_player_alpha); + else player_image->setImageAlpha(255); + } + void PlayerView::destroy() { delete(player_image); diff --git a/Space-Invaders/Source/Sound/SoundService.cpp b/Space-Invaders/Source/Sound/SoundService.cpp index 2db4a00bd..f0cad0e9e 100644 --- a/Space-Invaders/Source/Sound/SoundService.cpp +++ b/Space-Invaders/Source/Sound/SoundService.cpp @@ -22,9 +22,13 @@ namespace Sound void SoundService::loadSoundFromFile() { if (!buffer_button_click.loadFromFile(Config::button_click_sound_path)) - { printf("Error loading background music file"); - } + if (!buffer_bullet_fire.loadFromFile(Config::bullet_fire_sound_path)) + printf("Error loading background music file"); + if (!buffer_powerup_enabled.loadFromFile(Config::powerup_enabled_sound_path)) + printf("Error loading background music file"); + if (!buffer_powerup_disabled.loadFromFile(Config::powerup_disabled_sound_path)) + printf("Error loading background music file"); } void SoundService::playSound(SoundType soundType) @@ -33,12 +37,33 @@ namespace Sound { case SoundType::BUTTON_CLICK: sound_effect.setBuffer(buffer_button_click); + sound_effect.play(); + break; + + case SoundType::BULLET_FIRE: + sound_effect.setBuffer(buffer_bullet_fire); + sound_effect.play(); break; + + case SoundType::EXPLOSION: + explosion_sound_effect.setBuffer(buffer_explosion); + explosion_sound_effect.play(); + break; + + case SoundType::POWERUP_ENABLED: + powerup_sound_effect.setBuffer(buffer_powerup_enabled); + powerup_sound_effect.play(); + break; + + case SoundType::POWERUP_DISABLED: + powerup_sound_effect.setBuffer(buffer_powerup_disabled); + powerup_sound_effect.play(); + break; + default: printf("Invalid sound type"); return; } - sound_effect.play(); } void SoundService::playBackgroundMusic() diff --git a/Space-Invaders/Source/UI/UIElement/ImageView.cpp b/Space-Invaders/Source/UI/UIElement/ImageView.cpp index 7b4265e7c..1d12cf92d 100644 --- a/Space-Invaders/Source/UI/UIElement/ImageView.cpp +++ b/Space-Invaders/Source/UI/UIElement/ImageView.cpp @@ -77,6 +77,19 @@ namespace UI image_sprite.setPosition(x_position, y_position); } + void ImageView::setTextureRect(sf::IntRect texture_rect) + { + image_sprite.setTextureRect(texture_rect); + } + + void ImageView::setScale(float width, float height, float tile_width, float tile_height) + { + float scale_x = width / tile_width; + float scale_y = height / tile_height; + + image_sprite.setScale(scale_x, scale_y); + } + const sf::Sprite& ImageView::getSprite() { return image_sprite; //returns the sprite.