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