diff --git a/Array-Jumper/Array-Jumper.vcxproj b/Array-Jumper/Array-Jumper.vcxproj index 658ea835..115f857b 100644 --- a/Array-Jumper/Array-Jumper.vcxproj +++ b/Array-Jumper/Array-Jumper.vcxproj @@ -137,6 +137,13 @@ + + + + + + + @@ -154,6 +161,17 @@ + + + + + + + + + + + diff --git a/Array-Jumper/Array-Jumper.vcxproj.filters b/Array-Jumper/Array-Jumper.vcxproj.filters index dff4a580..11370f78 100644 --- a/Array-Jumper/Array-Jumper.vcxproj.filters +++ b/Array-Jumper/Array-Jumper.vcxproj.filters @@ -44,6 +44,13 @@ + + + + + + + @@ -74,6 +81,17 @@ + + + + + + + + + + + diff --git a/Array-Jumper/header/Level/BlockType.h b/Array-Jumper/header/Level/BlockType.h new file mode 100644 index 00000000..ec522419 --- /dev/null +++ b/Array-Jumper/header/Level/BlockType.h @@ -0,0 +1,13 @@ +#pragma once +namespace Level +{ + enum BlockType + { + OBSTACLE_ONE = -1, + OBSTACLE_TWO = -2, + TARGET = 0, + ONE = 1, + TWO = 2, + THREE = 3, + }; +} \ No newline at end of file diff --git a/Array-Jumper/header/Level/LevelConfiguration.h b/Array-Jumper/header/Level/LevelConfiguration.h new file mode 100644 index 00000000..ee168f60 --- /dev/null +++ b/Array-Jumper/header/Level/LevelConfiguration.h @@ -0,0 +1,49 @@ +#pragma once +#include "LevelData.h" +#include "BlockType.h" + +namespace Level +{ + class LevelConfiguration + { + private: + + + BlockType level_1[LevelData::NUMBER_OF_BOXES] = + { + ONE, TWO, OBSTACLE_ONE, TWO, THREE, ONE, OBSTACLE_TWO, TWO, ONE, TARGET + }; + + BlockType level_2[LevelData::NUMBER_OF_BOXES] = + { + ONE, TWO, OBSTACLE_TWO, ONE, TWO, OBSTACLE_ONE, THREE, OBSTACLE_ONE, ONE, TARGET + }; + + BlockType level_3[LevelData::NUMBER_OF_BOXES] = + { + ONE, THREE, OBSTACLE_ONE, OBSTACLE_TWO, ONE, TWO, OBSTACLE_ONE, TWO, ONE, TARGET + }; + + public: + static const int NUMBER_OF_LEVELS = 3; + LevelData levels[NUMBER_OF_LEVELS]; + + LevelConfiguration() + { + for (int i = 0; i < LevelData::NUMBER_OF_BOXES; i++) + { + levels[0].level_boxes[i] = level_1[i]; + } + + for (int i = 0; i < LevelData::NUMBER_OF_BOXES; i++) + { + levels[1].level_boxes[i] = level_2[i]; + } + + for (int i = 0; i < LevelData::NUMBER_OF_BOXES; i++) + { + levels[2].level_boxes[i] = level_3[i]; + } + } + }; +} \ No newline at end of file diff --git a/Array-Jumper/header/Level/LevelController.h b/Array-Jumper/header/Level/LevelController.h new file mode 100644 index 00000000..a013b12e --- /dev/null +++ b/Array-Jumper/header/Level/LevelController.h @@ -0,0 +1,32 @@ +#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); + bool isLastLevel(); + void loadNextLevel(); + int getCurrentLevelNumber(); + + void reset(); + }; +} diff --git a/Array-Jumper/header/Level/LevelData.h b/Array-Jumper/header/Level/LevelData.h new file mode 100644 index 00000000..909a93b3 --- /dev/null +++ b/Array-Jumper/header/Level/LevelData.h @@ -0,0 +1,13 @@ +#pragma once +#include "BlockType.h" + +namespace Level +{ + + struct LevelData + { + static const int NUMBER_OF_BOXES = 10; + + BlockType level_boxes[NUMBER_OF_BOXES]; + }; +} \ 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..c8e8f0db --- /dev/null +++ b/Array-Jumper/header/Level/LevelModel.h @@ -0,0 +1,39 @@ +#pragma once +#pragma once +#include "LevelData.h" +#include "LevelConfiguration.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: + const int number_of_level = LevelConfiguration::NUMBER_OF_LEVELS; + LevelConfiguration level_configuration; + + int current_level_index; + public: + LevelModel(); + ~LevelModel(); + + BlockType getCurrentBoxValue(int currentPosition); + + bool isLastLevel(); + void loadNextLevel(); + int getCurrentLevelNumber(); + + void reset(); + }; +} diff --git a/Array-Jumper/header/Level/LevelService.h b/Array-Jumper/header/Level/LevelService.h new file mode 100644 index 00000000..f30af294 --- /dev/null +++ b/Array-Jumper/header/Level/LevelService.h @@ -0,0 +1,32 @@ +#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); + bool isLastLevel(); + void loadNextLevel(); + int getCurrentLevelNumber(); + + void resetLevels(); + }; +} \ No newline at end of file diff --git a/Array-Jumper/header/Level/LevelView.h b/Array-Jumper/header/Level/LevelView.h new file mode 100644 index 00000000..f8ba1c25 --- /dev/null +++ b/Array-Jumper/header/Level/LevelView.h @@ -0,0 +1,54 @@ +#pragma once +#pragma once +#include "LevelModel.h" +#include "LevelData.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..108165cf --- /dev/null +++ b/Array-Jumper/header/Player/MovementDirection.h @@ -0,0 +1,6 @@ +#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..501dc027 --- /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(); + }; +} \ No newline at end of file diff --git a/Array-Jumper/header/Player/PlayerModel.h b/Array-Jumper/header/Player/PlayerModel.h new file mode 100644 index 00000000..257df3e2 --- /dev/null +++ b/Array-Jumper/header/Player/PlayerModel.h @@ -0,0 +1,34 @@ +#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/PlayerView.h b/Array-Jumper/header/Player/PlayerView.h new file mode 100644 index 00000000..db6be535 --- /dev/null +++ b/Array-Jumper/header/Player/PlayerView.h @@ -0,0 +1,31 @@ +#pragma once +#include "../../header/UI/UIElement/ImageView.h" + +namespace Player +{ + class PlayerController; + class PlayerView + { + private: + sf::RenderWindow* game_window; + UI::UIElement::ImageView* player_image; + + float player_height; + float player_width; + + void initializePlayerImage(); + void drawPlayer(); + void loadPlayer(); + void calculatePlayerDimensions(); + void updatePlayerPosition(); + sf::Vector2f calulcatePlayerPosition(); + + public: + PlayerView(); + ~PlayerView(); + + void initialize(); + void update(); + void render(); + }; +} \ No newline at end of file diff --git a/Array-Jumper/source/Global/ServiceLocator.cpp b/Array-Jumper/source/Global/ServiceLocator.cpp index 5aa28494..db45863f 100644 --- a/Array-Jumper/source/Global/ServiceLocator.cpp +++ b/Array-Jumper/source/Global/ServiceLocator.cpp @@ -45,7 +45,7 @@ namespace Global ui_service->update(); } - void ServiceLocator::render() + void ServiceLocator::render() //removed comments { graphic_service->render(); ui_service->render(); diff --git a/Array-Jumper/source/Level/LevelController.cpp b/Array-Jumper/source/Level/LevelController.cpp new file mode 100644 index 00000000..ef9965a8 --- /dev/null +++ b/Array-Jumper/source/Level/LevelController.cpp @@ -0,0 +1,62 @@ +#include "../../header/Level/LevelController.h" +#include "../../header/Level/LevelView.h" +#include "../../header/Level/LevelData.h" +#include "../../header/Main/GameService.h" + +namespace Level +{ + + LevelController::LevelController() + { + level_model = new LevelModel(); + level_view = new LevelView(this); + } + + LevelController::~LevelController() { delete(level_view); delete(level_model); } + + 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); + } + + bool LevelController::isLastLevel() + { + return level_model->isLastLevel(); + } + + void LevelController::loadNextLevel() + { + level_model->loadNextLevel(); + } + + int LevelController::getCurrentLevelNumber() + { + return level_model->getCurrentLevelNumber(); + } + + void LevelController::reset() + { + level_model->reset(); + } + +} \ 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..4e4cbf9c --- /dev/null +++ b/Array-Jumper/source/Level/LevelModel.cpp @@ -0,0 +1,35 @@ +#include "../../header/Level/LevelModel.h" +#include "../../header/Level/LevelConfiguration.h" + +namespace Level +{ + LevelModel::LevelModel() {} + LevelModel::~LevelModel() {} + + BlockType LevelModel::getCurrentBoxValue(int currentPosition) + { + return level_configuration.levels[current_level_index].level_boxes[currentPosition]; + } + + bool LevelModel::isLastLevel() + { + if (current_level_index == LevelConfiguration::NUMBER_OF_LEVELS - 1) + return true; + return false; + } + + void LevelModel::loadNextLevel() + { + current_level_index++; + } + + int LevelModel::getCurrentLevelNumber() + { + return current_level_index + 1; + } + + void LevelModel::reset() + { + current_level_index = 0; + } +} diff --git a/Array-Jumper/source/Level/LevelService.cpp b/Array-Jumper/source/Level/LevelService.cpp new file mode 100644 index 00000000..de8b02d4 --- /dev/null +++ b/Array-Jumper/source/Level/LevelService.cpp @@ -0,0 +1,62 @@ +#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); + } + + bool LevelService::isLastLevel() + { + return level_controller->isLastLevel(); + } + + void LevelService::loadNextLevel() + { + level_controller->loadNextLevel(); + } + + int LevelService::getCurrentLevelNumber() + { + return level_controller->getCurrentLevelNumber(); + } + + void LevelService::resetLevels() + { + level_controller->reset(); + } + + void LevelService::destroy() + { + delete(level_controller); + } +} \ No newline at end of file diff --git a/Array-Jumper/source/Level/LevelView.cpp b/Array-Jumper/source/Level/LevelView.cpp new file mode 100644 index 00000000..f6aff8b6 --- /dev/null +++ b/Array-Jumper/source/Level/LevelView.cpp @@ -0,0 +1,193 @@ +#include "../../header/Level/LevelView.h" +#include "../../header/Level/LevelModel.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;//made + } + + 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() //added boxwidth + { + 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..5eee8287 --- /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..59e04f93 --- /dev/null +++ b/Array-Jumper/source/Player/PlayerModel.cpp @@ -0,0 +1,37 @@ +#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; } +} \ 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..f455bb05 --- /dev/null +++ b/Array-Jumper/source/Player/PlayerView.cpp @@ -0,0 +1,72 @@ +#include "../../header/Player/PlayerView.h" +#include +#include "../../header/Global/Config.h" +#include "../../source/Global/ServiceLocator.cpp" +#include "../../header/UI/UIElement/ImageView.h" + + +using namespace Global; +using namespace UI::UIElement; +//using namespace Level; +namespace Player +{ + 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(); + } + + sf::Vector2f PlayerView::calulcatePlayerPosition() + { + return sf::Vector2f(0, 0); + } + + void PlayerView::updatePlayerPosition() + { + player_image->setPosition(calulcatePlayerPosition()); + } + + void PlayerView::drawPlayer() + { + player_image->render(); + } + + void PlayerView::update() + { + updatePlayerPosition(); + } + + void PlayerView::render() + { + //Yet to implement + } + + void PlayerView::loadPlayer() + { + calculatePlayerDimensions(); + initializePlayerImage(); + } + + void PlayerView::calculatePlayerDimensions() + { + player_height = 1000.f; + player_width = 1000.f; + } + + void PlayerView::initializePlayerImage() + { + player_image->initialize(Config::character_texture_path, + player_width, + player_height, + sf::Vector2f(0, 0)); + } +} \ No newline at end of file