diff --git a/Array-Jumper/Array-Jumper.vcxproj b/Array-Jumper/Array-Jumper.vcxproj index 658ea835..94ac22e5 100644 --- a/Array-Jumper/Array-Jumper.vcxproj +++ b/Array-Jumper/Array-Jumper.vcxproj @@ -1,4 +1,4 @@ - + @@ -133,14 +133,25 @@ + + + + + + + + + + + @@ -152,12 +163,26 @@ + + + + + + + + + + + + + + @@ -195,6 +220,7 @@ + diff --git a/Array-Jumper/Array-Jumper.vcxproj.filters b/Array-Jumper/Array-Jumper.vcxproj.filters index dff4a580..ad7dad9d 100644 --- a/Array-Jumper/Array-Jumper.vcxproj.filters +++ b/Array-Jumper/Array-Jumper.vcxproj.filters @@ -44,6 +44,14 @@ + + + + + + + + @@ -74,6 +82,16 @@ + + + + + + + + + + @@ -133,6 +151,9 @@ Resource Files + + Resource Files + diff --git a/Array-Jumper/assets/textures/target.png b/Array-Jumper/assets/textures/target.png new file mode 100644 index 00000000..824fb35a Binary files /dev/null and b/Array-Jumper/assets/textures/target.png differ diff --git a/Array-Jumper/header/Event/EventService.h b/Array-Jumper/header/Event/EventService.h index ffee9985..fb465186 100644 --- a/Array-Jumper/header/Event/EventService.h +++ b/Array-Jumper/header/Event/EventService.h @@ -23,6 +23,7 @@ namespace Event ButtonState right_arrow_button_state; ButtonState A_button_state; ButtonState D_button_state; + ButtonState Space_buttonPressed; bool isGameWindowOpen(); bool gameWindowWasClosed(); @@ -46,5 +47,6 @@ namespace Event bool pressedDKey(); bool pressedLeftMouseButton(); bool pressedRightMouseButton(); + bool heldSpaceKey(); }; } \ No newline at end of file diff --git a/Array-Jumper/header/Gameplay/GameplayController.h b/Array-Jumper/header/Gameplay/GameplayController.h new file mode 100644 index 00000000..00588454 --- /dev/null +++ b/Array-Jumper/header/Gameplay/GameplayController.h @@ -0,0 +1,27 @@ +#pragma once +#include "../../header/Level/BlockType.h" + +namespace Gameplay +{ + class GameplayController + { + private: + + bool isObstacle(Level:: BlockType value); + bool isEndBlock(Level::BlockType value); + void processObstacle(); + void processEndBlock(); + + void gameOver(); + + public: + + void intialize(); + void update(); + void render(); + + void onPositionChanged(int position); + void onDeath(); + }; +} + diff --git a/Array-Jumper/header/Gameplay/GameplayService.h b/Array-Jumper/header/Gameplay/GameplayService.h new file mode 100644 index 00000000..c2cb29c1 --- /dev/null +++ b/Array-Jumper/header/Gameplay/GameplayService.h @@ -0,0 +1,25 @@ +#pragma once +#include "GameplayController.h" + +namespace Gameplay +{ + class GameplayService + { + private: + GameplayController* gameplay_controller; + + void destroy(); + + public: + GameplayService(); + ~GameplayService(); + + void intialize(); + void update(); + void render(); + + void onPositionChanged(int position); + void onDeath(); + }; +} + diff --git a/Array-Jumper/header/Global/Config.h b/Array-Jumper/header/Global/Config.h index 75d06e16..0e56957d 100644 --- a/Array-Jumper/header/Global/Config.h +++ b/Array-Jumper/header/Global/Config.h @@ -9,6 +9,7 @@ namespace Global // Textures static const sf::String array_jumper_bg_texture_path; static const sf::String box_texture_path; + static const sf::String target_texture_path; static const sf::String character_texture_path; static const sf::String instructions_button_texture_path; static const sf::String letter_one_texture_path; diff --git a/Array-Jumper/header/Global/ServiceLocator.h b/Array-Jumper/header/Global/ServiceLocator.h index 7e9ef35a..1e20d128 100644 --- a/Array-Jumper/header/Global/ServiceLocator.h +++ b/Array-Jumper/header/Global/ServiceLocator.h @@ -3,6 +3,9 @@ #include "../../header/Event/EventService.h" #include "../../header/UI/UIService.h" #include "../../header/Sound/SoundService.h" +#include "../../header/Player/PlayerService.h" +#include "../../header/Level/LevelService.h" +#include "../../header/Gameplay/GameplayService.h" namespace Global { @@ -13,6 +16,9 @@ namespace Global Event::EventService* event_service; Sound::SoundService* sound_service; UI::UIService* ui_service; + Player::PlayerService* player_service; + Level::LevelService* level_service; + Gameplay::GameplayService* gameplay_service; ~ServiceLocator(); @@ -31,5 +37,8 @@ namespace Global Event::EventService* getEventService(); Sound::SoundService* getSoundService(); UI::UIService* getUIService(); + Player::PlayerService* getPlayerService(); + Level::LevelService* getLevelService(); + Gameplay::GameplayService* getGameplayService(); }; } \ No newline at end of file diff --git a/Array-Jumper/header/Level/BlockType.h b/Array-Jumper/header/Level/BlockType.h new file mode 100644 index 00000000..cfcc2b0a --- /dev/null +++ b/Array-Jumper/header/Level/BlockType.h @@ -0,0 +1,20 @@ +#pragma once + +// Each level should be represented as a array of integers + // -1 : Obstacle 1 + // -2 : Obstacle 2 + // 0 : End block + // 1,2,3 : Numbers + +namespace Level +{ + enum BlockType + { + OBSTACLE_ONE = -1, + OBSTACLE_TWO = -2, + TARGET = 0, + ONE = 1, + TWO = 2, + THREE = 3, + }; +} diff --git a/Array-Jumper/header/Level/LevelController.h b/Array-Jumper/header/Level/LevelController.h new file mode 100644 index 00000000..ff5d7775 --- /dev/null +++ b/Array-Jumper/header/Level/LevelController.h @@ -0,0 +1,27 @@ +#pragma once +#include "LevelModel.h" + +namespace Level +{ + class LevelView; + class LevelModel; + + class LevelController + { + private: + LevelView* level_view; + LevelModel* level_model; + + public: + LevelController(); + ~LevelController(); + + void initialize(); + void update(); + void render(); + + BoxDimensions getBoxDimensions(); + BlockType getCurrentBoxValue(int currentPosition); + }; +} + diff --git a/Array-Jumper/header/Level/LevelData.h b/Array-Jumper/header/Level/LevelData.h new file mode 100644 index 00000000..db757f43 --- /dev/null +++ b/Array-Jumper/header/Level/LevelData.h @@ -0,0 +1,23 @@ +#pragma once +#include "BlockType.h" + +namespace Level +{ + + struct LevelData + { + static const int NUMBER_OF_BOXES = 10; + + BlockType level_boxes[NUMBER_OF_BOXES] = { + BlockType::ONE, + BlockType::TWO, + BlockType::OBSTACLE_ONE, + BlockType::TWO, + BlockType::THREE, + BlockType::ONE, + BlockType::OBSTACLE_TWO, + BlockType::TWO, + BlockType::ONE, + BlockType::TARGET}; + }; +} \ No newline at end of file diff --git a/Array-Jumper/header/Level/LevelModel.h b/Array-Jumper/header/Level/LevelModel.h new file mode 100644 index 00000000..6962cb4e --- /dev/null +++ b/Array-Jumper/header/Level/LevelModel.h @@ -0,0 +1,30 @@ +#pragma once +#include "LevelData.h" + +namespace Level +{ + + struct BoxDimensions + { + float box_width; + float box_height; + float box_spacing; + + float box_spacing_percentage = 0.3f; + float bottom_offset = 200.f; + }; + + + class LevelModel + { + private: + LevelData current_level_data; + + public: + LevelModel(); + ~LevelModel(); + + BlockType getCurrentBoxValue(int currentPosition); + }; +} + diff --git a/Array-Jumper/header/Level/LevelService.h b/Array-Jumper/header/Level/LevelService.h new file mode 100644 index 00000000..d6911169 --- /dev/null +++ b/Array-Jumper/header/Level/LevelService.h @@ -0,0 +1,28 @@ +#pragma once +#include "BlockType.h" + + +namespace Level +{ + class LevelController; + struct BoxDimensions; + + class LevelService + { + private: + LevelController* level_controller; + + void destroy(); + public: + LevelService(); + ~LevelService(); + + void intialize(); + void update(); + void render(); + + BoxDimensions getBoxDimensions(); + BlockType getCurrentBoxValue(int currentPosition); + }; +} + diff --git a/Array-Jumper/header/Level/LevelView.h b/Array-Jumper/header/Level/LevelView.h new file mode 100644 index 00000000..6eb1667a --- /dev/null +++ b/Array-Jumper/header/Level/LevelView.h @@ -0,0 +1,53 @@ +#pragma once +#include "LevelModel.h" +#include "LevelController.h" +#include "../../header/UI/UIElement/ImageView.h" + +namespace Level +{ + class LevelView + { + private: + + sf::RenderWindow* game_window; + LevelController* level_controller; + + UI::UIElement::ImageView* background_image; + const float background_alpha = 110.f; + + UI::UIElement::ImageView* box_image; + UI::UIElement::ImageView* target_overlay_image; + UI::UIElement::ImageView* letter_one_overlay_image; + UI::UIElement::ImageView* letter_two_overlay_image; + UI::UIElement::ImageView* letter_three_overlay_image; + UI::UIElement::ImageView* obstacle_one_overlay_image; + UI::UIElement::ImageView* obstacle_two_overlay_image; + + BoxDimensions box_dimensions; + + void createImages(); + void initializeImages(); + void updateImages(); + void drawLevel(); + void drawBox(sf::Vector2f position); + void drawBoxValue(sf::Vector2f position, BlockType box_value); + void deleteImages(); + + void calculateBoxDimensions(); + sf::Vector2f calculateBoxPosition(int index); + void calculateBoxWidthHeight(); + void calculateBoxSpacing(); + UI::UIElement::ImageView* getBoxOverlayImage(BlockType block_type); + public: + LevelView(LevelController* controller); + ~LevelView(); + + void initialize(); + void update(); + void render(); + + BoxDimensions getBoxDimensions(); + + }; +} + diff --git a/Array-Jumper/header/Player/MovementDirection.h b/Array-Jumper/header/Player/MovementDirection.h new file mode 100644 index 00000000..bf9c78e3 --- /dev/null +++ b/Array-Jumper/header/Player/MovementDirection.h @@ -0,0 +1,7 @@ +#pragma once + +enum MovementDirection +{ + FORWARD, + BACKWARD +}; \ No newline at end of file diff --git a/Array-Jumper/header/Player/PlayerController.h b/Array-Jumper/header/Player/PlayerController.h new file mode 100644 index 00000000..979275ea --- /dev/null +++ b/Array-Jumper/header/Player/PlayerController.h @@ -0,0 +1,44 @@ +#pragma once +#include "../../header/Event/EventService.h" +#include "MovementDirection.h" + +namespace Player +{ + class PlayerView; + class PlayerModel; + enum class PlayerState; + + class PlayerController + { + private: + PlayerModel* player_model; + PlayerView* player_view; + + Event::EventService* event_service; + + void destroy(); + + void readInput(); + void move(MovementDirection direction); + void jump(MovementDirection direction); + bool isPositionInBound(int targetPosition); + void onDeath(); + + public: + PlayerController(); + ~PlayerController(); + + void initialize(); + void update(); + void render(); + + PlayerState getPlayerState(); + void setPlayerState(PlayerState new_player_state); + + int getCurrentPosition(); + int getCurrentLives(); + + void resetPlayer(); + void takeDamage(); + }; +} diff --git a/Array-Jumper/header/Player/PlayerModel.h b/Array-Jumper/header/Player/PlayerModel.h new file mode 100644 index 00000000..e5e4a40a --- /dev/null +++ b/Array-Jumper/header/Player/PlayerModel.h @@ -0,0 +1,36 @@ +#pragma once + + +namespace Player +{ + enum class PlayerState + { + ALIVE, + DEAD + }; + + class PlayerModel + { + private: + + const int max_lives = 3; + + PlayerState player_state; + int current_position; + int current_lives; + + public: + + void initialize(); + + PlayerState getPlayerState(); + void setPlayerState(PlayerState new_player_state); + + void resetPlayer(); + void resetPosition(); + int getCurrentPosition(); + void setCurrentPosition(int new_position); + void decreamentLife(); + int getCurrentLives(); + }; +} \ No newline at end of file diff --git a/Array-Jumper/header/Player/PlayerService.h b/Array-Jumper/header/Player/PlayerService.h new file mode 100644 index 00000000..fec24d84 --- /dev/null +++ b/Array-Jumper/header/Player/PlayerService.h @@ -0,0 +1,25 @@ +#pragma once + +namespace Player +{ + class PlayerController; + class PlayerService + { + private: + PlayerController* player_controller; + + void destroy(); + + public: + PlayerService(); + ~PlayerService(); + + void initialize(); + void update(); + void render(); + + int getCurrentLives(); + void takeDamage(); + void levelComplete(); + }; +} \ No newline at end of file diff --git a/Array-Jumper/header/Player/PlayerView.h b/Array-Jumper/header/Player/PlayerView.h new file mode 100644 index 00000000..7e06cb8a --- /dev/null +++ b/Array-Jumper/header/Player/PlayerView.h @@ -0,0 +1,37 @@ +#pragma once +#include "../../header/Level/LevelModel.h" +#include "../../header/UI/UIElement/ImageView.h" + + +namespace Player +{ + class PlayerController; + class PlayerView + { + private: + sf::RenderWindow* game_window; + PlayerController* player_controller; + UI::UIElement::ImageView* player_image; + + float player_height; + float player_width; + Level::BoxDimensions current_box_dimensions; + + void initializePlayerImage(); + void drawPlayer(); + void loadPlayer(); + void CalculatePlayerDimensions(); + void updatePlayerPosition(); + sf::Vector2f calulcatePlayerPosition(); + + public: + PlayerView(PlayerController* controller); + ~PlayerView(); + + void initialize(); + void update(); + void render(); + + }; +} + diff --git a/Array-Jumper/header/UI/Gameplay/GameplayUIController.h b/Array-Jumper/header/UI/Gameplay/GameplayUIController.h new file mode 100644 index 00000000..1fd50f1c --- /dev/null +++ b/Array-Jumper/header/UI/Gameplay/GameplayUIController.h @@ -0,0 +1,37 @@ +#pragma once +#include "../UIElement/TextView.h" + +namespace UI +{ + namespace GameplayUI + { + class GameplayUIController + { + private: + + float font_size = 55; + + const float top_offset = 100.f; + const float left_offset = 100.f; + const float right_offset = 250.f; + + UIElement::TextView* life_count_text; + + void createTexts(); + void initializeTexts(); + void initializeLifeCountText(); + + void updateLifeCountText(); + + void destroy(); + + public: + GameplayUIController(); + ~GameplayUIController(); + + void initialize(); + void update(); + void render(); + }; + } +} \ No newline at end of file diff --git a/Array-Jumper/header/UI/UIService.h b/Array-Jumper/header/UI/UIService.h index 8db7e889..ca1b455d 100644 --- a/Array-Jumper/header/UI/UIService.h +++ b/Array-Jumper/header/UI/UIService.h @@ -5,6 +5,7 @@ #include "../../header/UI/MainMenu/MainMenuUIController.h" #include "../../header/UI/Instructions/InstructionsUIController.h" #include "../../header/UI/Credits/CreditsScreenUIController.h" +#include "../../header/UI/Gameplay/GameplayUIController.h" namespace UI { @@ -16,6 +17,7 @@ namespace UI MainMenu::MainMenuUIController* main_menu_ui_controller; Credits::CreditsScreenUIController* credits_screen_ui_controller; Instructions::InstructionsUIController* instructions_ui_controller; + GameplayUI::GameplayUIController* gameplay_ui_controller; void createControllers(); diff --git a/Array-Jumper/sfml/include/SFML/Config.hpp b/Array-Jumper/sfml/include/SFML/Config.hpp index f4ea4ef3..3093a7a5 100644 --- a/Array-Jumper/sfml/include/SFML/Config.hpp +++ b/Array-Jumper/sfml/include/SFML/Config.hpp @@ -31,7 +31,7 @@ //////////////////////////////////////////////////////////// #define SFML_VERSION_MAJOR 2 #define SFML_VERSION_MINOR 6 -#define SFML_VERSION_PATCH 0 +#define SFML_VERSION_PATCH 1 //////////////////////////////////////////////////////////// diff --git a/Array-Jumper/sfml/lib/Debug/sfml-audio-s-d.pdb b/Array-Jumper/sfml/lib/Debug/sfml-audio-s-d.pdb index 9371818c..bbd97a4b 100644 Binary files a/Array-Jumper/sfml/lib/Debug/sfml-audio-s-d.pdb and b/Array-Jumper/sfml/lib/Debug/sfml-audio-s-d.pdb differ diff --git a/Array-Jumper/sfml/lib/Debug/sfml-audio-s.pdb b/Array-Jumper/sfml/lib/Debug/sfml-audio-s.pdb index 9371818c..bbd97a4b 100644 Binary files a/Array-Jumper/sfml/lib/Debug/sfml-audio-s.pdb and b/Array-Jumper/sfml/lib/Debug/sfml-audio-s.pdb differ diff --git a/Array-Jumper/sfml/lib/Debug/sfml-audio.pdb b/Array-Jumper/sfml/lib/Debug/sfml-audio.pdb index eec00db2..e0cd9357 100644 Binary files a/Array-Jumper/sfml/lib/Debug/sfml-audio.pdb and b/Array-Jumper/sfml/lib/Debug/sfml-audio.pdb differ diff --git a/Array-Jumper/sfml/lib/Debug/sfml-graphics-s-d.pdb b/Array-Jumper/sfml/lib/Debug/sfml-graphics-s-d.pdb index c0bed6ba..d187d972 100644 Binary files a/Array-Jumper/sfml/lib/Debug/sfml-graphics-s-d.pdb and b/Array-Jumper/sfml/lib/Debug/sfml-graphics-s-d.pdb differ diff --git a/Array-Jumper/sfml/lib/Debug/sfml-graphics-s.pdb b/Array-Jumper/sfml/lib/Debug/sfml-graphics-s.pdb index c0bed6ba..d187d972 100644 Binary files a/Array-Jumper/sfml/lib/Debug/sfml-graphics-s.pdb and b/Array-Jumper/sfml/lib/Debug/sfml-graphics-s.pdb differ diff --git a/Array-Jumper/sfml/lib/Debug/sfml-graphics.pdb b/Array-Jumper/sfml/lib/Debug/sfml-graphics.pdb index c516163a..310a084a 100644 Binary files a/Array-Jumper/sfml/lib/Debug/sfml-graphics.pdb and b/Array-Jumper/sfml/lib/Debug/sfml-graphics.pdb differ diff --git a/Array-Jumper/sfml/lib/Debug/sfml-main-d.pdb b/Array-Jumper/sfml/lib/Debug/sfml-main-d.pdb index 3e17d4a2..432660dd 100644 Binary files a/Array-Jumper/sfml/lib/Debug/sfml-main-d.pdb and b/Array-Jumper/sfml/lib/Debug/sfml-main-d.pdb differ diff --git a/Array-Jumper/sfml/lib/Debug/sfml-main-s.pdb b/Array-Jumper/sfml/lib/Debug/sfml-main-s.pdb index 3e17d4a2..432660dd 100644 Binary files a/Array-Jumper/sfml/lib/Debug/sfml-main-s.pdb and b/Array-Jumper/sfml/lib/Debug/sfml-main-s.pdb differ diff --git a/Array-Jumper/sfml/lib/Debug/sfml-network-s-d.pdb b/Array-Jumper/sfml/lib/Debug/sfml-network-s-d.pdb index 7afce526..446f1fb8 100644 Binary files a/Array-Jumper/sfml/lib/Debug/sfml-network-s-d.pdb and b/Array-Jumper/sfml/lib/Debug/sfml-network-s-d.pdb differ diff --git a/Array-Jumper/sfml/lib/Debug/sfml-network-s.pdb b/Array-Jumper/sfml/lib/Debug/sfml-network-s.pdb index 7afce526..446f1fb8 100644 Binary files a/Array-Jumper/sfml/lib/Debug/sfml-network-s.pdb and b/Array-Jumper/sfml/lib/Debug/sfml-network-s.pdb differ diff --git a/Array-Jumper/sfml/lib/Debug/sfml-network.pdb b/Array-Jumper/sfml/lib/Debug/sfml-network.pdb index 93ec6553..fa073311 100644 Binary files a/Array-Jumper/sfml/lib/Debug/sfml-network.pdb and b/Array-Jumper/sfml/lib/Debug/sfml-network.pdb differ diff --git a/Array-Jumper/sfml/lib/Debug/sfml-system-s-d.pdb b/Array-Jumper/sfml/lib/Debug/sfml-system-s-d.pdb index 2ba28522..aa448263 100644 Binary files a/Array-Jumper/sfml/lib/Debug/sfml-system-s-d.pdb and b/Array-Jumper/sfml/lib/Debug/sfml-system-s-d.pdb differ diff --git a/Array-Jumper/sfml/lib/Debug/sfml-system-s.pdb b/Array-Jumper/sfml/lib/Debug/sfml-system-s.pdb index 2ba28522..aa448263 100644 Binary files a/Array-Jumper/sfml/lib/Debug/sfml-system-s.pdb and b/Array-Jumper/sfml/lib/Debug/sfml-system-s.pdb differ diff --git a/Array-Jumper/sfml/lib/Debug/sfml-system.pdb b/Array-Jumper/sfml/lib/Debug/sfml-system.pdb index 59b5195a..ea487f4f 100644 Binary files a/Array-Jumper/sfml/lib/Debug/sfml-system.pdb and b/Array-Jumper/sfml/lib/Debug/sfml-system.pdb differ diff --git a/Array-Jumper/sfml/lib/Debug/sfml-window-s-d.pdb b/Array-Jumper/sfml/lib/Debug/sfml-window-s-d.pdb index 4a11994b..98a4c966 100644 Binary files a/Array-Jumper/sfml/lib/Debug/sfml-window-s-d.pdb and b/Array-Jumper/sfml/lib/Debug/sfml-window-s-d.pdb differ diff --git a/Array-Jumper/sfml/lib/Debug/sfml-window-s.pdb b/Array-Jumper/sfml/lib/Debug/sfml-window-s.pdb index 4a11994b..98a4c966 100644 Binary files a/Array-Jumper/sfml/lib/Debug/sfml-window-s.pdb and b/Array-Jumper/sfml/lib/Debug/sfml-window-s.pdb differ diff --git a/Array-Jumper/sfml/lib/Debug/sfml-window.pdb b/Array-Jumper/sfml/lib/Debug/sfml-window.pdb index 332a83ca..1e2442bd 100644 Binary files a/Array-Jumper/sfml/lib/Debug/sfml-window.pdb and b/Array-Jumper/sfml/lib/Debug/sfml-window.pdb differ diff --git a/Array-Jumper/sfml/lib/cmake/SFML/SFMLConfig.cmake b/Array-Jumper/sfml/lib/cmake/SFML/SFMLConfig.cmake index f8b915b6..f28497b6 100644 --- a/Array-Jumper/sfml/lib/cmake/SFML/SFMLConfig.cmake +++ b/Array-Jumper/sfml/lib/cmake/SFML/SFMLConfig.cmake @@ -144,5 +144,5 @@ if (NOT SFML_FOUND) endif() if (SFML_FOUND AND NOT SFML_FIND_QUIETLY) - message(STATUS "Found SFML 2.6.0 in ${CMAKE_CURRENT_LIST_DIR}") + message(STATUS "Found SFML 2.6.1 in ${CMAKE_CURRENT_LIST_DIR}") endif() diff --git a/Array-Jumper/sfml/lib/cmake/SFML/SFMLConfigVersion.cmake b/Array-Jumper/sfml/lib/cmake/SFML/SFMLConfigVersion.cmake index b2208ca9..25db8760 100644 --- a/Array-Jumper/sfml/lib/cmake/SFML/SFMLConfigVersion.cmake +++ b/Array-Jumper/sfml/lib/cmake/SFML/SFMLConfigVersion.cmake @@ -9,19 +9,19 @@ # The variable CVF_VERSION must be set before calling configure_file(). -set(PACKAGE_VERSION "2.6.0") +set(PACKAGE_VERSION "2.6.1") if(PACKAGE_VERSION VERSION_LESS PACKAGE_FIND_VERSION) set(PACKAGE_VERSION_COMPATIBLE FALSE) else() - if("2.6.0" MATCHES "^([0-9]+)\\.") + if("2.6.1" MATCHES "^([0-9]+)\\.") set(CVF_VERSION_MAJOR "${CMAKE_MATCH_1}") if(NOT CVF_VERSION_MAJOR VERSION_EQUAL 0) string(REGEX REPLACE "^0+" "" CVF_VERSION_MAJOR "${CVF_VERSION_MAJOR}") endif() else() - set(CVF_VERSION_MAJOR "2.6.0") + set(CVF_VERSION_MAJOR "2.6.1") endif() if(PACKAGE_FIND_VERSION_RANGE) diff --git a/Array-Jumper/sfml/lib/cmake/SFML/SFMLSharedTargets.cmake b/Array-Jumper/sfml/lib/cmake/SFML/SFMLSharedTargets.cmake index 1c1c3c06..852e1a8d 100644 --- a/Array-Jumper/sfml/lib/cmake/SFML/SFMLSharedTargets.cmake +++ b/Array-Jumper/sfml/lib/cmake/SFML/SFMLSharedTargets.cmake @@ -7,7 +7,7 @@ if(CMAKE_VERSION VERSION_LESS "2.8.3") message(FATAL_ERROR "CMake >= 2.8.3 required") endif() cmake_policy(PUSH) -cmake_policy(VERSION 2.8.3...3.24) +cmake_policy(VERSION 2.8.3...3.25) #---------------------------------------------------------------- # Generated CMake target import file. #---------------------------------------------------------------- diff --git a/Array-Jumper/sfml/lib/cmake/SFML/SFMLStaticTargets.cmake b/Array-Jumper/sfml/lib/cmake/SFML/SFMLStaticTargets.cmake index 7257de65..419bb1b8 100644 --- a/Array-Jumper/sfml/lib/cmake/SFML/SFMLStaticTargets.cmake +++ b/Array-Jumper/sfml/lib/cmake/SFML/SFMLStaticTargets.cmake @@ -7,7 +7,7 @@ if(CMAKE_VERSION VERSION_LESS "2.8.3") message(FATAL_ERROR "CMake >= 2.8.3 required") endif() cmake_policy(PUSH) -cmake_policy(VERSION 2.8.3...3.24) +cmake_policy(VERSION 2.8.3...3.25) #---------------------------------------------------------------- # Generated CMake target import file. #---------------------------------------------------------------- diff --git a/Array-Jumper/sfml/lib/sfml-audio-d.lib b/Array-Jumper/sfml/lib/sfml-audio-d.lib index 22a0c601..fcc921d1 100644 Binary files a/Array-Jumper/sfml/lib/sfml-audio-d.lib and b/Array-Jumper/sfml/lib/sfml-audio-d.lib differ diff --git a/Array-Jumper/sfml/lib/sfml-audio-s-d.lib b/Array-Jumper/sfml/lib/sfml-audio-s-d.lib index 5b4f46a0..a44112ad 100644 Binary files a/Array-Jumper/sfml/lib/sfml-audio-s-d.lib and b/Array-Jumper/sfml/lib/sfml-audio-s-d.lib differ diff --git a/Array-Jumper/sfml/lib/sfml-audio-s.lib b/Array-Jumper/sfml/lib/sfml-audio-s.lib index 964fcc1e..853768ff 100644 Binary files a/Array-Jumper/sfml/lib/sfml-audio-s.lib and b/Array-Jumper/sfml/lib/sfml-audio-s.lib differ diff --git a/Array-Jumper/sfml/lib/sfml-audio.lib b/Array-Jumper/sfml/lib/sfml-audio.lib index 397516bb..1a63191b 100644 Binary files a/Array-Jumper/sfml/lib/sfml-audio.lib and b/Array-Jumper/sfml/lib/sfml-audio.lib differ diff --git a/Array-Jumper/sfml/lib/sfml-graphics-d.lib b/Array-Jumper/sfml/lib/sfml-graphics-d.lib index 5105ce24..42364007 100644 Binary files a/Array-Jumper/sfml/lib/sfml-graphics-d.lib and b/Array-Jumper/sfml/lib/sfml-graphics-d.lib differ diff --git a/Array-Jumper/sfml/lib/sfml-graphics-s-d.lib b/Array-Jumper/sfml/lib/sfml-graphics-s-d.lib index c9f97684..edce44a8 100644 Binary files a/Array-Jumper/sfml/lib/sfml-graphics-s-d.lib and b/Array-Jumper/sfml/lib/sfml-graphics-s-d.lib differ diff --git a/Array-Jumper/sfml/lib/sfml-graphics-s.lib b/Array-Jumper/sfml/lib/sfml-graphics-s.lib index 518fcab4..d21c670c 100644 Binary files a/Array-Jumper/sfml/lib/sfml-graphics-s.lib and b/Array-Jumper/sfml/lib/sfml-graphics-s.lib differ diff --git a/Array-Jumper/sfml/lib/sfml-graphics.lib b/Array-Jumper/sfml/lib/sfml-graphics.lib index 25aa7c01..61b3fbe4 100644 Binary files a/Array-Jumper/sfml/lib/sfml-graphics.lib and b/Array-Jumper/sfml/lib/sfml-graphics.lib differ diff --git a/Array-Jumper/sfml/lib/sfml-main-d.lib b/Array-Jumper/sfml/lib/sfml-main-d.lib index 036149f7..52c2a6da 100644 Binary files a/Array-Jumper/sfml/lib/sfml-main-d.lib and b/Array-Jumper/sfml/lib/sfml-main-d.lib differ diff --git a/Array-Jumper/sfml/lib/sfml-main.lib b/Array-Jumper/sfml/lib/sfml-main.lib index 3ee0d5c3..8ccf1093 100644 Binary files a/Array-Jumper/sfml/lib/sfml-main.lib and b/Array-Jumper/sfml/lib/sfml-main.lib differ diff --git a/Array-Jumper/sfml/lib/sfml-network-d.lib b/Array-Jumper/sfml/lib/sfml-network-d.lib index 8a4d8ad6..4c1a4243 100644 Binary files a/Array-Jumper/sfml/lib/sfml-network-d.lib and b/Array-Jumper/sfml/lib/sfml-network-d.lib differ diff --git a/Array-Jumper/sfml/lib/sfml-network-s-d.lib b/Array-Jumper/sfml/lib/sfml-network-s-d.lib index 070bd8c1..5dacd335 100644 Binary files a/Array-Jumper/sfml/lib/sfml-network-s-d.lib and b/Array-Jumper/sfml/lib/sfml-network-s-d.lib differ diff --git a/Array-Jumper/sfml/lib/sfml-network-s.lib b/Array-Jumper/sfml/lib/sfml-network-s.lib index bcee3998..05e8856e 100644 Binary files a/Array-Jumper/sfml/lib/sfml-network-s.lib and b/Array-Jumper/sfml/lib/sfml-network-s.lib differ diff --git a/Array-Jumper/sfml/lib/sfml-network.lib b/Array-Jumper/sfml/lib/sfml-network.lib index 1b6aaa28..a9590392 100644 Binary files a/Array-Jumper/sfml/lib/sfml-network.lib and b/Array-Jumper/sfml/lib/sfml-network.lib differ diff --git a/Array-Jumper/sfml/lib/sfml-system-d.lib b/Array-Jumper/sfml/lib/sfml-system-d.lib index f35828f3..3eac7a7e 100644 Binary files a/Array-Jumper/sfml/lib/sfml-system-d.lib and b/Array-Jumper/sfml/lib/sfml-system-d.lib differ diff --git a/Array-Jumper/sfml/lib/sfml-system-s-d.lib b/Array-Jumper/sfml/lib/sfml-system-s-d.lib index 9b0c0838..9b63eb55 100644 Binary files a/Array-Jumper/sfml/lib/sfml-system-s-d.lib and b/Array-Jumper/sfml/lib/sfml-system-s-d.lib differ diff --git a/Array-Jumper/sfml/lib/sfml-system-s.lib b/Array-Jumper/sfml/lib/sfml-system-s.lib index 65c70274..fc66de2f 100644 Binary files a/Array-Jumper/sfml/lib/sfml-system-s.lib and b/Array-Jumper/sfml/lib/sfml-system-s.lib differ diff --git a/Array-Jumper/sfml/lib/sfml-system.lib b/Array-Jumper/sfml/lib/sfml-system.lib index ab083de1..d4ce6a94 100644 Binary files a/Array-Jumper/sfml/lib/sfml-system.lib and b/Array-Jumper/sfml/lib/sfml-system.lib differ diff --git a/Array-Jumper/sfml/lib/sfml-window-d.lib b/Array-Jumper/sfml/lib/sfml-window-d.lib index 094ef2fc..2c461597 100644 Binary files a/Array-Jumper/sfml/lib/sfml-window-d.lib and b/Array-Jumper/sfml/lib/sfml-window-d.lib differ diff --git a/Array-Jumper/sfml/lib/sfml-window-s-d.lib b/Array-Jumper/sfml/lib/sfml-window-s-d.lib index fd001f9a..7197c81a 100644 Binary files a/Array-Jumper/sfml/lib/sfml-window-s-d.lib and b/Array-Jumper/sfml/lib/sfml-window-s-d.lib differ diff --git a/Array-Jumper/sfml/lib/sfml-window-s.lib b/Array-Jumper/sfml/lib/sfml-window-s.lib index 955f9f35..a079e522 100644 Binary files a/Array-Jumper/sfml/lib/sfml-window-s.lib and b/Array-Jumper/sfml/lib/sfml-window-s.lib differ diff --git a/Array-Jumper/sfml/lib/sfml-window.lib b/Array-Jumper/sfml/lib/sfml-window.lib index 1d7cfd9e..07009a43 100644 Binary files a/Array-Jumper/sfml/lib/sfml-window.lib and b/Array-Jumper/sfml/lib/sfml-window.lib differ diff --git a/Array-Jumper/source/Event/EventService.cpp b/Array-Jumper/source/Event/EventService.cpp index e9b32ecd..78675702 100644 --- a/Array-Jumper/source/Event/EventService.cpp +++ b/Array-Jumper/source/Event/EventService.cpp @@ -25,6 +25,7 @@ namespace Event updateKeyboardButtonsState(right_arrow_button_state, sf::Keyboard::Right); updateKeyboardButtonsState(A_button_state, sf::Keyboard::A); updateKeyboardButtonsState(D_button_state, sf::Keyboard::D); + updateKeyboardButtonsState(Space_buttonPressed, sf::Keyboard::Space); } void EventService::processEvents() @@ -90,15 +91,17 @@ namespace Event bool EventService::pressedEscapeKey() { return game_event.key.code == sf::Keyboard::Escape; } - bool EventService::pressedLeftArrowKey() { return left_arrow_button_state == ButtonState::HELD; } + bool EventService::pressedLeftArrowKey() { return left_arrow_button_state == ButtonState::PRESSED; } - bool EventService::pressedRightArrowKey() { return right_arrow_button_state == ButtonState::HELD; } + bool EventService::pressedRightArrowKey() { return right_arrow_button_state == ButtonState::PRESSED; } - bool EventService::pressedAKey() { return A_button_state == ButtonState::HELD; } + bool EventService::pressedAKey() { return A_button_state == ButtonState::PRESSED; } - bool EventService::pressedDKey() { return D_button_state == ButtonState::HELD; } + bool EventService::pressedDKey() { return D_button_state == ButtonState::PRESSED; } bool EventService::pressedLeftMouseButton() { return left_mouse_button_state == ButtonState::PRESSED; } bool EventService::pressedRightMouseButton() { return right_mouse_button_state == ButtonState::PRESSED; } + + bool EventService::heldSpaceKey() { return Space_buttonPressed == ButtonState::HELD; } } \ No newline at end of file diff --git a/Array-Jumper/source/Gameplay/GameplayController.cpp b/Array-Jumper/source/Gameplay/GameplayController.cpp new file mode 100644 index 00000000..d4e2bec4 --- /dev/null +++ b/Array-Jumper/source/Gameplay/GameplayController.cpp @@ -0,0 +1,73 @@ +#include "../../header/Gameplay/GameplayController.h" +#include "../../header/Global/ServiceLocator.h" +#include "../../header/Level/LevelData.h" +#include "../../header/Sound/SoundService.h" +#include "../../header/Main/GameService.h" + +namespace Gameplay +{ + using namespace Global; + using namespace Level; + using namespace Sound; + using namespace Main; + + void GameplayController::intialize() + {//Yet to Implement + } + + void GameplayController::update() + {//Yet to Implement + } + + void GameplayController::render() + {//Yet to Implement + } + + void GameplayController::onPositionChanged(int position) + { + BlockType value = ServiceLocator::getInstance()->getLevelService()->getCurrentBoxValue(position); + + if (isObstacle(value)) + processObstacle(); + if (isEndBlock(value)) + processEndBlock(); + } + + void GameplayController::onDeath() + { + gameOver(); + } + + bool GameplayController::isObstacle(Level::BlockType value) + { + if (value == BlockType::OBSTACLE_ONE || value == BlockType::OBSTACLE_TWO) + return true; + return false; + } + + bool GameplayController::isEndBlock(Level::BlockType value) + { + if (value == BlockType::TARGET) + return true; + return false; + } + + void GameplayController::processObstacle() + { + ServiceLocator::getInstance()->getPlayerService()->takeDamage(); + ServiceLocator::getInstance()->getSoundService()->playSound(SoundType::DEATH); + } + + void GameplayController::processEndBlock() + { + ServiceLocator::getInstance()->getPlayerService()->levelComplete(); + ServiceLocator::getInstance()->getSoundService()->playSound(SoundType::LEVEL_COMPLETE); + GameService::setGameState(GameState::CREDITS); + } + + void GameplayController::gameOver() + { + GameService::setGameState(GameState::CREDITS); + ServiceLocator::getInstance()->getSoundService()->playSound(SoundType::DEATH); + } +} \ No newline at end of file diff --git a/Array-Jumper/source/Gameplay/GameplayService.cpp b/Array-Jumper/source/Gameplay/GameplayService.cpp new file mode 100644 index 00000000..e361e3cf --- /dev/null +++ b/Array-Jumper/source/Gameplay/GameplayService.cpp @@ -0,0 +1,17 @@ +#include "../../header/Gameplay/GameplayService.h" + +namespace Gameplay +{ + GameplayService::GameplayService() { gameplay_controller = new GameplayController(); } + GameplayService::~GameplayService() { destroy(); } + + void GameplayService::intialize() { gameplay_controller->intialize(); } + void GameplayService::update() { gameplay_controller->update(); } + void GameplayService::render() { gameplay_controller->render(); } + + void GameplayService::onPositionChanged(int position) { gameplay_controller->onPositionChanged(position); } + + void GameplayService::onDeath() { gameplay_controller->onDeath(); } + + void GameplayService::destroy() { delete(gameplay_controller); } +} diff --git a/Array-Jumper/source/Global/Config.cpp b/Array-Jumper/source/Global/Config.cpp index 39cd30dc..33e8078f 100644 --- a/Array-Jumper/source/Global/Config.cpp +++ b/Array-Jumper/source/Global/Config.cpp @@ -5,6 +5,7 @@ namespace Global // Textures const sf::String Config::array_jumper_bg_texture_path = "assets/textures/array_jumper_bg.png"; const sf::String Config::box_texture_path = "assets/textures/box.png"; + const sf::String Config::target_texture_path = "assets/textures/target.png"; const sf::String Config::character_texture_path = "assets/textures/character.png"; const sf::String Config::instructions_button_texture_path = "assets/textures/instructions_button.png"; const sf::String Config::letter_one_texture_path = "assets/textures/letter_one.png"; diff --git a/Array-Jumper/source/Global/ServiceLocator.cpp b/Array-Jumper/source/Global/ServiceLocator.cpp index 5aa28494..c8961c48 100644 --- a/Array-Jumper/source/Global/ServiceLocator.cpp +++ b/Array-Jumper/source/Global/ServiceLocator.cpp @@ -9,6 +9,9 @@ namespace Global using namespace Sound; using namespace UI; using namespace Main; + using namespace Player; + using namespace Level; + using namespace Gameplay; ServiceLocator::ServiceLocator() { @@ -16,6 +19,9 @@ namespace Global event_service = nullptr; sound_service = nullptr; ui_service = nullptr; + level_service = nullptr; + player_service = nullptr; + gameplay_service = nullptr; createServices(); } @@ -27,6 +33,9 @@ namespace Global graphic_service = new GraphicService(); event_service = new EventService(); sound_service = new SoundService(); + level_service = new LevelService(); + player_service = new PlayerService(); + gameplay_service = new GameplayService(); ui_service = new UIService(); } @@ -35,6 +44,9 @@ namespace Global graphic_service->initialize(); event_service->initialize(); sound_service->initialize(); + level_service->intialize(); + player_service->initialize(); + gameplay_service->intialize(); ui_service->initialize(); } @@ -42,12 +54,24 @@ namespace Global { graphic_service->update(); event_service->update(); + if (GameService::getGameState() == GameState::GAMEPLAY) + { + level_service->update(); + player_service->update(); + gameplay_service->update(); + } ui_service->update(); } void ServiceLocator::render() { graphic_service->render(); + if (GameService::getGameState() == GameState::GAMEPLAY) + { + level_service->render(); + player_service->render(); + gameplay_service->render(); + } ui_service->render(); } @@ -56,6 +80,9 @@ namespace Global delete(graphic_service); delete(event_service); delete(sound_service); + delete(level_service); + delete(player_service); + delete(gameplay_service); delete(ui_service); } @@ -72,4 +99,10 @@ namespace Global SoundService* ServiceLocator::getSoundService() { return sound_service; } UIService* ServiceLocator::getUIService() { return ui_service; } + + PlayerService* ServiceLocator::getPlayerService() { return player_service; } + + LevelService* ServiceLocator::getLevelService() { return level_service; } + + GameplayService* ServiceLocator::getGameplayService() { return gameplay_service; } } \ No newline at end of file diff --git a/Array-Jumper/source/Level/LevelController.cpp b/Array-Jumper/source/Level/LevelController.cpp new file mode 100644 index 00000000..5b8c1049 --- /dev/null +++ b/Array-Jumper/source/Level/LevelController.cpp @@ -0,0 +1,43 @@ +#include "../../header/Level/LevelController.h" +#include "../../header/Level/LevelView.h" +#include "../../header/Level/LevelModel.h" +#include "../../header/Level/LevelData.h" +#include "../../header/Main/GameService.h" + +namespace Level +{ + + LevelController::LevelController() + { + level_view = new LevelView(this); + level_model = new LevelModel(); + } + + LevelController::~LevelController() {} + + void LevelController::initialize() + { + level_view->initialize(); + } + + void LevelController::update() + { + level_view->update(); + } + + void LevelController::render() + { + level_view->render(); + } + + BoxDimensions LevelController::getBoxDimensions() + { + return level_view->getBoxDimensions(); + } + + BlockType LevelController::getCurrentBoxValue(int currentPosition) + { + return level_model->getCurrentBoxValue(currentPosition); + } + +} \ No newline at end of file diff --git a/Array-Jumper/source/Level/LevelModel.cpp b/Array-Jumper/source/Level/LevelModel.cpp new file mode 100644 index 00000000..02a8a679 --- /dev/null +++ b/Array-Jumper/source/Level/LevelModel.cpp @@ -0,0 +1,13 @@ +#include "../../header/Level/LevelModel.h" + +namespace Level +{ + LevelModel::LevelModel() {} + LevelModel::~LevelModel() {} + + BlockType LevelModel::getCurrentBoxValue(int currentPosition) + { + return current_level_data.level_boxes[currentPosition]; + } +} + diff --git a/Array-Jumper/source/Level/LevelService.cpp b/Array-Jumper/source/Level/LevelService.cpp new file mode 100644 index 00000000..a1321eb6 --- /dev/null +++ b/Array-Jumper/source/Level/LevelService.cpp @@ -0,0 +1,42 @@ +#include "../../header/Level/LevelService.h" +#include "../../header/Level/LevelController.h" + +namespace Level +{ + LevelService::LevelService() + { + level_controller = new LevelController(); + } + + LevelService::~LevelService() { destroy(); } + + void LevelService::intialize() + { + level_controller->initialize(); + } + + void LevelService::update() + { + level_controller->update(); + } + + void LevelService::render() + { + level_controller->render(); + } + + BoxDimensions LevelService::getBoxDimensions() + { + return level_controller->getBoxDimensions(); + } + + BlockType LevelService::getCurrentBoxValue(int currentPosition) + { + return level_controller->getCurrentBoxValue(currentPosition); + } + + void LevelService::destroy() + { + delete(level_controller); + } +} diff --git a/Array-Jumper/source/Level/LevelView.cpp b/Array-Jumper/source/Level/LevelView.cpp new file mode 100644 index 00000000..d44d6d5e --- /dev/null +++ b/Array-Jumper/source/Level/LevelView.cpp @@ -0,0 +1,194 @@ +#include "../../header/Level/LevelView.h" +#include "../../header/Level/LevelModel.h" +#include "../../header/Level/LevelData.h" +#include "../../header/Global/ServiceLocator.h" +#include "../../header/Global/Config.h" + +namespace Level +{ + using namespace Global; + using namespace UI::UIElement; + using namespace Level; + + LevelView::LevelView(LevelController* controller) + { + game_window = nullptr; + level_controller = controller; + createImages(); + } + + LevelView::~LevelView() + { + deleteImages(); + } + + void LevelView::initialize() + { + game_window = ServiceLocator::getInstance()->getGraphicService()->getGameWindow(); + calculateBoxDimensions(); + initializeImages(); + } + + void LevelView::update() + { + updateImages(); + } + + void LevelView::render() + { + drawLevel(); + } + + BoxDimensions LevelView::getBoxDimensions() + { + return box_dimensions; + } + + void LevelView::createImages() + { + background_image = new ImageView(); + + box_image = new ImageView(); + target_overlay_image = new ImageView(); + letter_one_overlay_image = new ImageView(); + letter_two_overlay_image = new ImageView(); + letter_three_overlay_image = new ImageView(); + obstacle_one_overlay_image = new ImageView(); + obstacle_two_overlay_image = new ImageView(); + } + + void LevelView::initializeImages() + { + background_image->initialize(Config::array_jumper_bg_texture_path, game_window->getSize().x, game_window->getSize().y, sf::Vector2f(0, 0)); + background_image->setImageAlpha(background_alpha); + + + box_image->initialize(Config::box_texture_path, box_dimensions.box_width, box_dimensions.box_height, sf::Vector2f(0, 0)); + target_overlay_image->initialize(Config::target_texture_path, box_dimensions.box_width, box_dimensions.box_height, sf::Vector2f(0, 0)); + letter_one_overlay_image->initialize(Config::letter_one_texture_path, box_dimensions.box_width, box_dimensions.box_height, sf::Vector2f(0, 0)); + letter_two_overlay_image->initialize(Config::letter_two_texture_path, box_dimensions.box_width, box_dimensions.box_height, sf::Vector2f(0, 0)); + letter_three_overlay_image->initialize(Config::letter_three_texture_path, box_dimensions.box_width, box_dimensions.box_height, sf::Vector2f(0, 0)); + obstacle_one_overlay_image->initialize(Config::obstacle_01_texture_path, box_dimensions.box_width, box_dimensions.box_height, sf::Vector2f(0, 0)); + obstacle_two_overlay_image->initialize(Config::obstacle_02_texture_path, box_dimensions.box_width, box_dimensions.box_height, sf::Vector2f(0, 0)); + } + + void LevelView::updateImages() + { + background_image->update(); + + box_image->update(); + target_overlay_image->update(); + letter_one_overlay_image->update(); + letter_two_overlay_image->update(); + letter_three_overlay_image->update(); + obstacle_one_overlay_image->update(); + obstacle_two_overlay_image->update(); + } + + void LevelView::drawLevel() + { + background_image->render(); + + for (int i = 0; i < LevelData::NUMBER_OF_BOXES; ++i) + { + sf::Vector2f position = calculateBoxPosition(i); + BlockType blockTypeToDraw = level_controller->getCurrentBoxValue(i); + + drawBox(position); + drawBoxValue(position, blockTypeToDraw); + } + } + + void LevelView::drawBox(sf::Vector2f position) + { + box_image->setPosition(position); + box_image->render(); + } + + void LevelView::drawBoxValue(sf::Vector2f position, BlockType box_value) + { + ImageView* image = getBoxOverlayImage(box_value); + image->setPosition(position); + image->render(); + } + + + + void LevelView::calculateBoxDimensions() + { + if (!game_window) return; + + calculateBoxWidthHeight(); + calculateBoxSpacing(); + + } + + + void LevelView::calculateBoxWidthHeight() + { + float screenWidth = static_cast(game_window->getSize().x); + int numBoxes = LevelData::NUMBER_OF_BOXES; + + //Each Box has a Gap on it's left, 1 extra gap for last block's right side + int numGaps = numBoxes + 1; + + //Total space consumed by all gaps + float totalSpaceByGaps = box_dimensions.box_spacing_percentage * static_cast(numGaps); + + //Total space consumed by boxes and gaps + float totalSpace = numBoxes + totalSpaceByGaps; + + box_dimensions.box_width = screenWidth / (totalSpace); + box_dimensions.box_height = box_dimensions.box_width; + } + + void LevelView::calculateBoxSpacing() + { + box_dimensions.box_spacing = box_dimensions.box_spacing_percentage * box_dimensions.box_width; + } + + sf::Vector2f LevelView::calculateBoxPosition(int index) + { + float xPosition = box_dimensions.box_spacing + static_cast(index) * (box_dimensions.box_width + box_dimensions.box_spacing); + float yPosition = static_cast(game_window->getSize().y) - box_dimensions.box_height - box_dimensions.bottom_offset; + return sf::Vector2f(xPosition, yPosition); + } + + ImageView* LevelView::getBoxOverlayImage(BlockType block_type) + { + switch (block_type) + { + case BlockType::OBSTACLE_ONE: + return obstacle_one_overlay_image; + + case BlockType::OBSTACLE_TWO: + return obstacle_two_overlay_image; + + case BlockType::ONE: + return letter_one_overlay_image; + + case BlockType::TWO: + return letter_two_overlay_image; + + case BlockType::THREE: + return letter_three_overlay_image; + + case BlockType::TARGET: + return target_overlay_image; + } + return nullptr; + } + + void LevelView::deleteImages() + { + delete(background_image); + delete(box_image); + delete(target_overlay_image); + delete(letter_one_overlay_image); + delete(letter_two_overlay_image); + delete(letter_three_overlay_image); + delete(obstacle_one_overlay_image); + delete(obstacle_two_overlay_image); + } + +} \ No newline at end of file diff --git a/Array-Jumper/source/Player/PlayerController.cpp b/Array-Jumper/source/Player/PlayerController.cpp new file mode 100644 index 00000000..89a50e1f --- /dev/null +++ b/Array-Jumper/source/Player/PlayerController.cpp @@ -0,0 +1,173 @@ +#include "../../header/Player/PlayerController.h" +#include "../../header/Player/PlayerView.h" +#include "../../header/Player/PlayerModel.h" +#include "../../header/Global/ServiceLocator.h" +#include "../../header/Level/LevelModel.h" +#include "../../header/Sound/SoundService.h" + + + +namespace Player +{ + using namespace Global; + using namespace Event; + using namespace Level; + using namespace Sound; + + PlayerController::PlayerController() + { + player_model = new PlayerModel(); + player_view = new PlayerView(this); + } + + PlayerController::~PlayerController() { destroy(); } + + void PlayerController::initialize() + { + player_model->initialize(); + player_view->initialize(); + + event_service = ServiceLocator::getInstance()->getEventService(); + + resetPlayer(); + } + + void PlayerController::update() + { + player_view->update(); + readInput(); + } + + void PlayerController::render() + { + player_view->render(); + } + + PlayerState PlayerController::getPlayerState() + { + return player_model->getPlayerState(); + } + + void PlayerController::setPlayerState(PlayerState new_player_state) + { + player_model->setPlayerState(new_player_state); + } + + int PlayerController::getCurrentPosition() + { + return player_model->getCurrentPosition(); + } + + int PlayerController::getCurrentLives() + { + return player_model->getCurrentLives(); + } + + void PlayerController::takeDamage() + { + player_model->decreamentLife(); + if (player_model->getCurrentLives() <= 0) + onDeath(); + else + player_model->resetPosition(); + } + + + void PlayerController::destroy() + { + delete(player_model); + delete(player_view); + } + + void PlayerController::resetPlayer() + { + player_model->resetPlayer(); + } + + void PlayerController::readInput() + { + if (event_service->pressedRightArrowKey() || event_service->pressedDKey()) + { + if (event_service->heldSpaceKey()) + jump(MovementDirection::FORWARD); + else + move(MovementDirection::FORWARD); + } + if (event_service->pressedLeftArrowKey() || event_service->pressedAKey()) + { + if (event_service->heldSpaceKey()) + jump(MovementDirection::BACKWARD); + else + move(MovementDirection::BACKWARD); + } + + } + + void PlayerController::move(MovementDirection direction) + { + int steps, targetPosition; + switch (direction) + { + case MovementDirection::FORWARD: + steps = 1; + break; + case MovementDirection::BACKWARD: + steps = -1; + break; + default: + steps = 0; + break; + } + + targetPosition = player_model->getCurrentPosition() + steps; + + if (!isPositionInBound(targetPosition)) + return; + + player_model->setCurrentPosition(targetPosition); + ServiceLocator::getInstance()->getSoundService()->playSound(SoundType::MOVE); + ServiceLocator::getInstance()->getGameplayService()->onPositionChanged(targetPosition); + } + + void PlayerController::jump(MovementDirection direction) + { + int current_position = player_model->getCurrentPosition(); + BlockType box_value = ServiceLocator::getInstance()->getLevelService()->getCurrentBoxValue(current_position); + int steps, targetPosition; + + switch (direction) + { + case MovementDirection::FORWARD: + steps = box_value; + break; + case MovementDirection::BACKWARD: + steps = -box_value; + break; + default: + steps = 0; + break; + } + + targetPosition = current_position + steps; + + if (!isPositionInBound(targetPosition)) + return; + + player_model->setCurrentPosition(targetPosition); + ServiceLocator::getInstance()->getSoundService()->playSound(SoundType::JUMP); + ServiceLocator::getInstance()->getGameplayService()->onPositionChanged(targetPosition); + } + + bool PlayerController::isPositionInBound(int targetPosition) + { + if(targetPosition >= 0 && targetPosition < LevelData::NUMBER_OF_BOXES) + return true; + return false; + } + + void PlayerController::onDeath() + { + ServiceLocator::getInstance()->getGameplayService()->onDeath(); + player_model->resetPlayer(); + } +} \ No newline at end of file diff --git a/Array-Jumper/source/Player/PlayerModel.cpp b/Array-Jumper/source/Player/PlayerModel.cpp new file mode 100644 index 00000000..f3a1555c --- /dev/null +++ b/Array-Jumper/source/Player/PlayerModel.cpp @@ -0,0 +1,38 @@ +#include "../../header/Player/PlayerModel.h" + +namespace Player +{ + void Player::PlayerModel::initialize() + { + //Yet to implement + } + + PlayerState PlayerModel::getPlayerState() + { + return player_state; + } + + void PlayerModel::setPlayerState(PlayerState new_player_state) + { + player_state = new_player_state; + } + + void PlayerModel::resetPlayer() + { + current_position = 0; + player_state = PlayerState::ALIVE; + current_lives = max_lives; + } + + void PlayerModel::resetPosition() + { + current_position = 0; + } + + int PlayerModel::getCurrentPosition() { return current_position; } + void PlayerModel::setCurrentPosition(int new_position) { current_position = new_position; } + void PlayerModel::decreamentLife() { current_lives--; } + int PlayerModel::getCurrentLives() { return current_lives; } +} + + diff --git a/Array-Jumper/source/Player/PlayerService.cpp b/Array-Jumper/source/Player/PlayerService.cpp new file mode 100644 index 00000000..71a84d31 --- /dev/null +++ b/Array-Jumper/source/Player/PlayerService.cpp @@ -0,0 +1,40 @@ +#include "../../header/Player/PlayerService.h" +#include "../../header/Player/PlayerController.h" + + +namespace Player +{ + PlayerService::PlayerService() { player_controller = new PlayerController(); } + + PlayerService::~PlayerService() { destroy(); } + + void PlayerService::initialize() + { + player_controller->initialize(); + } + + void PlayerService::update() + { + player_controller->update(); + } + + void PlayerService::render() + { + player_controller->render(); + } + + int PlayerService::getCurrentLives() + { + return player_controller->getCurrentLives(); + } + + void PlayerService::takeDamage() + { + player_controller->takeDamage(); + } + + void PlayerService::levelComplete() { player_controller->resetPlayer(); } + + + void PlayerService::destroy() { delete(player_controller); } +} \ No newline at end of file diff --git a/Array-Jumper/source/Player/PlayerView.cpp b/Array-Jumper/source/Player/PlayerView.cpp new file mode 100644 index 00000000..b7ec7d68 --- /dev/null +++ b/Array-Jumper/source/Player/PlayerView.cpp @@ -0,0 +1,85 @@ +#include "../../header/Player/PlayerView.h" +#include "../../header/Global/Config.h" +#include "../../header/Global/ServiceLocator.h" +#include "../../header/Player/PlayerController.h" +#include "../../header/Player/PlayerModel.h" + + + +namespace Player +{ + using namespace Global; + using namespace Level; + using namespace UI::UIElement; + + PlayerView::PlayerView(PlayerController* controller) + { + player_controller = controller; + player_image = new ImageView(); + game_window = nullptr; + } + + PlayerView::~PlayerView() {} + + void PlayerView::initialize() + { + game_window = ServiceLocator::getInstance()->getGraphicService()->getGameWindow(); + loadPlayer(); + } + + void PlayerView::update() + { + updatePlayerPosition(); + } + + void PlayerView::render() + { + switch (player_controller->getPlayerState()) + { + case PlayerState::ALIVE: + drawPlayer(); + break; + } + } + + void PlayerView::loadPlayer() + { + CalculatePlayerDimensions(); + initializePlayerImage(); + } + + void PlayerView::initializePlayerImage() + { + + player_image->initialize(Config::character_texture_path, + player_width, + player_height, + sf::Vector2f(0, 0)); + } + + void PlayerView::CalculatePlayerDimensions() + { + current_box_dimensions = ServiceLocator::getInstance()->getLevelService()->getBoxDimensions(); + player_height = current_box_dimensions.box_height; + player_width = current_box_dimensions.box_width; + } + + void PlayerView::updatePlayerPosition() + { + player_image->setPosition(calulcatePlayerPosition()); + } + + sf::Vector2f PlayerView::calulcatePlayerPosition() + { + float xPosition = current_box_dimensions.box_spacing + static_cast(player_controller->getCurrentPosition()) * (current_box_dimensions.box_width + current_box_dimensions.box_spacing); + float yPosition = static_cast(game_window->getSize().y) - current_box_dimensions.box_height - current_box_dimensions.bottom_offset - player_height; + return sf::Vector2f(xPosition, yPosition); + } + + + void PlayerView::drawPlayer() + { + player_image->render(); + } + +} \ No newline at end of file diff --git a/Array-Jumper/source/UI/Gameplay/GameplayUIController.cpp b/Array-Jumper/source/UI/Gameplay/GameplayUIController.cpp new file mode 100644 index 00000000..59b8d644 --- /dev/null +++ b/Array-Jumper/source/UI/Gameplay/GameplayUIController.cpp @@ -0,0 +1,76 @@ +#include "../../../header/UI/Gameplay/GameplayUIController.h" +#include "../../../header/Global/ServiceLocator.h" + +#include +#include +#include + + +namespace UI +{ + namespace GameplayUI + { + using namespace Global; + using namespace UIElement; + + GameplayUIController::GameplayUIController() + { + createTexts(); + } + + GameplayUIController::~GameplayUIController() + { + destroy(); + } + + void GameplayUIController::initialize() + { + initializeTexts(); + } + + void GameplayUIController::update() + { + updateLifeCountText(); + } + + void GameplayUIController::render() + { + life_count_text->render(); + } + + void GameplayUIController::createTexts() + { + life_count_text = new TextView(); + } + + void GameplayUIController::initializeTexts() + { + initializeLifeCountText(); + } + + void GameplayUIController::initializeLifeCountText() + { + float windowWidth = ServiceLocator::getInstance()->getGraphicService()->getGameWindow()->getSize().x; + float x_position = (static_cast(windowWidth) - right_offset); + float y_position = top_offset; + + life_count_text->initialize("0", sf::Vector2f(x_position, y_position), FontType::BUBBLE_BOBBLE, font_size, sf::Color::White); + } + + void GameplayUIController::updateLifeCountText() + { + int life_count = ServiceLocator::getInstance()->getPlayerService()->getCurrentLives(); + + std::string life_count_string = "LIFE: " + std::to_string(life_count); + + life_count_text->setText(life_count_string); + life_count_text->update(); + } + + void GameplayUIController::destroy() + { + delete(life_count_text); + } + + } +} \ No newline at end of file diff --git a/Array-Jumper/source/UI/MainMenu/MainMenuUIController.cpp b/Array-Jumper/source/UI/MainMenu/MainMenuUIController.cpp index b3c74893..7a572427 100644 --- a/Array-Jumper/source/UI/MainMenu/MainMenuUIController.cpp +++ b/Array-Jumper/source/UI/MainMenu/MainMenuUIController.cpp @@ -75,6 +75,7 @@ namespace UI void MainMenuUIController::playButtonCallback() { ServiceLocator::getInstance()->getSoundService()->playSound(SoundType::BUTTON_CLICK); + GameService::setGameState(GameState::GAMEPLAY); } void MainMenuUIController::instructionsButtonCallback() diff --git a/Array-Jumper/source/UI/UIService.cpp b/Array-Jumper/source/UI/UIService.cpp index 0623d796..970ba962 100644 --- a/Array-Jumper/source/UI/UIService.cpp +++ b/Array-Jumper/source/UI/UIService.cpp @@ -12,6 +12,7 @@ namespace UI using namespace SplashScreen; using namespace MainMenu; using namespace Credits; + using namespace GameplayUI; using namespace Instructions; using namespace Global; using namespace UIElement; @@ -22,6 +23,7 @@ namespace UI main_menu_ui_controller = nullptr; credits_screen_ui_controller = nullptr; instructions_ui_controller = nullptr; + gameplay_ui_controller = nullptr; createControllers(); } @@ -37,6 +39,7 @@ namespace UI main_menu_ui_controller = new MainMenuUIController(); credits_screen_ui_controller = new CreditsScreenUIController(); instructions_ui_controller = new InstructionsUIController(); + gameplay_ui_controller = new GameplayUIController(); } void UIService::initialize() @@ -51,6 +54,7 @@ namespace UI main_menu_ui_controller->initialize(); credits_screen_ui_controller->initialize(); instructions_ui_controller->initialize(); + gameplay_ui_controller->initialize(); } void UIService::initializeUIElements() @@ -74,6 +78,9 @@ namespace UI case GameState::CREDITS: credits_screen_ui_controller->update(); break; + case GameState::GAMEPLAY: + gameplay_ui_controller->update(); + break; } } @@ -93,6 +100,9 @@ namespace UI case GameState::CREDITS: credits_screen_ui_controller->render(); break; + case GameState::GAMEPLAY: + gameplay_ui_controller->render(); + break; } } @@ -107,5 +117,6 @@ namespace UI delete(main_menu_ui_controller); delete(credits_screen_ui_controller); delete(instructions_ui_controller); + delete(gameplay_ui_controller); } } \ No newline at end of file