From a76850fb1847d8bd4c5c7a5a9f8be9cf04871763 Mon Sep 17 00:00:00 2001 From: Dmitrii Kotov Date: Tue, 13 Aug 2024 01:15:24 +0300 Subject: [PATCH] Fixed failing task #7 (returned leaderboard files) --- .../CollisionsRevisited/src/leaderboard.cpp | 28 +++ .../src/leaderboardscene.cpp | 163 ++++++++++++++++++ .../CollisionsRevisited/task-info.yaml | 4 + .../Encapsulation/src/leaderboard.cpp | 28 +++ .../Encapsulation/src/leaderboardscene.cpp | 163 ++++++++++++++++++ .../Encapsulation/task-info.yaml | 4 + .../Inheritance/src/leaderboard.cpp | 28 +++ .../Inheritance/src/leaderboardscene.cpp | 163 ++++++++++++++++++ .../Inheritance/task-info.yaml | 4 + .../IntroducingObjects/src/leaderboard.cpp | 28 +++ .../src/leaderboardscene.cpp | 163 ++++++++++++++++++ .../IntroducingObjects/task-info.yaml | 4 + .../Introduction/src/leaderboard.cpp | 28 +++ .../Introduction/src/leaderboardscene.cpp | 163 ++++++++++++++++++ .../Introduction/task-info.yaml | 4 + .../ClassesAndObjects/NameInput/test/test.cpp | 2 +- .../NewChallenge/src/leaderboard.cpp | 28 +++ .../NewChallenge/src/leaderboardscene.cpp | 163 ++++++++++++++++++ .../NewChallenge/task-info.yaml | 4 + .../NewDynamics/src/leaderboard.cpp | 28 +++ .../NewDynamics/src/leaderboardscene.cpp | 163 ++++++++++++++++++ .../NewDynamics/task-info.yaml | 4 + .../OperatorsOverloading/src/leaderboard.cpp | 28 +++ .../src/leaderboardscene.cpp | 163 ++++++++++++++++++ .../OperatorsOverloading/task-info.yaml | 4 + .../Polymorphism/src/leaderboard.cpp | 28 +++ .../Polymorphism/src/leaderboardscene.cpp | 163 ++++++++++++++++++ .../Polymorphism/task-info.yaml | 4 + .../SceneTransition/test/test.cpp | 2 +- .../StaticMembers/CMakeLists.txt | 1 + .../StaticMembers/src/leaderboard.cpp | 28 +++ .../StaticMembers/src/leaderboardscene.cpp | 163 ++++++++++++++++++ .../StaticMembers/task-info.yaml | 4 + 33 files changed, 1953 insertions(+), 2 deletions(-) create mode 100644 ObjectOrientedProgramming/ClassesAndObjects/CollisionsRevisited/src/leaderboard.cpp create mode 100644 ObjectOrientedProgramming/ClassesAndObjects/CollisionsRevisited/src/leaderboardscene.cpp create mode 100644 ObjectOrientedProgramming/ClassesAndObjects/Encapsulation/src/leaderboard.cpp create mode 100644 ObjectOrientedProgramming/ClassesAndObjects/Encapsulation/src/leaderboardscene.cpp create mode 100644 ObjectOrientedProgramming/ClassesAndObjects/Inheritance/src/leaderboard.cpp create mode 100644 ObjectOrientedProgramming/ClassesAndObjects/Inheritance/src/leaderboardscene.cpp create mode 100644 ObjectOrientedProgramming/ClassesAndObjects/IntroducingObjects/src/leaderboard.cpp create mode 100644 ObjectOrientedProgramming/ClassesAndObjects/IntroducingObjects/src/leaderboardscene.cpp create mode 100644 ObjectOrientedProgramming/ClassesAndObjects/Introduction/src/leaderboard.cpp create mode 100644 ObjectOrientedProgramming/ClassesAndObjects/Introduction/src/leaderboardscene.cpp create mode 100644 ObjectOrientedProgramming/ClassesAndObjects/NewChallenge/src/leaderboard.cpp create mode 100644 ObjectOrientedProgramming/ClassesAndObjects/NewChallenge/src/leaderboardscene.cpp create mode 100644 ObjectOrientedProgramming/ClassesAndObjects/NewDynamics/src/leaderboard.cpp create mode 100644 ObjectOrientedProgramming/ClassesAndObjects/NewDynamics/src/leaderboardscene.cpp create mode 100644 ObjectOrientedProgramming/ClassesAndObjects/OperatorsOverloading/src/leaderboard.cpp create mode 100644 ObjectOrientedProgramming/ClassesAndObjects/OperatorsOverloading/src/leaderboardscene.cpp create mode 100644 ObjectOrientedProgramming/ClassesAndObjects/Polymorphism/src/leaderboard.cpp create mode 100644 ObjectOrientedProgramming/ClassesAndObjects/Polymorphism/src/leaderboardscene.cpp create mode 100644 ObjectOrientedProgramming/ClassesAndObjects/StaticMembers/src/leaderboard.cpp create mode 100644 ObjectOrientedProgramming/ClassesAndObjects/StaticMembers/src/leaderboardscene.cpp diff --git a/ObjectOrientedProgramming/ClassesAndObjects/CollisionsRevisited/src/leaderboard.cpp b/ObjectOrientedProgramming/ClassesAndObjects/CollisionsRevisited/src/leaderboard.cpp new file mode 100644 index 0000000..a4c3653 --- /dev/null +++ b/ObjectOrientedProgramming/ClassesAndObjects/CollisionsRevisited/src/leaderboard.cpp @@ -0,0 +1,28 @@ +#include "leaderboard.hpp" +#include "constants.hpp" + +void Leaderboard::loadScores() { + // TODO: write your solution here +} + +void Leaderboard::addScore(unsigned int score, std::string & name) { + // TODO: write your solution here +} + +void Leaderboard::saveScores() { + // TODO: write your solution here +} + +void Leaderboard::updateScore(unsigned int score, std::string & name) { + // TODO: write your solution here +} + +sf::Text createText(const std::string &str, const sf::Font &font, const unsigned int size, const float x, const float y) { + sf::Text text; + text.setFont(font); + text.setCharacterSize(size); + text.setFillColor(sf::Color::White); + text.setString(str); + text.setPosition(x, y); + return text; +} diff --git a/ObjectOrientedProgramming/ClassesAndObjects/CollisionsRevisited/src/leaderboardscene.cpp b/ObjectOrientedProgramming/ClassesAndObjects/CollisionsRevisited/src/leaderboardscene.cpp new file mode 100644 index 0000000..d1fa187 --- /dev/null +++ b/ObjectOrientedProgramming/ClassesAndObjects/CollisionsRevisited/src/leaderboardscene.cpp @@ -0,0 +1,163 @@ +#include "leaderboardscene.hpp" +#include "constants.hpp" +#include "operators.hpp" + +LeaderboardScene::LeaderboardScene() : Scene(SCENE_WIDTH, SCENE_HEIGHT) { + state = LeaderboardState::INSERT_NAME; + playerName = ""; + playerScore = 0; + font = TextureManager::getFont(); +} + +void LeaderboardScene::activate() { + return; +} + +void LeaderboardScene::deactivate() { + return; +} + +SceneID LeaderboardScene::getID() const { + return SceneID::LEADERBOARD; +} + +SceneID LeaderboardScene::getNextSceneID() const { + return SceneID::LEADERBOARD; +} + +void LeaderboardScene::processText(const sf::Event &event) { + // TODO: Write your solution here +} + +void LeaderboardScene::processBackspace() { + // TODO: Write your solution here +} + +void LeaderboardScene::processEnter() { + // TODO: Write your solution here +} + +void LeaderboardScene::processEvent(const sf::Event &event) { + if (state == LeaderboardState::INSERT_NAME) { + if (event.type == sf::Event::TextEntered) { + processText(event); + } else if (event.type == sf::Event::KeyPressed) { + if (event.key.code == sf::Keyboard::BackSpace) { + processBackspace(); + } else if (event.key.code == sf::Keyboard::Enter) { + processEnter(); + } + } + } +} + +void LeaderboardScene::update(sf::Time delta) { + return; +} + +void LeaderboardScene::draw(sf::RenderWindow &window, TextureManager &textureManager) { + window.clear(sf::Color::Black); + if (state == LeaderboardState::INSERT_NAME) { + drawInsertNameScreen(window); + } else if (state == LeaderboardState::SHOW_LEADERBOARD) { + drawLeaderboard(window); + } +} + +void LeaderboardScene::drawInsertNameScreen(sf::RenderWindow &window) { + sf::RectangleShape inputBox(sf::Vector2f(INPUTBOX_WIDTH, INPUTBOX_HEIGHT)); + inputBox.setSize(sf::Vector2f(INPUTBOX_WIDTH, INPUTBOX_HEIGHT)); + inputBox.setFillColor(sf::Color::Black); + inputBox.setOutlineColor(sf::Color::White); + inputBox.setOutlineThickness(2); + inputBox.setPosition(SCENE_WIDTH / 2 - inputBox.getSize().x / 2, SCENE_HEIGHT / 2 - inputBox.getSize().y / 2); + + sf::Text prompt; + prompt.setFont(font); + prompt.setString("Insert Name"); + prompt.setCharacterSize(INPUTNAME_FONT_SIZE); + prompt.setFillColor(sf::Color::White); + prompt.setPosition(SCENE_WIDTH / 2 - prompt.getGlobalBounds().width / 2, SCENE_HEIGHT / 2 - inputBox.getSize().y / 2 - 100); + + sf::Text nameText; + nameText.setFont(font); + nameText.setString(playerName); + nameText.setCharacterSize(INPUTNAME_FONT_SIZE); + nameText.setFillColor(sf::Color::White); + + sf::FloatRect textBounds = nameText.getLocalBounds(); + float textHeight = textBounds.height; + float textYOffset = textBounds.top; + float inputBoxCenterY = inputBox.getPosition().y + inputBox.getSize().y / 2; + nameText.setPosition(SCENE_WIDTH / 2 - textBounds.width / 2, inputBoxCenterY - textHeight / 2 - textYOffset); + + window.draw(inputBox); + window.draw(prompt); + window.draw(nameText); +} + +void LeaderboardScene::drawLeaderboard(sf::RenderWindow &window) { + sf::Text header = createText("LEADERBOARD", font, HEADER_FONT_SIZE, HEADER_X, HEADER_Y); + window.draw(header); + + sf::Text posHeader = createText("POS", font, LEADERBOARD_FONT_SIZE, POS_HEADER_X, POS_HEADER_Y); + window.draw(posHeader); + + sf::Text nameHeader = createText("NAME", font, LEADERBOARD_FONT_SIZE, NAME_HEADER_X, NAME_HEADER_Y); + window.draw(nameHeader); + + sf::Text scoreHeader = createText("SCORE", font, LEADERBOARD_FONT_SIZE, SCORE_HEADER_X, SCORE_HEADER_Y); + window.draw(scoreHeader); + + unsigned int NUMBER_OF_ROWS = leaderboard.getScores().size(); + float LEADERBOARD_HEIGHT = ROW_HEIGHT * (NUMBER_OF_ROWS + 1); // One additional row for the header + + // Draw horizontal lines + sf::RectangleShape line(sf::Vector2f(LEADERBOARD_WIDTH, 2)); + line.setFillColor(sf::Color::White); + for (unsigned int i = 0; i <= NUMBER_OF_ROWS + 1; ++i) { + line.setPosition(LEADERBOARD_X, LEADERBOARD_Y + i * ROW_HEIGHT); + window.draw(line); + } + + // Draw vertical lines + sf::RectangleShape line1(sf::Vector2f(2, LEADERBOARD_HEIGHT)); + line1.setPosition(LEADERBOARD_X, LEADERBOARD_Y); + window.draw(line1); + sf::RectangleShape line2(sf::Vector2f(2, LEADERBOARD_HEIGHT)); + line2.setPosition(LEADERBOARD_X + 50, LEADERBOARD_Y); + window.draw(line2); + sf::RectangleShape line3(sf::Vector2f(2, LEADERBOARD_HEIGHT)); + line3.setPosition(LEADERBOARD_X + 450, LEADERBOARD_Y); + window.draw(line3); + sf::RectangleShape line4(sf::Vector2f(2, LEADERBOARD_HEIGHT)); + line4.setPosition(LEADERBOARD_X + 600, LEADERBOARD_Y); + window.draw(line4); + + // Draw contents of the leaderboard + auto scores = leaderboard.getScores(); + for (std::size_t i = 0; i < scores.size(); ++i) { + auto it = std::next(scores.begin(), i); + + sf::Text pos; + if (i != 9) { + pos = createText(std::to_string(i + 1), font, LEADERBOARD_FONT_SIZE, LEADERBOARD_X + TWO_DIGIT_POS_OFFSET, LEADERBOARD_Y + ROW_HEIGHT * (i + 1) + BORDER_OFFSET); + } else { + pos = createText(std::to_string(i + 1), font, LEADERBOARD_FONT_SIZE, LEADERBOARD_X + ONE_DIGIT_POS_OFFSET, LEADERBOARD_Y + ROW_HEIGHT * (i + 1) + BORDER_OFFSET); + } + window.draw(pos); + + sf::Text name = createText(it->second, font, LEADERBOARD_FONT_SIZE, LEADERBOARD_X + NAME_X_OFFSET, LEADERBOARD_Y + ROW_HEIGHT * (i + 1) + BORDER_OFFSET); + window.draw(name); + + sf::Text score; + if (std::to_string(it->first).length() == 1) { + score = createText(std::to_string(it->first), font, LEADERBOARD_FONT_SIZE, LEADERBOARD_X + ONE_DIGIT_SCORE_OFFSET, LEADERBOARD_Y + ROW_HEIGHT * (i + 1) + BORDER_OFFSET); + } else if (std::to_string(it->first).length() == 4) { + score = createText(std::to_string(it->first), font, LEADERBOARD_FONT_SIZE, LEADERBOARD_X + FOUR_DIGIT_SCORE_OFFSET, LEADERBOARD_Y + ROW_HEIGHT * (i + 1) + BORDER_OFFSET); + } else { + score = createText(std::to_string(it->first), font, LEADERBOARD_FONT_SIZE, LEADERBOARD_X + FIVE_DIGIT_SCORE_OFFSET, LEADERBOARD_Y + ROW_HEIGHT * (i + 1) + BORDER_OFFSET); + } + window.draw(score); + } +} diff --git a/ObjectOrientedProgramming/ClassesAndObjects/CollisionsRevisited/task-info.yaml b/ObjectOrientedProgramming/ClassesAndObjects/CollisionsRevisited/task-info.yaml index 2a92def..8d15401 100644 --- a/ObjectOrientedProgramming/ClassesAndObjects/CollisionsRevisited/task-info.yaml +++ b/ObjectOrientedProgramming/ClassesAndObjects/CollisionsRevisited/task-info.yaml @@ -45,3 +45,7 @@ files: - name: test/test.cpp visible: false propagatable: false +- name: src/leaderboard.cpp + visible: false +- name: src/leaderboardscene.cpp + visible: false diff --git a/ObjectOrientedProgramming/ClassesAndObjects/Encapsulation/src/leaderboard.cpp b/ObjectOrientedProgramming/ClassesAndObjects/Encapsulation/src/leaderboard.cpp new file mode 100644 index 0000000..a4c3653 --- /dev/null +++ b/ObjectOrientedProgramming/ClassesAndObjects/Encapsulation/src/leaderboard.cpp @@ -0,0 +1,28 @@ +#include "leaderboard.hpp" +#include "constants.hpp" + +void Leaderboard::loadScores() { + // TODO: write your solution here +} + +void Leaderboard::addScore(unsigned int score, std::string & name) { + // TODO: write your solution here +} + +void Leaderboard::saveScores() { + // TODO: write your solution here +} + +void Leaderboard::updateScore(unsigned int score, std::string & name) { + // TODO: write your solution here +} + +sf::Text createText(const std::string &str, const sf::Font &font, const unsigned int size, const float x, const float y) { + sf::Text text; + text.setFont(font); + text.setCharacterSize(size); + text.setFillColor(sf::Color::White); + text.setString(str); + text.setPosition(x, y); + return text; +} diff --git a/ObjectOrientedProgramming/ClassesAndObjects/Encapsulation/src/leaderboardscene.cpp b/ObjectOrientedProgramming/ClassesAndObjects/Encapsulation/src/leaderboardscene.cpp new file mode 100644 index 0000000..d1fa187 --- /dev/null +++ b/ObjectOrientedProgramming/ClassesAndObjects/Encapsulation/src/leaderboardscene.cpp @@ -0,0 +1,163 @@ +#include "leaderboardscene.hpp" +#include "constants.hpp" +#include "operators.hpp" + +LeaderboardScene::LeaderboardScene() : Scene(SCENE_WIDTH, SCENE_HEIGHT) { + state = LeaderboardState::INSERT_NAME; + playerName = ""; + playerScore = 0; + font = TextureManager::getFont(); +} + +void LeaderboardScene::activate() { + return; +} + +void LeaderboardScene::deactivate() { + return; +} + +SceneID LeaderboardScene::getID() const { + return SceneID::LEADERBOARD; +} + +SceneID LeaderboardScene::getNextSceneID() const { + return SceneID::LEADERBOARD; +} + +void LeaderboardScene::processText(const sf::Event &event) { + // TODO: Write your solution here +} + +void LeaderboardScene::processBackspace() { + // TODO: Write your solution here +} + +void LeaderboardScene::processEnter() { + // TODO: Write your solution here +} + +void LeaderboardScene::processEvent(const sf::Event &event) { + if (state == LeaderboardState::INSERT_NAME) { + if (event.type == sf::Event::TextEntered) { + processText(event); + } else if (event.type == sf::Event::KeyPressed) { + if (event.key.code == sf::Keyboard::BackSpace) { + processBackspace(); + } else if (event.key.code == sf::Keyboard::Enter) { + processEnter(); + } + } + } +} + +void LeaderboardScene::update(sf::Time delta) { + return; +} + +void LeaderboardScene::draw(sf::RenderWindow &window, TextureManager &textureManager) { + window.clear(sf::Color::Black); + if (state == LeaderboardState::INSERT_NAME) { + drawInsertNameScreen(window); + } else if (state == LeaderboardState::SHOW_LEADERBOARD) { + drawLeaderboard(window); + } +} + +void LeaderboardScene::drawInsertNameScreen(sf::RenderWindow &window) { + sf::RectangleShape inputBox(sf::Vector2f(INPUTBOX_WIDTH, INPUTBOX_HEIGHT)); + inputBox.setSize(sf::Vector2f(INPUTBOX_WIDTH, INPUTBOX_HEIGHT)); + inputBox.setFillColor(sf::Color::Black); + inputBox.setOutlineColor(sf::Color::White); + inputBox.setOutlineThickness(2); + inputBox.setPosition(SCENE_WIDTH / 2 - inputBox.getSize().x / 2, SCENE_HEIGHT / 2 - inputBox.getSize().y / 2); + + sf::Text prompt; + prompt.setFont(font); + prompt.setString("Insert Name"); + prompt.setCharacterSize(INPUTNAME_FONT_SIZE); + prompt.setFillColor(sf::Color::White); + prompt.setPosition(SCENE_WIDTH / 2 - prompt.getGlobalBounds().width / 2, SCENE_HEIGHT / 2 - inputBox.getSize().y / 2 - 100); + + sf::Text nameText; + nameText.setFont(font); + nameText.setString(playerName); + nameText.setCharacterSize(INPUTNAME_FONT_SIZE); + nameText.setFillColor(sf::Color::White); + + sf::FloatRect textBounds = nameText.getLocalBounds(); + float textHeight = textBounds.height; + float textYOffset = textBounds.top; + float inputBoxCenterY = inputBox.getPosition().y + inputBox.getSize().y / 2; + nameText.setPosition(SCENE_WIDTH / 2 - textBounds.width / 2, inputBoxCenterY - textHeight / 2 - textYOffset); + + window.draw(inputBox); + window.draw(prompt); + window.draw(nameText); +} + +void LeaderboardScene::drawLeaderboard(sf::RenderWindow &window) { + sf::Text header = createText("LEADERBOARD", font, HEADER_FONT_SIZE, HEADER_X, HEADER_Y); + window.draw(header); + + sf::Text posHeader = createText("POS", font, LEADERBOARD_FONT_SIZE, POS_HEADER_X, POS_HEADER_Y); + window.draw(posHeader); + + sf::Text nameHeader = createText("NAME", font, LEADERBOARD_FONT_SIZE, NAME_HEADER_X, NAME_HEADER_Y); + window.draw(nameHeader); + + sf::Text scoreHeader = createText("SCORE", font, LEADERBOARD_FONT_SIZE, SCORE_HEADER_X, SCORE_HEADER_Y); + window.draw(scoreHeader); + + unsigned int NUMBER_OF_ROWS = leaderboard.getScores().size(); + float LEADERBOARD_HEIGHT = ROW_HEIGHT * (NUMBER_OF_ROWS + 1); // One additional row for the header + + // Draw horizontal lines + sf::RectangleShape line(sf::Vector2f(LEADERBOARD_WIDTH, 2)); + line.setFillColor(sf::Color::White); + for (unsigned int i = 0; i <= NUMBER_OF_ROWS + 1; ++i) { + line.setPosition(LEADERBOARD_X, LEADERBOARD_Y + i * ROW_HEIGHT); + window.draw(line); + } + + // Draw vertical lines + sf::RectangleShape line1(sf::Vector2f(2, LEADERBOARD_HEIGHT)); + line1.setPosition(LEADERBOARD_X, LEADERBOARD_Y); + window.draw(line1); + sf::RectangleShape line2(sf::Vector2f(2, LEADERBOARD_HEIGHT)); + line2.setPosition(LEADERBOARD_X + 50, LEADERBOARD_Y); + window.draw(line2); + sf::RectangleShape line3(sf::Vector2f(2, LEADERBOARD_HEIGHT)); + line3.setPosition(LEADERBOARD_X + 450, LEADERBOARD_Y); + window.draw(line3); + sf::RectangleShape line4(sf::Vector2f(2, LEADERBOARD_HEIGHT)); + line4.setPosition(LEADERBOARD_X + 600, LEADERBOARD_Y); + window.draw(line4); + + // Draw contents of the leaderboard + auto scores = leaderboard.getScores(); + for (std::size_t i = 0; i < scores.size(); ++i) { + auto it = std::next(scores.begin(), i); + + sf::Text pos; + if (i != 9) { + pos = createText(std::to_string(i + 1), font, LEADERBOARD_FONT_SIZE, LEADERBOARD_X + TWO_DIGIT_POS_OFFSET, LEADERBOARD_Y + ROW_HEIGHT * (i + 1) + BORDER_OFFSET); + } else { + pos = createText(std::to_string(i + 1), font, LEADERBOARD_FONT_SIZE, LEADERBOARD_X + ONE_DIGIT_POS_OFFSET, LEADERBOARD_Y + ROW_HEIGHT * (i + 1) + BORDER_OFFSET); + } + window.draw(pos); + + sf::Text name = createText(it->second, font, LEADERBOARD_FONT_SIZE, LEADERBOARD_X + NAME_X_OFFSET, LEADERBOARD_Y + ROW_HEIGHT * (i + 1) + BORDER_OFFSET); + window.draw(name); + + sf::Text score; + if (std::to_string(it->first).length() == 1) { + score = createText(std::to_string(it->first), font, LEADERBOARD_FONT_SIZE, LEADERBOARD_X + ONE_DIGIT_SCORE_OFFSET, LEADERBOARD_Y + ROW_HEIGHT * (i + 1) + BORDER_OFFSET); + } else if (std::to_string(it->first).length() == 4) { + score = createText(std::to_string(it->first), font, LEADERBOARD_FONT_SIZE, LEADERBOARD_X + FOUR_DIGIT_SCORE_OFFSET, LEADERBOARD_Y + ROW_HEIGHT * (i + 1) + BORDER_OFFSET); + } else { + score = createText(std::to_string(it->first), font, LEADERBOARD_FONT_SIZE, LEADERBOARD_X + FIVE_DIGIT_SCORE_OFFSET, LEADERBOARD_Y + ROW_HEIGHT * (i + 1) + BORDER_OFFSET); + } + window.draw(score); + } +} diff --git a/ObjectOrientedProgramming/ClassesAndObjects/Encapsulation/task-info.yaml b/ObjectOrientedProgramming/ClassesAndObjects/Encapsulation/task-info.yaml index 266f786..df323d4 100644 --- a/ObjectOrientedProgramming/ClassesAndObjects/Encapsulation/task-info.yaml +++ b/ObjectOrientedProgramming/ClassesAndObjects/Encapsulation/task-info.yaml @@ -45,3 +45,7 @@ files: - name: test/test.cpp visible: false propagatable: false +- name: src/leaderboard.cpp + visible: false +- name: src/leaderboardscene.cpp + visible: false diff --git a/ObjectOrientedProgramming/ClassesAndObjects/Inheritance/src/leaderboard.cpp b/ObjectOrientedProgramming/ClassesAndObjects/Inheritance/src/leaderboard.cpp new file mode 100644 index 0000000..a4c3653 --- /dev/null +++ b/ObjectOrientedProgramming/ClassesAndObjects/Inheritance/src/leaderboard.cpp @@ -0,0 +1,28 @@ +#include "leaderboard.hpp" +#include "constants.hpp" + +void Leaderboard::loadScores() { + // TODO: write your solution here +} + +void Leaderboard::addScore(unsigned int score, std::string & name) { + // TODO: write your solution here +} + +void Leaderboard::saveScores() { + // TODO: write your solution here +} + +void Leaderboard::updateScore(unsigned int score, std::string & name) { + // TODO: write your solution here +} + +sf::Text createText(const std::string &str, const sf::Font &font, const unsigned int size, const float x, const float y) { + sf::Text text; + text.setFont(font); + text.setCharacterSize(size); + text.setFillColor(sf::Color::White); + text.setString(str); + text.setPosition(x, y); + return text; +} diff --git a/ObjectOrientedProgramming/ClassesAndObjects/Inheritance/src/leaderboardscene.cpp b/ObjectOrientedProgramming/ClassesAndObjects/Inheritance/src/leaderboardscene.cpp new file mode 100644 index 0000000..d1fa187 --- /dev/null +++ b/ObjectOrientedProgramming/ClassesAndObjects/Inheritance/src/leaderboardscene.cpp @@ -0,0 +1,163 @@ +#include "leaderboardscene.hpp" +#include "constants.hpp" +#include "operators.hpp" + +LeaderboardScene::LeaderboardScene() : Scene(SCENE_WIDTH, SCENE_HEIGHT) { + state = LeaderboardState::INSERT_NAME; + playerName = ""; + playerScore = 0; + font = TextureManager::getFont(); +} + +void LeaderboardScene::activate() { + return; +} + +void LeaderboardScene::deactivate() { + return; +} + +SceneID LeaderboardScene::getID() const { + return SceneID::LEADERBOARD; +} + +SceneID LeaderboardScene::getNextSceneID() const { + return SceneID::LEADERBOARD; +} + +void LeaderboardScene::processText(const sf::Event &event) { + // TODO: Write your solution here +} + +void LeaderboardScene::processBackspace() { + // TODO: Write your solution here +} + +void LeaderboardScene::processEnter() { + // TODO: Write your solution here +} + +void LeaderboardScene::processEvent(const sf::Event &event) { + if (state == LeaderboardState::INSERT_NAME) { + if (event.type == sf::Event::TextEntered) { + processText(event); + } else if (event.type == sf::Event::KeyPressed) { + if (event.key.code == sf::Keyboard::BackSpace) { + processBackspace(); + } else if (event.key.code == sf::Keyboard::Enter) { + processEnter(); + } + } + } +} + +void LeaderboardScene::update(sf::Time delta) { + return; +} + +void LeaderboardScene::draw(sf::RenderWindow &window, TextureManager &textureManager) { + window.clear(sf::Color::Black); + if (state == LeaderboardState::INSERT_NAME) { + drawInsertNameScreen(window); + } else if (state == LeaderboardState::SHOW_LEADERBOARD) { + drawLeaderboard(window); + } +} + +void LeaderboardScene::drawInsertNameScreen(sf::RenderWindow &window) { + sf::RectangleShape inputBox(sf::Vector2f(INPUTBOX_WIDTH, INPUTBOX_HEIGHT)); + inputBox.setSize(sf::Vector2f(INPUTBOX_WIDTH, INPUTBOX_HEIGHT)); + inputBox.setFillColor(sf::Color::Black); + inputBox.setOutlineColor(sf::Color::White); + inputBox.setOutlineThickness(2); + inputBox.setPosition(SCENE_WIDTH / 2 - inputBox.getSize().x / 2, SCENE_HEIGHT / 2 - inputBox.getSize().y / 2); + + sf::Text prompt; + prompt.setFont(font); + prompt.setString("Insert Name"); + prompt.setCharacterSize(INPUTNAME_FONT_SIZE); + prompt.setFillColor(sf::Color::White); + prompt.setPosition(SCENE_WIDTH / 2 - prompt.getGlobalBounds().width / 2, SCENE_HEIGHT / 2 - inputBox.getSize().y / 2 - 100); + + sf::Text nameText; + nameText.setFont(font); + nameText.setString(playerName); + nameText.setCharacterSize(INPUTNAME_FONT_SIZE); + nameText.setFillColor(sf::Color::White); + + sf::FloatRect textBounds = nameText.getLocalBounds(); + float textHeight = textBounds.height; + float textYOffset = textBounds.top; + float inputBoxCenterY = inputBox.getPosition().y + inputBox.getSize().y / 2; + nameText.setPosition(SCENE_WIDTH / 2 - textBounds.width / 2, inputBoxCenterY - textHeight / 2 - textYOffset); + + window.draw(inputBox); + window.draw(prompt); + window.draw(nameText); +} + +void LeaderboardScene::drawLeaderboard(sf::RenderWindow &window) { + sf::Text header = createText("LEADERBOARD", font, HEADER_FONT_SIZE, HEADER_X, HEADER_Y); + window.draw(header); + + sf::Text posHeader = createText("POS", font, LEADERBOARD_FONT_SIZE, POS_HEADER_X, POS_HEADER_Y); + window.draw(posHeader); + + sf::Text nameHeader = createText("NAME", font, LEADERBOARD_FONT_SIZE, NAME_HEADER_X, NAME_HEADER_Y); + window.draw(nameHeader); + + sf::Text scoreHeader = createText("SCORE", font, LEADERBOARD_FONT_SIZE, SCORE_HEADER_X, SCORE_HEADER_Y); + window.draw(scoreHeader); + + unsigned int NUMBER_OF_ROWS = leaderboard.getScores().size(); + float LEADERBOARD_HEIGHT = ROW_HEIGHT * (NUMBER_OF_ROWS + 1); // One additional row for the header + + // Draw horizontal lines + sf::RectangleShape line(sf::Vector2f(LEADERBOARD_WIDTH, 2)); + line.setFillColor(sf::Color::White); + for (unsigned int i = 0; i <= NUMBER_OF_ROWS + 1; ++i) { + line.setPosition(LEADERBOARD_X, LEADERBOARD_Y + i * ROW_HEIGHT); + window.draw(line); + } + + // Draw vertical lines + sf::RectangleShape line1(sf::Vector2f(2, LEADERBOARD_HEIGHT)); + line1.setPosition(LEADERBOARD_X, LEADERBOARD_Y); + window.draw(line1); + sf::RectangleShape line2(sf::Vector2f(2, LEADERBOARD_HEIGHT)); + line2.setPosition(LEADERBOARD_X + 50, LEADERBOARD_Y); + window.draw(line2); + sf::RectangleShape line3(sf::Vector2f(2, LEADERBOARD_HEIGHT)); + line3.setPosition(LEADERBOARD_X + 450, LEADERBOARD_Y); + window.draw(line3); + sf::RectangleShape line4(sf::Vector2f(2, LEADERBOARD_HEIGHT)); + line4.setPosition(LEADERBOARD_X + 600, LEADERBOARD_Y); + window.draw(line4); + + // Draw contents of the leaderboard + auto scores = leaderboard.getScores(); + for (std::size_t i = 0; i < scores.size(); ++i) { + auto it = std::next(scores.begin(), i); + + sf::Text pos; + if (i != 9) { + pos = createText(std::to_string(i + 1), font, LEADERBOARD_FONT_SIZE, LEADERBOARD_X + TWO_DIGIT_POS_OFFSET, LEADERBOARD_Y + ROW_HEIGHT * (i + 1) + BORDER_OFFSET); + } else { + pos = createText(std::to_string(i + 1), font, LEADERBOARD_FONT_SIZE, LEADERBOARD_X + ONE_DIGIT_POS_OFFSET, LEADERBOARD_Y + ROW_HEIGHT * (i + 1) + BORDER_OFFSET); + } + window.draw(pos); + + sf::Text name = createText(it->second, font, LEADERBOARD_FONT_SIZE, LEADERBOARD_X + NAME_X_OFFSET, LEADERBOARD_Y + ROW_HEIGHT * (i + 1) + BORDER_OFFSET); + window.draw(name); + + sf::Text score; + if (std::to_string(it->first).length() == 1) { + score = createText(std::to_string(it->first), font, LEADERBOARD_FONT_SIZE, LEADERBOARD_X + ONE_DIGIT_SCORE_OFFSET, LEADERBOARD_Y + ROW_HEIGHT * (i + 1) + BORDER_OFFSET); + } else if (std::to_string(it->first).length() == 4) { + score = createText(std::to_string(it->first), font, LEADERBOARD_FONT_SIZE, LEADERBOARD_X + FOUR_DIGIT_SCORE_OFFSET, LEADERBOARD_Y + ROW_HEIGHT * (i + 1) + BORDER_OFFSET); + } else { + score = createText(std::to_string(it->first), font, LEADERBOARD_FONT_SIZE, LEADERBOARD_X + FIVE_DIGIT_SCORE_OFFSET, LEADERBOARD_Y + ROW_HEIGHT * (i + 1) + BORDER_OFFSET); + } + window.draw(score); + } +} diff --git a/ObjectOrientedProgramming/ClassesAndObjects/Inheritance/task-info.yaml b/ObjectOrientedProgramming/ClassesAndObjects/Inheritance/task-info.yaml index 3e8a3ab..a156b5f 100644 --- a/ObjectOrientedProgramming/ClassesAndObjects/Inheritance/task-info.yaml +++ b/ObjectOrientedProgramming/ClassesAndObjects/Inheritance/task-info.yaml @@ -45,3 +45,7 @@ files: - name: test/test.cpp visible: false propagatable: false +- name: src/leaderboard.cpp + visible: false +- name: src/leaderboardscene.cpp + visible: false diff --git a/ObjectOrientedProgramming/ClassesAndObjects/IntroducingObjects/src/leaderboard.cpp b/ObjectOrientedProgramming/ClassesAndObjects/IntroducingObjects/src/leaderboard.cpp new file mode 100644 index 0000000..a4c3653 --- /dev/null +++ b/ObjectOrientedProgramming/ClassesAndObjects/IntroducingObjects/src/leaderboard.cpp @@ -0,0 +1,28 @@ +#include "leaderboard.hpp" +#include "constants.hpp" + +void Leaderboard::loadScores() { + // TODO: write your solution here +} + +void Leaderboard::addScore(unsigned int score, std::string & name) { + // TODO: write your solution here +} + +void Leaderboard::saveScores() { + // TODO: write your solution here +} + +void Leaderboard::updateScore(unsigned int score, std::string & name) { + // TODO: write your solution here +} + +sf::Text createText(const std::string &str, const sf::Font &font, const unsigned int size, const float x, const float y) { + sf::Text text; + text.setFont(font); + text.setCharacterSize(size); + text.setFillColor(sf::Color::White); + text.setString(str); + text.setPosition(x, y); + return text; +} diff --git a/ObjectOrientedProgramming/ClassesAndObjects/IntroducingObjects/src/leaderboardscene.cpp b/ObjectOrientedProgramming/ClassesAndObjects/IntroducingObjects/src/leaderboardscene.cpp new file mode 100644 index 0000000..d1fa187 --- /dev/null +++ b/ObjectOrientedProgramming/ClassesAndObjects/IntroducingObjects/src/leaderboardscene.cpp @@ -0,0 +1,163 @@ +#include "leaderboardscene.hpp" +#include "constants.hpp" +#include "operators.hpp" + +LeaderboardScene::LeaderboardScene() : Scene(SCENE_WIDTH, SCENE_HEIGHT) { + state = LeaderboardState::INSERT_NAME; + playerName = ""; + playerScore = 0; + font = TextureManager::getFont(); +} + +void LeaderboardScene::activate() { + return; +} + +void LeaderboardScene::deactivate() { + return; +} + +SceneID LeaderboardScene::getID() const { + return SceneID::LEADERBOARD; +} + +SceneID LeaderboardScene::getNextSceneID() const { + return SceneID::LEADERBOARD; +} + +void LeaderboardScene::processText(const sf::Event &event) { + // TODO: Write your solution here +} + +void LeaderboardScene::processBackspace() { + // TODO: Write your solution here +} + +void LeaderboardScene::processEnter() { + // TODO: Write your solution here +} + +void LeaderboardScene::processEvent(const sf::Event &event) { + if (state == LeaderboardState::INSERT_NAME) { + if (event.type == sf::Event::TextEntered) { + processText(event); + } else if (event.type == sf::Event::KeyPressed) { + if (event.key.code == sf::Keyboard::BackSpace) { + processBackspace(); + } else if (event.key.code == sf::Keyboard::Enter) { + processEnter(); + } + } + } +} + +void LeaderboardScene::update(sf::Time delta) { + return; +} + +void LeaderboardScene::draw(sf::RenderWindow &window, TextureManager &textureManager) { + window.clear(sf::Color::Black); + if (state == LeaderboardState::INSERT_NAME) { + drawInsertNameScreen(window); + } else if (state == LeaderboardState::SHOW_LEADERBOARD) { + drawLeaderboard(window); + } +} + +void LeaderboardScene::drawInsertNameScreen(sf::RenderWindow &window) { + sf::RectangleShape inputBox(sf::Vector2f(INPUTBOX_WIDTH, INPUTBOX_HEIGHT)); + inputBox.setSize(sf::Vector2f(INPUTBOX_WIDTH, INPUTBOX_HEIGHT)); + inputBox.setFillColor(sf::Color::Black); + inputBox.setOutlineColor(sf::Color::White); + inputBox.setOutlineThickness(2); + inputBox.setPosition(SCENE_WIDTH / 2 - inputBox.getSize().x / 2, SCENE_HEIGHT / 2 - inputBox.getSize().y / 2); + + sf::Text prompt; + prompt.setFont(font); + prompt.setString("Insert Name"); + prompt.setCharacterSize(INPUTNAME_FONT_SIZE); + prompt.setFillColor(sf::Color::White); + prompt.setPosition(SCENE_WIDTH / 2 - prompt.getGlobalBounds().width / 2, SCENE_HEIGHT / 2 - inputBox.getSize().y / 2 - 100); + + sf::Text nameText; + nameText.setFont(font); + nameText.setString(playerName); + nameText.setCharacterSize(INPUTNAME_FONT_SIZE); + nameText.setFillColor(sf::Color::White); + + sf::FloatRect textBounds = nameText.getLocalBounds(); + float textHeight = textBounds.height; + float textYOffset = textBounds.top; + float inputBoxCenterY = inputBox.getPosition().y + inputBox.getSize().y / 2; + nameText.setPosition(SCENE_WIDTH / 2 - textBounds.width / 2, inputBoxCenterY - textHeight / 2 - textYOffset); + + window.draw(inputBox); + window.draw(prompt); + window.draw(nameText); +} + +void LeaderboardScene::drawLeaderboard(sf::RenderWindow &window) { + sf::Text header = createText("LEADERBOARD", font, HEADER_FONT_SIZE, HEADER_X, HEADER_Y); + window.draw(header); + + sf::Text posHeader = createText("POS", font, LEADERBOARD_FONT_SIZE, POS_HEADER_X, POS_HEADER_Y); + window.draw(posHeader); + + sf::Text nameHeader = createText("NAME", font, LEADERBOARD_FONT_SIZE, NAME_HEADER_X, NAME_HEADER_Y); + window.draw(nameHeader); + + sf::Text scoreHeader = createText("SCORE", font, LEADERBOARD_FONT_SIZE, SCORE_HEADER_X, SCORE_HEADER_Y); + window.draw(scoreHeader); + + unsigned int NUMBER_OF_ROWS = leaderboard.getScores().size(); + float LEADERBOARD_HEIGHT = ROW_HEIGHT * (NUMBER_OF_ROWS + 1); // One additional row for the header + + // Draw horizontal lines + sf::RectangleShape line(sf::Vector2f(LEADERBOARD_WIDTH, 2)); + line.setFillColor(sf::Color::White); + for (unsigned int i = 0; i <= NUMBER_OF_ROWS + 1; ++i) { + line.setPosition(LEADERBOARD_X, LEADERBOARD_Y + i * ROW_HEIGHT); + window.draw(line); + } + + // Draw vertical lines + sf::RectangleShape line1(sf::Vector2f(2, LEADERBOARD_HEIGHT)); + line1.setPosition(LEADERBOARD_X, LEADERBOARD_Y); + window.draw(line1); + sf::RectangleShape line2(sf::Vector2f(2, LEADERBOARD_HEIGHT)); + line2.setPosition(LEADERBOARD_X + 50, LEADERBOARD_Y); + window.draw(line2); + sf::RectangleShape line3(sf::Vector2f(2, LEADERBOARD_HEIGHT)); + line3.setPosition(LEADERBOARD_X + 450, LEADERBOARD_Y); + window.draw(line3); + sf::RectangleShape line4(sf::Vector2f(2, LEADERBOARD_HEIGHT)); + line4.setPosition(LEADERBOARD_X + 600, LEADERBOARD_Y); + window.draw(line4); + + // Draw contents of the leaderboard + auto scores = leaderboard.getScores(); + for (std::size_t i = 0; i < scores.size(); ++i) { + auto it = std::next(scores.begin(), i); + + sf::Text pos; + if (i != 9) { + pos = createText(std::to_string(i + 1), font, LEADERBOARD_FONT_SIZE, LEADERBOARD_X + TWO_DIGIT_POS_OFFSET, LEADERBOARD_Y + ROW_HEIGHT * (i + 1) + BORDER_OFFSET); + } else { + pos = createText(std::to_string(i + 1), font, LEADERBOARD_FONT_SIZE, LEADERBOARD_X + ONE_DIGIT_POS_OFFSET, LEADERBOARD_Y + ROW_HEIGHT * (i + 1) + BORDER_OFFSET); + } + window.draw(pos); + + sf::Text name = createText(it->second, font, LEADERBOARD_FONT_SIZE, LEADERBOARD_X + NAME_X_OFFSET, LEADERBOARD_Y + ROW_HEIGHT * (i + 1) + BORDER_OFFSET); + window.draw(name); + + sf::Text score; + if (std::to_string(it->first).length() == 1) { + score = createText(std::to_string(it->first), font, LEADERBOARD_FONT_SIZE, LEADERBOARD_X + ONE_DIGIT_SCORE_OFFSET, LEADERBOARD_Y + ROW_HEIGHT * (i + 1) + BORDER_OFFSET); + } else if (std::to_string(it->first).length() == 4) { + score = createText(std::to_string(it->first), font, LEADERBOARD_FONT_SIZE, LEADERBOARD_X + FOUR_DIGIT_SCORE_OFFSET, LEADERBOARD_Y + ROW_HEIGHT * (i + 1) + BORDER_OFFSET); + } else { + score = createText(std::to_string(it->first), font, LEADERBOARD_FONT_SIZE, LEADERBOARD_X + FIVE_DIGIT_SCORE_OFFSET, LEADERBOARD_Y + ROW_HEIGHT * (i + 1) + BORDER_OFFSET); + } + window.draw(score); + } +} diff --git a/ObjectOrientedProgramming/ClassesAndObjects/IntroducingObjects/task-info.yaml b/ObjectOrientedProgramming/ClassesAndObjects/IntroducingObjects/task-info.yaml index 7a4e0ec..dcecbea 100644 --- a/ObjectOrientedProgramming/ClassesAndObjects/IntroducingObjects/task-info.yaml +++ b/ObjectOrientedProgramming/ClassesAndObjects/IntroducingObjects/task-info.yaml @@ -45,3 +45,7 @@ files: - name: test/test.cpp visible: false propagatable: false +- name: src/leaderboard.cpp + visible: false +- name: src/leaderboardscene.cpp + visible: false diff --git a/ObjectOrientedProgramming/ClassesAndObjects/Introduction/src/leaderboard.cpp b/ObjectOrientedProgramming/ClassesAndObjects/Introduction/src/leaderboard.cpp new file mode 100644 index 0000000..a4c3653 --- /dev/null +++ b/ObjectOrientedProgramming/ClassesAndObjects/Introduction/src/leaderboard.cpp @@ -0,0 +1,28 @@ +#include "leaderboard.hpp" +#include "constants.hpp" + +void Leaderboard::loadScores() { + // TODO: write your solution here +} + +void Leaderboard::addScore(unsigned int score, std::string & name) { + // TODO: write your solution here +} + +void Leaderboard::saveScores() { + // TODO: write your solution here +} + +void Leaderboard::updateScore(unsigned int score, std::string & name) { + // TODO: write your solution here +} + +sf::Text createText(const std::string &str, const sf::Font &font, const unsigned int size, const float x, const float y) { + sf::Text text; + text.setFont(font); + text.setCharacterSize(size); + text.setFillColor(sf::Color::White); + text.setString(str); + text.setPosition(x, y); + return text; +} diff --git a/ObjectOrientedProgramming/ClassesAndObjects/Introduction/src/leaderboardscene.cpp b/ObjectOrientedProgramming/ClassesAndObjects/Introduction/src/leaderboardscene.cpp new file mode 100644 index 0000000..d1fa187 --- /dev/null +++ b/ObjectOrientedProgramming/ClassesAndObjects/Introduction/src/leaderboardscene.cpp @@ -0,0 +1,163 @@ +#include "leaderboardscene.hpp" +#include "constants.hpp" +#include "operators.hpp" + +LeaderboardScene::LeaderboardScene() : Scene(SCENE_WIDTH, SCENE_HEIGHT) { + state = LeaderboardState::INSERT_NAME; + playerName = ""; + playerScore = 0; + font = TextureManager::getFont(); +} + +void LeaderboardScene::activate() { + return; +} + +void LeaderboardScene::deactivate() { + return; +} + +SceneID LeaderboardScene::getID() const { + return SceneID::LEADERBOARD; +} + +SceneID LeaderboardScene::getNextSceneID() const { + return SceneID::LEADERBOARD; +} + +void LeaderboardScene::processText(const sf::Event &event) { + // TODO: Write your solution here +} + +void LeaderboardScene::processBackspace() { + // TODO: Write your solution here +} + +void LeaderboardScene::processEnter() { + // TODO: Write your solution here +} + +void LeaderboardScene::processEvent(const sf::Event &event) { + if (state == LeaderboardState::INSERT_NAME) { + if (event.type == sf::Event::TextEntered) { + processText(event); + } else if (event.type == sf::Event::KeyPressed) { + if (event.key.code == sf::Keyboard::BackSpace) { + processBackspace(); + } else if (event.key.code == sf::Keyboard::Enter) { + processEnter(); + } + } + } +} + +void LeaderboardScene::update(sf::Time delta) { + return; +} + +void LeaderboardScene::draw(sf::RenderWindow &window, TextureManager &textureManager) { + window.clear(sf::Color::Black); + if (state == LeaderboardState::INSERT_NAME) { + drawInsertNameScreen(window); + } else if (state == LeaderboardState::SHOW_LEADERBOARD) { + drawLeaderboard(window); + } +} + +void LeaderboardScene::drawInsertNameScreen(sf::RenderWindow &window) { + sf::RectangleShape inputBox(sf::Vector2f(INPUTBOX_WIDTH, INPUTBOX_HEIGHT)); + inputBox.setSize(sf::Vector2f(INPUTBOX_WIDTH, INPUTBOX_HEIGHT)); + inputBox.setFillColor(sf::Color::Black); + inputBox.setOutlineColor(sf::Color::White); + inputBox.setOutlineThickness(2); + inputBox.setPosition(SCENE_WIDTH / 2 - inputBox.getSize().x / 2, SCENE_HEIGHT / 2 - inputBox.getSize().y / 2); + + sf::Text prompt; + prompt.setFont(font); + prompt.setString("Insert Name"); + prompt.setCharacterSize(INPUTNAME_FONT_SIZE); + prompt.setFillColor(sf::Color::White); + prompt.setPosition(SCENE_WIDTH / 2 - prompt.getGlobalBounds().width / 2, SCENE_HEIGHT / 2 - inputBox.getSize().y / 2 - 100); + + sf::Text nameText; + nameText.setFont(font); + nameText.setString(playerName); + nameText.setCharacterSize(INPUTNAME_FONT_SIZE); + nameText.setFillColor(sf::Color::White); + + sf::FloatRect textBounds = nameText.getLocalBounds(); + float textHeight = textBounds.height; + float textYOffset = textBounds.top; + float inputBoxCenterY = inputBox.getPosition().y + inputBox.getSize().y / 2; + nameText.setPosition(SCENE_WIDTH / 2 - textBounds.width / 2, inputBoxCenterY - textHeight / 2 - textYOffset); + + window.draw(inputBox); + window.draw(prompt); + window.draw(nameText); +} + +void LeaderboardScene::drawLeaderboard(sf::RenderWindow &window) { + sf::Text header = createText("LEADERBOARD", font, HEADER_FONT_SIZE, HEADER_X, HEADER_Y); + window.draw(header); + + sf::Text posHeader = createText("POS", font, LEADERBOARD_FONT_SIZE, POS_HEADER_X, POS_HEADER_Y); + window.draw(posHeader); + + sf::Text nameHeader = createText("NAME", font, LEADERBOARD_FONT_SIZE, NAME_HEADER_X, NAME_HEADER_Y); + window.draw(nameHeader); + + sf::Text scoreHeader = createText("SCORE", font, LEADERBOARD_FONT_SIZE, SCORE_HEADER_X, SCORE_HEADER_Y); + window.draw(scoreHeader); + + unsigned int NUMBER_OF_ROWS = leaderboard.getScores().size(); + float LEADERBOARD_HEIGHT = ROW_HEIGHT * (NUMBER_OF_ROWS + 1); // One additional row for the header + + // Draw horizontal lines + sf::RectangleShape line(sf::Vector2f(LEADERBOARD_WIDTH, 2)); + line.setFillColor(sf::Color::White); + for (unsigned int i = 0; i <= NUMBER_OF_ROWS + 1; ++i) { + line.setPosition(LEADERBOARD_X, LEADERBOARD_Y + i * ROW_HEIGHT); + window.draw(line); + } + + // Draw vertical lines + sf::RectangleShape line1(sf::Vector2f(2, LEADERBOARD_HEIGHT)); + line1.setPosition(LEADERBOARD_X, LEADERBOARD_Y); + window.draw(line1); + sf::RectangleShape line2(sf::Vector2f(2, LEADERBOARD_HEIGHT)); + line2.setPosition(LEADERBOARD_X + 50, LEADERBOARD_Y); + window.draw(line2); + sf::RectangleShape line3(sf::Vector2f(2, LEADERBOARD_HEIGHT)); + line3.setPosition(LEADERBOARD_X + 450, LEADERBOARD_Y); + window.draw(line3); + sf::RectangleShape line4(sf::Vector2f(2, LEADERBOARD_HEIGHT)); + line4.setPosition(LEADERBOARD_X + 600, LEADERBOARD_Y); + window.draw(line4); + + // Draw contents of the leaderboard + auto scores = leaderboard.getScores(); + for (std::size_t i = 0; i < scores.size(); ++i) { + auto it = std::next(scores.begin(), i); + + sf::Text pos; + if (i != 9) { + pos = createText(std::to_string(i + 1), font, LEADERBOARD_FONT_SIZE, LEADERBOARD_X + TWO_DIGIT_POS_OFFSET, LEADERBOARD_Y + ROW_HEIGHT * (i + 1) + BORDER_OFFSET); + } else { + pos = createText(std::to_string(i + 1), font, LEADERBOARD_FONT_SIZE, LEADERBOARD_X + ONE_DIGIT_POS_OFFSET, LEADERBOARD_Y + ROW_HEIGHT * (i + 1) + BORDER_OFFSET); + } + window.draw(pos); + + sf::Text name = createText(it->second, font, LEADERBOARD_FONT_SIZE, LEADERBOARD_X + NAME_X_OFFSET, LEADERBOARD_Y + ROW_HEIGHT * (i + 1) + BORDER_OFFSET); + window.draw(name); + + sf::Text score; + if (std::to_string(it->first).length() == 1) { + score = createText(std::to_string(it->first), font, LEADERBOARD_FONT_SIZE, LEADERBOARD_X + ONE_DIGIT_SCORE_OFFSET, LEADERBOARD_Y + ROW_HEIGHT * (i + 1) + BORDER_OFFSET); + } else if (std::to_string(it->first).length() == 4) { + score = createText(std::to_string(it->first), font, LEADERBOARD_FONT_SIZE, LEADERBOARD_X + FOUR_DIGIT_SCORE_OFFSET, LEADERBOARD_Y + ROW_HEIGHT * (i + 1) + BORDER_OFFSET); + } else { + score = createText(std::to_string(it->first), font, LEADERBOARD_FONT_SIZE, LEADERBOARD_X + FIVE_DIGIT_SCORE_OFFSET, LEADERBOARD_Y + ROW_HEIGHT * (i + 1) + BORDER_OFFSET); + } + window.draw(score); + } +} diff --git a/ObjectOrientedProgramming/ClassesAndObjects/Introduction/task-info.yaml b/ObjectOrientedProgramming/ClassesAndObjects/Introduction/task-info.yaml index 15c9b54..058270d 100644 --- a/ObjectOrientedProgramming/ClassesAndObjects/Introduction/task-info.yaml +++ b/ObjectOrientedProgramming/ClassesAndObjects/Introduction/task-info.yaml @@ -42,3 +42,7 @@ files: - name: src/main.cpp visible: true editable: false +- name: src/leaderboard.cpp + visible: false +- name: src/leaderboardscene.cpp + visible: false diff --git a/ObjectOrientedProgramming/ClassesAndObjects/NameInput/test/test.cpp b/ObjectOrientedProgramming/ClassesAndObjects/NameInput/test/test.cpp index 01cbf0d..be1c893 100644 --- a/ObjectOrientedProgramming/ClassesAndObjects/NameInput/test/test.cpp +++ b/ObjectOrientedProgramming/ClassesAndObjects/NameInput/test/test.cpp @@ -31,7 +31,7 @@ TEST(LeaderboardSceneTest, ProcessEventEnter) { event.type = sf::Event::KeyPressed; event.key.code = sf::Keyboard::Enter; scene.processEvent(event); - ASSERT_EQ(scene.getState(), LeaderboardState::SHOWLEADERBOARD); + ASSERT_EQ(scene.getState(), LeaderboardState::SHOW_LEADERBOARD); } TEST(LeaderboardSceneTest, ProcessEventInvalidCharacter) { diff --git a/ObjectOrientedProgramming/ClassesAndObjects/NewChallenge/src/leaderboard.cpp b/ObjectOrientedProgramming/ClassesAndObjects/NewChallenge/src/leaderboard.cpp new file mode 100644 index 0000000..a4c3653 --- /dev/null +++ b/ObjectOrientedProgramming/ClassesAndObjects/NewChallenge/src/leaderboard.cpp @@ -0,0 +1,28 @@ +#include "leaderboard.hpp" +#include "constants.hpp" + +void Leaderboard::loadScores() { + // TODO: write your solution here +} + +void Leaderboard::addScore(unsigned int score, std::string & name) { + // TODO: write your solution here +} + +void Leaderboard::saveScores() { + // TODO: write your solution here +} + +void Leaderboard::updateScore(unsigned int score, std::string & name) { + // TODO: write your solution here +} + +sf::Text createText(const std::string &str, const sf::Font &font, const unsigned int size, const float x, const float y) { + sf::Text text; + text.setFont(font); + text.setCharacterSize(size); + text.setFillColor(sf::Color::White); + text.setString(str); + text.setPosition(x, y); + return text; +} diff --git a/ObjectOrientedProgramming/ClassesAndObjects/NewChallenge/src/leaderboardscene.cpp b/ObjectOrientedProgramming/ClassesAndObjects/NewChallenge/src/leaderboardscene.cpp new file mode 100644 index 0000000..d1fa187 --- /dev/null +++ b/ObjectOrientedProgramming/ClassesAndObjects/NewChallenge/src/leaderboardscene.cpp @@ -0,0 +1,163 @@ +#include "leaderboardscene.hpp" +#include "constants.hpp" +#include "operators.hpp" + +LeaderboardScene::LeaderboardScene() : Scene(SCENE_WIDTH, SCENE_HEIGHT) { + state = LeaderboardState::INSERT_NAME; + playerName = ""; + playerScore = 0; + font = TextureManager::getFont(); +} + +void LeaderboardScene::activate() { + return; +} + +void LeaderboardScene::deactivate() { + return; +} + +SceneID LeaderboardScene::getID() const { + return SceneID::LEADERBOARD; +} + +SceneID LeaderboardScene::getNextSceneID() const { + return SceneID::LEADERBOARD; +} + +void LeaderboardScene::processText(const sf::Event &event) { + // TODO: Write your solution here +} + +void LeaderboardScene::processBackspace() { + // TODO: Write your solution here +} + +void LeaderboardScene::processEnter() { + // TODO: Write your solution here +} + +void LeaderboardScene::processEvent(const sf::Event &event) { + if (state == LeaderboardState::INSERT_NAME) { + if (event.type == sf::Event::TextEntered) { + processText(event); + } else if (event.type == sf::Event::KeyPressed) { + if (event.key.code == sf::Keyboard::BackSpace) { + processBackspace(); + } else if (event.key.code == sf::Keyboard::Enter) { + processEnter(); + } + } + } +} + +void LeaderboardScene::update(sf::Time delta) { + return; +} + +void LeaderboardScene::draw(sf::RenderWindow &window, TextureManager &textureManager) { + window.clear(sf::Color::Black); + if (state == LeaderboardState::INSERT_NAME) { + drawInsertNameScreen(window); + } else if (state == LeaderboardState::SHOW_LEADERBOARD) { + drawLeaderboard(window); + } +} + +void LeaderboardScene::drawInsertNameScreen(sf::RenderWindow &window) { + sf::RectangleShape inputBox(sf::Vector2f(INPUTBOX_WIDTH, INPUTBOX_HEIGHT)); + inputBox.setSize(sf::Vector2f(INPUTBOX_WIDTH, INPUTBOX_HEIGHT)); + inputBox.setFillColor(sf::Color::Black); + inputBox.setOutlineColor(sf::Color::White); + inputBox.setOutlineThickness(2); + inputBox.setPosition(SCENE_WIDTH / 2 - inputBox.getSize().x / 2, SCENE_HEIGHT / 2 - inputBox.getSize().y / 2); + + sf::Text prompt; + prompt.setFont(font); + prompt.setString("Insert Name"); + prompt.setCharacterSize(INPUTNAME_FONT_SIZE); + prompt.setFillColor(sf::Color::White); + prompt.setPosition(SCENE_WIDTH / 2 - prompt.getGlobalBounds().width / 2, SCENE_HEIGHT / 2 - inputBox.getSize().y / 2 - 100); + + sf::Text nameText; + nameText.setFont(font); + nameText.setString(playerName); + nameText.setCharacterSize(INPUTNAME_FONT_SIZE); + nameText.setFillColor(sf::Color::White); + + sf::FloatRect textBounds = nameText.getLocalBounds(); + float textHeight = textBounds.height; + float textYOffset = textBounds.top; + float inputBoxCenterY = inputBox.getPosition().y + inputBox.getSize().y / 2; + nameText.setPosition(SCENE_WIDTH / 2 - textBounds.width / 2, inputBoxCenterY - textHeight / 2 - textYOffset); + + window.draw(inputBox); + window.draw(prompt); + window.draw(nameText); +} + +void LeaderboardScene::drawLeaderboard(sf::RenderWindow &window) { + sf::Text header = createText("LEADERBOARD", font, HEADER_FONT_SIZE, HEADER_X, HEADER_Y); + window.draw(header); + + sf::Text posHeader = createText("POS", font, LEADERBOARD_FONT_SIZE, POS_HEADER_X, POS_HEADER_Y); + window.draw(posHeader); + + sf::Text nameHeader = createText("NAME", font, LEADERBOARD_FONT_SIZE, NAME_HEADER_X, NAME_HEADER_Y); + window.draw(nameHeader); + + sf::Text scoreHeader = createText("SCORE", font, LEADERBOARD_FONT_SIZE, SCORE_HEADER_X, SCORE_HEADER_Y); + window.draw(scoreHeader); + + unsigned int NUMBER_OF_ROWS = leaderboard.getScores().size(); + float LEADERBOARD_HEIGHT = ROW_HEIGHT * (NUMBER_OF_ROWS + 1); // One additional row for the header + + // Draw horizontal lines + sf::RectangleShape line(sf::Vector2f(LEADERBOARD_WIDTH, 2)); + line.setFillColor(sf::Color::White); + for (unsigned int i = 0; i <= NUMBER_OF_ROWS + 1; ++i) { + line.setPosition(LEADERBOARD_X, LEADERBOARD_Y + i * ROW_HEIGHT); + window.draw(line); + } + + // Draw vertical lines + sf::RectangleShape line1(sf::Vector2f(2, LEADERBOARD_HEIGHT)); + line1.setPosition(LEADERBOARD_X, LEADERBOARD_Y); + window.draw(line1); + sf::RectangleShape line2(sf::Vector2f(2, LEADERBOARD_HEIGHT)); + line2.setPosition(LEADERBOARD_X + 50, LEADERBOARD_Y); + window.draw(line2); + sf::RectangleShape line3(sf::Vector2f(2, LEADERBOARD_HEIGHT)); + line3.setPosition(LEADERBOARD_X + 450, LEADERBOARD_Y); + window.draw(line3); + sf::RectangleShape line4(sf::Vector2f(2, LEADERBOARD_HEIGHT)); + line4.setPosition(LEADERBOARD_X + 600, LEADERBOARD_Y); + window.draw(line4); + + // Draw contents of the leaderboard + auto scores = leaderboard.getScores(); + for (std::size_t i = 0; i < scores.size(); ++i) { + auto it = std::next(scores.begin(), i); + + sf::Text pos; + if (i != 9) { + pos = createText(std::to_string(i + 1), font, LEADERBOARD_FONT_SIZE, LEADERBOARD_X + TWO_DIGIT_POS_OFFSET, LEADERBOARD_Y + ROW_HEIGHT * (i + 1) + BORDER_OFFSET); + } else { + pos = createText(std::to_string(i + 1), font, LEADERBOARD_FONT_SIZE, LEADERBOARD_X + ONE_DIGIT_POS_OFFSET, LEADERBOARD_Y + ROW_HEIGHT * (i + 1) + BORDER_OFFSET); + } + window.draw(pos); + + sf::Text name = createText(it->second, font, LEADERBOARD_FONT_SIZE, LEADERBOARD_X + NAME_X_OFFSET, LEADERBOARD_Y + ROW_HEIGHT * (i + 1) + BORDER_OFFSET); + window.draw(name); + + sf::Text score; + if (std::to_string(it->first).length() == 1) { + score = createText(std::to_string(it->first), font, LEADERBOARD_FONT_SIZE, LEADERBOARD_X + ONE_DIGIT_SCORE_OFFSET, LEADERBOARD_Y + ROW_HEIGHT * (i + 1) + BORDER_OFFSET); + } else if (std::to_string(it->first).length() == 4) { + score = createText(std::to_string(it->first), font, LEADERBOARD_FONT_SIZE, LEADERBOARD_X + FOUR_DIGIT_SCORE_OFFSET, LEADERBOARD_Y + ROW_HEIGHT * (i + 1) + BORDER_OFFSET); + } else { + score = createText(std::to_string(it->first), font, LEADERBOARD_FONT_SIZE, LEADERBOARD_X + FIVE_DIGIT_SCORE_OFFSET, LEADERBOARD_Y + ROW_HEIGHT * (i + 1) + BORDER_OFFSET); + } + window.draw(score); + } +} diff --git a/ObjectOrientedProgramming/ClassesAndObjects/NewChallenge/task-info.yaml b/ObjectOrientedProgramming/ClassesAndObjects/NewChallenge/task-info.yaml index b50cb60..1ec7075 100644 --- a/ObjectOrientedProgramming/ClassesAndObjects/NewChallenge/task-info.yaml +++ b/ObjectOrientedProgramming/ClassesAndObjects/NewChallenge/task-info.yaml @@ -45,3 +45,7 @@ files: - name: test/test.cpp visible: false propagatable: false +- name: src/leaderboard.cpp + visible: false +- name: src/leaderboardscene.cpp + visible: false diff --git a/ObjectOrientedProgramming/ClassesAndObjects/NewDynamics/src/leaderboard.cpp b/ObjectOrientedProgramming/ClassesAndObjects/NewDynamics/src/leaderboard.cpp new file mode 100644 index 0000000..a4c3653 --- /dev/null +++ b/ObjectOrientedProgramming/ClassesAndObjects/NewDynamics/src/leaderboard.cpp @@ -0,0 +1,28 @@ +#include "leaderboard.hpp" +#include "constants.hpp" + +void Leaderboard::loadScores() { + // TODO: write your solution here +} + +void Leaderboard::addScore(unsigned int score, std::string & name) { + // TODO: write your solution here +} + +void Leaderboard::saveScores() { + // TODO: write your solution here +} + +void Leaderboard::updateScore(unsigned int score, std::string & name) { + // TODO: write your solution here +} + +sf::Text createText(const std::string &str, const sf::Font &font, const unsigned int size, const float x, const float y) { + sf::Text text; + text.setFont(font); + text.setCharacterSize(size); + text.setFillColor(sf::Color::White); + text.setString(str); + text.setPosition(x, y); + return text; +} diff --git a/ObjectOrientedProgramming/ClassesAndObjects/NewDynamics/src/leaderboardscene.cpp b/ObjectOrientedProgramming/ClassesAndObjects/NewDynamics/src/leaderboardscene.cpp new file mode 100644 index 0000000..d1fa187 --- /dev/null +++ b/ObjectOrientedProgramming/ClassesAndObjects/NewDynamics/src/leaderboardscene.cpp @@ -0,0 +1,163 @@ +#include "leaderboardscene.hpp" +#include "constants.hpp" +#include "operators.hpp" + +LeaderboardScene::LeaderboardScene() : Scene(SCENE_WIDTH, SCENE_HEIGHT) { + state = LeaderboardState::INSERT_NAME; + playerName = ""; + playerScore = 0; + font = TextureManager::getFont(); +} + +void LeaderboardScene::activate() { + return; +} + +void LeaderboardScene::deactivate() { + return; +} + +SceneID LeaderboardScene::getID() const { + return SceneID::LEADERBOARD; +} + +SceneID LeaderboardScene::getNextSceneID() const { + return SceneID::LEADERBOARD; +} + +void LeaderboardScene::processText(const sf::Event &event) { + // TODO: Write your solution here +} + +void LeaderboardScene::processBackspace() { + // TODO: Write your solution here +} + +void LeaderboardScene::processEnter() { + // TODO: Write your solution here +} + +void LeaderboardScene::processEvent(const sf::Event &event) { + if (state == LeaderboardState::INSERT_NAME) { + if (event.type == sf::Event::TextEntered) { + processText(event); + } else if (event.type == sf::Event::KeyPressed) { + if (event.key.code == sf::Keyboard::BackSpace) { + processBackspace(); + } else if (event.key.code == sf::Keyboard::Enter) { + processEnter(); + } + } + } +} + +void LeaderboardScene::update(sf::Time delta) { + return; +} + +void LeaderboardScene::draw(sf::RenderWindow &window, TextureManager &textureManager) { + window.clear(sf::Color::Black); + if (state == LeaderboardState::INSERT_NAME) { + drawInsertNameScreen(window); + } else if (state == LeaderboardState::SHOW_LEADERBOARD) { + drawLeaderboard(window); + } +} + +void LeaderboardScene::drawInsertNameScreen(sf::RenderWindow &window) { + sf::RectangleShape inputBox(sf::Vector2f(INPUTBOX_WIDTH, INPUTBOX_HEIGHT)); + inputBox.setSize(sf::Vector2f(INPUTBOX_WIDTH, INPUTBOX_HEIGHT)); + inputBox.setFillColor(sf::Color::Black); + inputBox.setOutlineColor(sf::Color::White); + inputBox.setOutlineThickness(2); + inputBox.setPosition(SCENE_WIDTH / 2 - inputBox.getSize().x / 2, SCENE_HEIGHT / 2 - inputBox.getSize().y / 2); + + sf::Text prompt; + prompt.setFont(font); + prompt.setString("Insert Name"); + prompt.setCharacterSize(INPUTNAME_FONT_SIZE); + prompt.setFillColor(sf::Color::White); + prompt.setPosition(SCENE_WIDTH / 2 - prompt.getGlobalBounds().width / 2, SCENE_HEIGHT / 2 - inputBox.getSize().y / 2 - 100); + + sf::Text nameText; + nameText.setFont(font); + nameText.setString(playerName); + nameText.setCharacterSize(INPUTNAME_FONT_SIZE); + nameText.setFillColor(sf::Color::White); + + sf::FloatRect textBounds = nameText.getLocalBounds(); + float textHeight = textBounds.height; + float textYOffset = textBounds.top; + float inputBoxCenterY = inputBox.getPosition().y + inputBox.getSize().y / 2; + nameText.setPosition(SCENE_WIDTH / 2 - textBounds.width / 2, inputBoxCenterY - textHeight / 2 - textYOffset); + + window.draw(inputBox); + window.draw(prompt); + window.draw(nameText); +} + +void LeaderboardScene::drawLeaderboard(sf::RenderWindow &window) { + sf::Text header = createText("LEADERBOARD", font, HEADER_FONT_SIZE, HEADER_X, HEADER_Y); + window.draw(header); + + sf::Text posHeader = createText("POS", font, LEADERBOARD_FONT_SIZE, POS_HEADER_X, POS_HEADER_Y); + window.draw(posHeader); + + sf::Text nameHeader = createText("NAME", font, LEADERBOARD_FONT_SIZE, NAME_HEADER_X, NAME_HEADER_Y); + window.draw(nameHeader); + + sf::Text scoreHeader = createText("SCORE", font, LEADERBOARD_FONT_SIZE, SCORE_HEADER_X, SCORE_HEADER_Y); + window.draw(scoreHeader); + + unsigned int NUMBER_OF_ROWS = leaderboard.getScores().size(); + float LEADERBOARD_HEIGHT = ROW_HEIGHT * (NUMBER_OF_ROWS + 1); // One additional row for the header + + // Draw horizontal lines + sf::RectangleShape line(sf::Vector2f(LEADERBOARD_WIDTH, 2)); + line.setFillColor(sf::Color::White); + for (unsigned int i = 0; i <= NUMBER_OF_ROWS + 1; ++i) { + line.setPosition(LEADERBOARD_X, LEADERBOARD_Y + i * ROW_HEIGHT); + window.draw(line); + } + + // Draw vertical lines + sf::RectangleShape line1(sf::Vector2f(2, LEADERBOARD_HEIGHT)); + line1.setPosition(LEADERBOARD_X, LEADERBOARD_Y); + window.draw(line1); + sf::RectangleShape line2(sf::Vector2f(2, LEADERBOARD_HEIGHT)); + line2.setPosition(LEADERBOARD_X + 50, LEADERBOARD_Y); + window.draw(line2); + sf::RectangleShape line3(sf::Vector2f(2, LEADERBOARD_HEIGHT)); + line3.setPosition(LEADERBOARD_X + 450, LEADERBOARD_Y); + window.draw(line3); + sf::RectangleShape line4(sf::Vector2f(2, LEADERBOARD_HEIGHT)); + line4.setPosition(LEADERBOARD_X + 600, LEADERBOARD_Y); + window.draw(line4); + + // Draw contents of the leaderboard + auto scores = leaderboard.getScores(); + for (std::size_t i = 0; i < scores.size(); ++i) { + auto it = std::next(scores.begin(), i); + + sf::Text pos; + if (i != 9) { + pos = createText(std::to_string(i + 1), font, LEADERBOARD_FONT_SIZE, LEADERBOARD_X + TWO_DIGIT_POS_OFFSET, LEADERBOARD_Y + ROW_HEIGHT * (i + 1) + BORDER_OFFSET); + } else { + pos = createText(std::to_string(i + 1), font, LEADERBOARD_FONT_SIZE, LEADERBOARD_X + ONE_DIGIT_POS_OFFSET, LEADERBOARD_Y + ROW_HEIGHT * (i + 1) + BORDER_OFFSET); + } + window.draw(pos); + + sf::Text name = createText(it->second, font, LEADERBOARD_FONT_SIZE, LEADERBOARD_X + NAME_X_OFFSET, LEADERBOARD_Y + ROW_HEIGHT * (i + 1) + BORDER_OFFSET); + window.draw(name); + + sf::Text score; + if (std::to_string(it->first).length() == 1) { + score = createText(std::to_string(it->first), font, LEADERBOARD_FONT_SIZE, LEADERBOARD_X + ONE_DIGIT_SCORE_OFFSET, LEADERBOARD_Y + ROW_HEIGHT * (i + 1) + BORDER_OFFSET); + } else if (std::to_string(it->first).length() == 4) { + score = createText(std::to_string(it->first), font, LEADERBOARD_FONT_SIZE, LEADERBOARD_X + FOUR_DIGIT_SCORE_OFFSET, LEADERBOARD_Y + ROW_HEIGHT * (i + 1) + BORDER_OFFSET); + } else { + score = createText(std::to_string(it->first), font, LEADERBOARD_FONT_SIZE, LEADERBOARD_X + FIVE_DIGIT_SCORE_OFFSET, LEADERBOARD_Y + ROW_HEIGHT * (i + 1) + BORDER_OFFSET); + } + window.draw(score); + } +} diff --git a/ObjectOrientedProgramming/ClassesAndObjects/NewDynamics/task-info.yaml b/ObjectOrientedProgramming/ClassesAndObjects/NewDynamics/task-info.yaml index 75a6a74..337dc32 100644 --- a/ObjectOrientedProgramming/ClassesAndObjects/NewDynamics/task-info.yaml +++ b/ObjectOrientedProgramming/ClassesAndObjects/NewDynamics/task-info.yaml @@ -45,3 +45,7 @@ files: - name: test/test.cpp visible: false propagatable: false +- name: src/leaderboard.cpp + visible: false +- name: src/leaderboardscene.cpp + visible: false diff --git a/ObjectOrientedProgramming/ClassesAndObjects/OperatorsOverloading/src/leaderboard.cpp b/ObjectOrientedProgramming/ClassesAndObjects/OperatorsOverloading/src/leaderboard.cpp new file mode 100644 index 0000000..a4c3653 --- /dev/null +++ b/ObjectOrientedProgramming/ClassesAndObjects/OperatorsOverloading/src/leaderboard.cpp @@ -0,0 +1,28 @@ +#include "leaderboard.hpp" +#include "constants.hpp" + +void Leaderboard::loadScores() { + // TODO: write your solution here +} + +void Leaderboard::addScore(unsigned int score, std::string & name) { + // TODO: write your solution here +} + +void Leaderboard::saveScores() { + // TODO: write your solution here +} + +void Leaderboard::updateScore(unsigned int score, std::string & name) { + // TODO: write your solution here +} + +sf::Text createText(const std::string &str, const sf::Font &font, const unsigned int size, const float x, const float y) { + sf::Text text; + text.setFont(font); + text.setCharacterSize(size); + text.setFillColor(sf::Color::White); + text.setString(str); + text.setPosition(x, y); + return text; +} diff --git a/ObjectOrientedProgramming/ClassesAndObjects/OperatorsOverloading/src/leaderboardscene.cpp b/ObjectOrientedProgramming/ClassesAndObjects/OperatorsOverloading/src/leaderboardscene.cpp new file mode 100644 index 0000000..d1fa187 --- /dev/null +++ b/ObjectOrientedProgramming/ClassesAndObjects/OperatorsOverloading/src/leaderboardscene.cpp @@ -0,0 +1,163 @@ +#include "leaderboardscene.hpp" +#include "constants.hpp" +#include "operators.hpp" + +LeaderboardScene::LeaderboardScene() : Scene(SCENE_WIDTH, SCENE_HEIGHT) { + state = LeaderboardState::INSERT_NAME; + playerName = ""; + playerScore = 0; + font = TextureManager::getFont(); +} + +void LeaderboardScene::activate() { + return; +} + +void LeaderboardScene::deactivate() { + return; +} + +SceneID LeaderboardScene::getID() const { + return SceneID::LEADERBOARD; +} + +SceneID LeaderboardScene::getNextSceneID() const { + return SceneID::LEADERBOARD; +} + +void LeaderboardScene::processText(const sf::Event &event) { + // TODO: Write your solution here +} + +void LeaderboardScene::processBackspace() { + // TODO: Write your solution here +} + +void LeaderboardScene::processEnter() { + // TODO: Write your solution here +} + +void LeaderboardScene::processEvent(const sf::Event &event) { + if (state == LeaderboardState::INSERT_NAME) { + if (event.type == sf::Event::TextEntered) { + processText(event); + } else if (event.type == sf::Event::KeyPressed) { + if (event.key.code == sf::Keyboard::BackSpace) { + processBackspace(); + } else if (event.key.code == sf::Keyboard::Enter) { + processEnter(); + } + } + } +} + +void LeaderboardScene::update(sf::Time delta) { + return; +} + +void LeaderboardScene::draw(sf::RenderWindow &window, TextureManager &textureManager) { + window.clear(sf::Color::Black); + if (state == LeaderboardState::INSERT_NAME) { + drawInsertNameScreen(window); + } else if (state == LeaderboardState::SHOW_LEADERBOARD) { + drawLeaderboard(window); + } +} + +void LeaderboardScene::drawInsertNameScreen(sf::RenderWindow &window) { + sf::RectangleShape inputBox(sf::Vector2f(INPUTBOX_WIDTH, INPUTBOX_HEIGHT)); + inputBox.setSize(sf::Vector2f(INPUTBOX_WIDTH, INPUTBOX_HEIGHT)); + inputBox.setFillColor(sf::Color::Black); + inputBox.setOutlineColor(sf::Color::White); + inputBox.setOutlineThickness(2); + inputBox.setPosition(SCENE_WIDTH / 2 - inputBox.getSize().x / 2, SCENE_HEIGHT / 2 - inputBox.getSize().y / 2); + + sf::Text prompt; + prompt.setFont(font); + prompt.setString("Insert Name"); + prompt.setCharacterSize(INPUTNAME_FONT_SIZE); + prompt.setFillColor(sf::Color::White); + prompt.setPosition(SCENE_WIDTH / 2 - prompt.getGlobalBounds().width / 2, SCENE_HEIGHT / 2 - inputBox.getSize().y / 2 - 100); + + sf::Text nameText; + nameText.setFont(font); + nameText.setString(playerName); + nameText.setCharacterSize(INPUTNAME_FONT_SIZE); + nameText.setFillColor(sf::Color::White); + + sf::FloatRect textBounds = nameText.getLocalBounds(); + float textHeight = textBounds.height; + float textYOffset = textBounds.top; + float inputBoxCenterY = inputBox.getPosition().y + inputBox.getSize().y / 2; + nameText.setPosition(SCENE_WIDTH / 2 - textBounds.width / 2, inputBoxCenterY - textHeight / 2 - textYOffset); + + window.draw(inputBox); + window.draw(prompt); + window.draw(nameText); +} + +void LeaderboardScene::drawLeaderboard(sf::RenderWindow &window) { + sf::Text header = createText("LEADERBOARD", font, HEADER_FONT_SIZE, HEADER_X, HEADER_Y); + window.draw(header); + + sf::Text posHeader = createText("POS", font, LEADERBOARD_FONT_SIZE, POS_HEADER_X, POS_HEADER_Y); + window.draw(posHeader); + + sf::Text nameHeader = createText("NAME", font, LEADERBOARD_FONT_SIZE, NAME_HEADER_X, NAME_HEADER_Y); + window.draw(nameHeader); + + sf::Text scoreHeader = createText("SCORE", font, LEADERBOARD_FONT_SIZE, SCORE_HEADER_X, SCORE_HEADER_Y); + window.draw(scoreHeader); + + unsigned int NUMBER_OF_ROWS = leaderboard.getScores().size(); + float LEADERBOARD_HEIGHT = ROW_HEIGHT * (NUMBER_OF_ROWS + 1); // One additional row for the header + + // Draw horizontal lines + sf::RectangleShape line(sf::Vector2f(LEADERBOARD_WIDTH, 2)); + line.setFillColor(sf::Color::White); + for (unsigned int i = 0; i <= NUMBER_OF_ROWS + 1; ++i) { + line.setPosition(LEADERBOARD_X, LEADERBOARD_Y + i * ROW_HEIGHT); + window.draw(line); + } + + // Draw vertical lines + sf::RectangleShape line1(sf::Vector2f(2, LEADERBOARD_HEIGHT)); + line1.setPosition(LEADERBOARD_X, LEADERBOARD_Y); + window.draw(line1); + sf::RectangleShape line2(sf::Vector2f(2, LEADERBOARD_HEIGHT)); + line2.setPosition(LEADERBOARD_X + 50, LEADERBOARD_Y); + window.draw(line2); + sf::RectangleShape line3(sf::Vector2f(2, LEADERBOARD_HEIGHT)); + line3.setPosition(LEADERBOARD_X + 450, LEADERBOARD_Y); + window.draw(line3); + sf::RectangleShape line4(sf::Vector2f(2, LEADERBOARD_HEIGHT)); + line4.setPosition(LEADERBOARD_X + 600, LEADERBOARD_Y); + window.draw(line4); + + // Draw contents of the leaderboard + auto scores = leaderboard.getScores(); + for (std::size_t i = 0; i < scores.size(); ++i) { + auto it = std::next(scores.begin(), i); + + sf::Text pos; + if (i != 9) { + pos = createText(std::to_string(i + 1), font, LEADERBOARD_FONT_SIZE, LEADERBOARD_X + TWO_DIGIT_POS_OFFSET, LEADERBOARD_Y + ROW_HEIGHT * (i + 1) + BORDER_OFFSET); + } else { + pos = createText(std::to_string(i + 1), font, LEADERBOARD_FONT_SIZE, LEADERBOARD_X + ONE_DIGIT_POS_OFFSET, LEADERBOARD_Y + ROW_HEIGHT * (i + 1) + BORDER_OFFSET); + } + window.draw(pos); + + sf::Text name = createText(it->second, font, LEADERBOARD_FONT_SIZE, LEADERBOARD_X + NAME_X_OFFSET, LEADERBOARD_Y + ROW_HEIGHT * (i + 1) + BORDER_OFFSET); + window.draw(name); + + sf::Text score; + if (std::to_string(it->first).length() == 1) { + score = createText(std::to_string(it->first), font, LEADERBOARD_FONT_SIZE, LEADERBOARD_X + ONE_DIGIT_SCORE_OFFSET, LEADERBOARD_Y + ROW_HEIGHT * (i + 1) + BORDER_OFFSET); + } else if (std::to_string(it->first).length() == 4) { + score = createText(std::to_string(it->first), font, LEADERBOARD_FONT_SIZE, LEADERBOARD_X + FOUR_DIGIT_SCORE_OFFSET, LEADERBOARD_Y + ROW_HEIGHT * (i + 1) + BORDER_OFFSET); + } else { + score = createText(std::to_string(it->first), font, LEADERBOARD_FONT_SIZE, LEADERBOARD_X + FIVE_DIGIT_SCORE_OFFSET, LEADERBOARD_Y + ROW_HEIGHT * (i + 1) + BORDER_OFFSET); + } + window.draw(score); + } +} diff --git a/ObjectOrientedProgramming/ClassesAndObjects/OperatorsOverloading/task-info.yaml b/ObjectOrientedProgramming/ClassesAndObjects/OperatorsOverloading/task-info.yaml index ee715ce..391dde8 100644 --- a/ObjectOrientedProgramming/ClassesAndObjects/OperatorsOverloading/task-info.yaml +++ b/ObjectOrientedProgramming/ClassesAndObjects/OperatorsOverloading/task-info.yaml @@ -45,3 +45,7 @@ files: - name: test/test.cpp visible: false propagatable: false +- name: src/leaderboard.cpp + visible: false +- name: src/leaderboardscene.cpp + visible: false diff --git a/ObjectOrientedProgramming/ClassesAndObjects/Polymorphism/src/leaderboard.cpp b/ObjectOrientedProgramming/ClassesAndObjects/Polymorphism/src/leaderboard.cpp new file mode 100644 index 0000000..a4c3653 --- /dev/null +++ b/ObjectOrientedProgramming/ClassesAndObjects/Polymorphism/src/leaderboard.cpp @@ -0,0 +1,28 @@ +#include "leaderboard.hpp" +#include "constants.hpp" + +void Leaderboard::loadScores() { + // TODO: write your solution here +} + +void Leaderboard::addScore(unsigned int score, std::string & name) { + // TODO: write your solution here +} + +void Leaderboard::saveScores() { + // TODO: write your solution here +} + +void Leaderboard::updateScore(unsigned int score, std::string & name) { + // TODO: write your solution here +} + +sf::Text createText(const std::string &str, const sf::Font &font, const unsigned int size, const float x, const float y) { + sf::Text text; + text.setFont(font); + text.setCharacterSize(size); + text.setFillColor(sf::Color::White); + text.setString(str); + text.setPosition(x, y); + return text; +} diff --git a/ObjectOrientedProgramming/ClassesAndObjects/Polymorphism/src/leaderboardscene.cpp b/ObjectOrientedProgramming/ClassesAndObjects/Polymorphism/src/leaderboardscene.cpp new file mode 100644 index 0000000..d1fa187 --- /dev/null +++ b/ObjectOrientedProgramming/ClassesAndObjects/Polymorphism/src/leaderboardscene.cpp @@ -0,0 +1,163 @@ +#include "leaderboardscene.hpp" +#include "constants.hpp" +#include "operators.hpp" + +LeaderboardScene::LeaderboardScene() : Scene(SCENE_WIDTH, SCENE_HEIGHT) { + state = LeaderboardState::INSERT_NAME; + playerName = ""; + playerScore = 0; + font = TextureManager::getFont(); +} + +void LeaderboardScene::activate() { + return; +} + +void LeaderboardScene::deactivate() { + return; +} + +SceneID LeaderboardScene::getID() const { + return SceneID::LEADERBOARD; +} + +SceneID LeaderboardScene::getNextSceneID() const { + return SceneID::LEADERBOARD; +} + +void LeaderboardScene::processText(const sf::Event &event) { + // TODO: Write your solution here +} + +void LeaderboardScene::processBackspace() { + // TODO: Write your solution here +} + +void LeaderboardScene::processEnter() { + // TODO: Write your solution here +} + +void LeaderboardScene::processEvent(const sf::Event &event) { + if (state == LeaderboardState::INSERT_NAME) { + if (event.type == sf::Event::TextEntered) { + processText(event); + } else if (event.type == sf::Event::KeyPressed) { + if (event.key.code == sf::Keyboard::BackSpace) { + processBackspace(); + } else if (event.key.code == sf::Keyboard::Enter) { + processEnter(); + } + } + } +} + +void LeaderboardScene::update(sf::Time delta) { + return; +} + +void LeaderboardScene::draw(sf::RenderWindow &window, TextureManager &textureManager) { + window.clear(sf::Color::Black); + if (state == LeaderboardState::INSERT_NAME) { + drawInsertNameScreen(window); + } else if (state == LeaderboardState::SHOW_LEADERBOARD) { + drawLeaderboard(window); + } +} + +void LeaderboardScene::drawInsertNameScreen(sf::RenderWindow &window) { + sf::RectangleShape inputBox(sf::Vector2f(INPUTBOX_WIDTH, INPUTBOX_HEIGHT)); + inputBox.setSize(sf::Vector2f(INPUTBOX_WIDTH, INPUTBOX_HEIGHT)); + inputBox.setFillColor(sf::Color::Black); + inputBox.setOutlineColor(sf::Color::White); + inputBox.setOutlineThickness(2); + inputBox.setPosition(SCENE_WIDTH / 2 - inputBox.getSize().x / 2, SCENE_HEIGHT / 2 - inputBox.getSize().y / 2); + + sf::Text prompt; + prompt.setFont(font); + prompt.setString("Insert Name"); + prompt.setCharacterSize(INPUTNAME_FONT_SIZE); + prompt.setFillColor(sf::Color::White); + prompt.setPosition(SCENE_WIDTH / 2 - prompt.getGlobalBounds().width / 2, SCENE_HEIGHT / 2 - inputBox.getSize().y / 2 - 100); + + sf::Text nameText; + nameText.setFont(font); + nameText.setString(playerName); + nameText.setCharacterSize(INPUTNAME_FONT_SIZE); + nameText.setFillColor(sf::Color::White); + + sf::FloatRect textBounds = nameText.getLocalBounds(); + float textHeight = textBounds.height; + float textYOffset = textBounds.top; + float inputBoxCenterY = inputBox.getPosition().y + inputBox.getSize().y / 2; + nameText.setPosition(SCENE_WIDTH / 2 - textBounds.width / 2, inputBoxCenterY - textHeight / 2 - textYOffset); + + window.draw(inputBox); + window.draw(prompt); + window.draw(nameText); +} + +void LeaderboardScene::drawLeaderboard(sf::RenderWindow &window) { + sf::Text header = createText("LEADERBOARD", font, HEADER_FONT_SIZE, HEADER_X, HEADER_Y); + window.draw(header); + + sf::Text posHeader = createText("POS", font, LEADERBOARD_FONT_SIZE, POS_HEADER_X, POS_HEADER_Y); + window.draw(posHeader); + + sf::Text nameHeader = createText("NAME", font, LEADERBOARD_FONT_SIZE, NAME_HEADER_X, NAME_HEADER_Y); + window.draw(nameHeader); + + sf::Text scoreHeader = createText("SCORE", font, LEADERBOARD_FONT_SIZE, SCORE_HEADER_X, SCORE_HEADER_Y); + window.draw(scoreHeader); + + unsigned int NUMBER_OF_ROWS = leaderboard.getScores().size(); + float LEADERBOARD_HEIGHT = ROW_HEIGHT * (NUMBER_OF_ROWS + 1); // One additional row for the header + + // Draw horizontal lines + sf::RectangleShape line(sf::Vector2f(LEADERBOARD_WIDTH, 2)); + line.setFillColor(sf::Color::White); + for (unsigned int i = 0; i <= NUMBER_OF_ROWS + 1; ++i) { + line.setPosition(LEADERBOARD_X, LEADERBOARD_Y + i * ROW_HEIGHT); + window.draw(line); + } + + // Draw vertical lines + sf::RectangleShape line1(sf::Vector2f(2, LEADERBOARD_HEIGHT)); + line1.setPosition(LEADERBOARD_X, LEADERBOARD_Y); + window.draw(line1); + sf::RectangleShape line2(sf::Vector2f(2, LEADERBOARD_HEIGHT)); + line2.setPosition(LEADERBOARD_X + 50, LEADERBOARD_Y); + window.draw(line2); + sf::RectangleShape line3(sf::Vector2f(2, LEADERBOARD_HEIGHT)); + line3.setPosition(LEADERBOARD_X + 450, LEADERBOARD_Y); + window.draw(line3); + sf::RectangleShape line4(sf::Vector2f(2, LEADERBOARD_HEIGHT)); + line4.setPosition(LEADERBOARD_X + 600, LEADERBOARD_Y); + window.draw(line4); + + // Draw contents of the leaderboard + auto scores = leaderboard.getScores(); + for (std::size_t i = 0; i < scores.size(); ++i) { + auto it = std::next(scores.begin(), i); + + sf::Text pos; + if (i != 9) { + pos = createText(std::to_string(i + 1), font, LEADERBOARD_FONT_SIZE, LEADERBOARD_X + TWO_DIGIT_POS_OFFSET, LEADERBOARD_Y + ROW_HEIGHT * (i + 1) + BORDER_OFFSET); + } else { + pos = createText(std::to_string(i + 1), font, LEADERBOARD_FONT_SIZE, LEADERBOARD_X + ONE_DIGIT_POS_OFFSET, LEADERBOARD_Y + ROW_HEIGHT * (i + 1) + BORDER_OFFSET); + } + window.draw(pos); + + sf::Text name = createText(it->second, font, LEADERBOARD_FONT_SIZE, LEADERBOARD_X + NAME_X_OFFSET, LEADERBOARD_Y + ROW_HEIGHT * (i + 1) + BORDER_OFFSET); + window.draw(name); + + sf::Text score; + if (std::to_string(it->first).length() == 1) { + score = createText(std::to_string(it->first), font, LEADERBOARD_FONT_SIZE, LEADERBOARD_X + ONE_DIGIT_SCORE_OFFSET, LEADERBOARD_Y + ROW_HEIGHT * (i + 1) + BORDER_OFFSET); + } else if (std::to_string(it->first).length() == 4) { + score = createText(std::to_string(it->first), font, LEADERBOARD_FONT_SIZE, LEADERBOARD_X + FOUR_DIGIT_SCORE_OFFSET, LEADERBOARD_Y + ROW_HEIGHT * (i + 1) + BORDER_OFFSET); + } else { + score = createText(std::to_string(it->first), font, LEADERBOARD_FONT_SIZE, LEADERBOARD_X + FIVE_DIGIT_SCORE_OFFSET, LEADERBOARD_Y + ROW_HEIGHT * (i + 1) + BORDER_OFFSET); + } + window.draw(score); + } +} diff --git a/ObjectOrientedProgramming/ClassesAndObjects/Polymorphism/task-info.yaml b/ObjectOrientedProgramming/ClassesAndObjects/Polymorphism/task-info.yaml index 5606fb1..efb993a 100644 --- a/ObjectOrientedProgramming/ClassesAndObjects/Polymorphism/task-info.yaml +++ b/ObjectOrientedProgramming/ClassesAndObjects/Polymorphism/task-info.yaml @@ -45,3 +45,7 @@ files: - name: test/test.cpp visible: false propagatable: false +- name: src/leaderboard.cpp + visible: false +- name: src/leaderboardscene.cpp + visible: false diff --git a/ObjectOrientedProgramming/ClassesAndObjects/SceneTransition/test/test.cpp b/ObjectOrientedProgramming/ClassesAndObjects/SceneTransition/test/test.cpp index 83aa629..85cb0cf 100644 --- a/ObjectOrientedProgramming/ClassesAndObjects/SceneTransition/test/test.cpp +++ b/ObjectOrientedProgramming/ClassesAndObjects/SceneTransition/test/test.cpp @@ -29,6 +29,6 @@ TEST(SceneManagerTest, transitionScene) { manager.initialize(); Scene *scene = manager.getCurrentScene(); ASSERT_EQ(scene->getID(), SceneID::DYNAMIC_GAME_FIELD); - scene = manager.transitionScene(SceneID::LEADERBOARD, scene, 100); + scene = manager.transitionScene(SceneID::LEADERBOARD); ASSERT_EQ(scene->getID(), SceneID::LEADERBOARD); } \ No newline at end of file diff --git a/ObjectOrientedProgramming/ClassesAndObjects/StaticMembers/CMakeLists.txt b/ObjectOrientedProgramming/ClassesAndObjects/StaticMembers/CMakeLists.txt index 0be52bb..9a01802 100644 --- a/ObjectOrientedProgramming/ClassesAndObjects/StaticMembers/CMakeLists.txt +++ b/ObjectOrientedProgramming/ClassesAndObjects/StaticMembers/CMakeLists.txt @@ -11,6 +11,7 @@ set(SRC src/collision.cpp src/direction.cpp src/rectangle.cpp src/point.cpp src/operators.cpp src/utils.cpp + src/leaderboardscene.cpp src/leaderboard.cpp ) set(TEST diff --git a/ObjectOrientedProgramming/ClassesAndObjects/StaticMembers/src/leaderboard.cpp b/ObjectOrientedProgramming/ClassesAndObjects/StaticMembers/src/leaderboard.cpp new file mode 100644 index 0000000..a4c3653 --- /dev/null +++ b/ObjectOrientedProgramming/ClassesAndObjects/StaticMembers/src/leaderboard.cpp @@ -0,0 +1,28 @@ +#include "leaderboard.hpp" +#include "constants.hpp" + +void Leaderboard::loadScores() { + // TODO: write your solution here +} + +void Leaderboard::addScore(unsigned int score, std::string & name) { + // TODO: write your solution here +} + +void Leaderboard::saveScores() { + // TODO: write your solution here +} + +void Leaderboard::updateScore(unsigned int score, std::string & name) { + // TODO: write your solution here +} + +sf::Text createText(const std::string &str, const sf::Font &font, const unsigned int size, const float x, const float y) { + sf::Text text; + text.setFont(font); + text.setCharacterSize(size); + text.setFillColor(sf::Color::White); + text.setString(str); + text.setPosition(x, y); + return text; +} diff --git a/ObjectOrientedProgramming/ClassesAndObjects/StaticMembers/src/leaderboardscene.cpp b/ObjectOrientedProgramming/ClassesAndObjects/StaticMembers/src/leaderboardscene.cpp new file mode 100644 index 0000000..d1fa187 --- /dev/null +++ b/ObjectOrientedProgramming/ClassesAndObjects/StaticMembers/src/leaderboardscene.cpp @@ -0,0 +1,163 @@ +#include "leaderboardscene.hpp" +#include "constants.hpp" +#include "operators.hpp" + +LeaderboardScene::LeaderboardScene() : Scene(SCENE_WIDTH, SCENE_HEIGHT) { + state = LeaderboardState::INSERT_NAME; + playerName = ""; + playerScore = 0; + font = TextureManager::getFont(); +} + +void LeaderboardScene::activate() { + return; +} + +void LeaderboardScene::deactivate() { + return; +} + +SceneID LeaderboardScene::getID() const { + return SceneID::LEADERBOARD; +} + +SceneID LeaderboardScene::getNextSceneID() const { + return SceneID::LEADERBOARD; +} + +void LeaderboardScene::processText(const sf::Event &event) { + // TODO: Write your solution here +} + +void LeaderboardScene::processBackspace() { + // TODO: Write your solution here +} + +void LeaderboardScene::processEnter() { + // TODO: Write your solution here +} + +void LeaderboardScene::processEvent(const sf::Event &event) { + if (state == LeaderboardState::INSERT_NAME) { + if (event.type == sf::Event::TextEntered) { + processText(event); + } else if (event.type == sf::Event::KeyPressed) { + if (event.key.code == sf::Keyboard::BackSpace) { + processBackspace(); + } else if (event.key.code == sf::Keyboard::Enter) { + processEnter(); + } + } + } +} + +void LeaderboardScene::update(sf::Time delta) { + return; +} + +void LeaderboardScene::draw(sf::RenderWindow &window, TextureManager &textureManager) { + window.clear(sf::Color::Black); + if (state == LeaderboardState::INSERT_NAME) { + drawInsertNameScreen(window); + } else if (state == LeaderboardState::SHOW_LEADERBOARD) { + drawLeaderboard(window); + } +} + +void LeaderboardScene::drawInsertNameScreen(sf::RenderWindow &window) { + sf::RectangleShape inputBox(sf::Vector2f(INPUTBOX_WIDTH, INPUTBOX_HEIGHT)); + inputBox.setSize(sf::Vector2f(INPUTBOX_WIDTH, INPUTBOX_HEIGHT)); + inputBox.setFillColor(sf::Color::Black); + inputBox.setOutlineColor(sf::Color::White); + inputBox.setOutlineThickness(2); + inputBox.setPosition(SCENE_WIDTH / 2 - inputBox.getSize().x / 2, SCENE_HEIGHT / 2 - inputBox.getSize().y / 2); + + sf::Text prompt; + prompt.setFont(font); + prompt.setString("Insert Name"); + prompt.setCharacterSize(INPUTNAME_FONT_SIZE); + prompt.setFillColor(sf::Color::White); + prompt.setPosition(SCENE_WIDTH / 2 - prompt.getGlobalBounds().width / 2, SCENE_HEIGHT / 2 - inputBox.getSize().y / 2 - 100); + + sf::Text nameText; + nameText.setFont(font); + nameText.setString(playerName); + nameText.setCharacterSize(INPUTNAME_FONT_SIZE); + nameText.setFillColor(sf::Color::White); + + sf::FloatRect textBounds = nameText.getLocalBounds(); + float textHeight = textBounds.height; + float textYOffset = textBounds.top; + float inputBoxCenterY = inputBox.getPosition().y + inputBox.getSize().y / 2; + nameText.setPosition(SCENE_WIDTH / 2 - textBounds.width / 2, inputBoxCenterY - textHeight / 2 - textYOffset); + + window.draw(inputBox); + window.draw(prompt); + window.draw(nameText); +} + +void LeaderboardScene::drawLeaderboard(sf::RenderWindow &window) { + sf::Text header = createText("LEADERBOARD", font, HEADER_FONT_SIZE, HEADER_X, HEADER_Y); + window.draw(header); + + sf::Text posHeader = createText("POS", font, LEADERBOARD_FONT_SIZE, POS_HEADER_X, POS_HEADER_Y); + window.draw(posHeader); + + sf::Text nameHeader = createText("NAME", font, LEADERBOARD_FONT_SIZE, NAME_HEADER_X, NAME_HEADER_Y); + window.draw(nameHeader); + + sf::Text scoreHeader = createText("SCORE", font, LEADERBOARD_FONT_SIZE, SCORE_HEADER_X, SCORE_HEADER_Y); + window.draw(scoreHeader); + + unsigned int NUMBER_OF_ROWS = leaderboard.getScores().size(); + float LEADERBOARD_HEIGHT = ROW_HEIGHT * (NUMBER_OF_ROWS + 1); // One additional row for the header + + // Draw horizontal lines + sf::RectangleShape line(sf::Vector2f(LEADERBOARD_WIDTH, 2)); + line.setFillColor(sf::Color::White); + for (unsigned int i = 0; i <= NUMBER_OF_ROWS + 1; ++i) { + line.setPosition(LEADERBOARD_X, LEADERBOARD_Y + i * ROW_HEIGHT); + window.draw(line); + } + + // Draw vertical lines + sf::RectangleShape line1(sf::Vector2f(2, LEADERBOARD_HEIGHT)); + line1.setPosition(LEADERBOARD_X, LEADERBOARD_Y); + window.draw(line1); + sf::RectangleShape line2(sf::Vector2f(2, LEADERBOARD_HEIGHT)); + line2.setPosition(LEADERBOARD_X + 50, LEADERBOARD_Y); + window.draw(line2); + sf::RectangleShape line3(sf::Vector2f(2, LEADERBOARD_HEIGHT)); + line3.setPosition(LEADERBOARD_X + 450, LEADERBOARD_Y); + window.draw(line3); + sf::RectangleShape line4(sf::Vector2f(2, LEADERBOARD_HEIGHT)); + line4.setPosition(LEADERBOARD_X + 600, LEADERBOARD_Y); + window.draw(line4); + + // Draw contents of the leaderboard + auto scores = leaderboard.getScores(); + for (std::size_t i = 0; i < scores.size(); ++i) { + auto it = std::next(scores.begin(), i); + + sf::Text pos; + if (i != 9) { + pos = createText(std::to_string(i + 1), font, LEADERBOARD_FONT_SIZE, LEADERBOARD_X + TWO_DIGIT_POS_OFFSET, LEADERBOARD_Y + ROW_HEIGHT * (i + 1) + BORDER_OFFSET); + } else { + pos = createText(std::to_string(i + 1), font, LEADERBOARD_FONT_SIZE, LEADERBOARD_X + ONE_DIGIT_POS_OFFSET, LEADERBOARD_Y + ROW_HEIGHT * (i + 1) + BORDER_OFFSET); + } + window.draw(pos); + + sf::Text name = createText(it->second, font, LEADERBOARD_FONT_SIZE, LEADERBOARD_X + NAME_X_OFFSET, LEADERBOARD_Y + ROW_HEIGHT * (i + 1) + BORDER_OFFSET); + window.draw(name); + + sf::Text score; + if (std::to_string(it->first).length() == 1) { + score = createText(std::to_string(it->first), font, LEADERBOARD_FONT_SIZE, LEADERBOARD_X + ONE_DIGIT_SCORE_OFFSET, LEADERBOARD_Y + ROW_HEIGHT * (i + 1) + BORDER_OFFSET); + } else if (std::to_string(it->first).length() == 4) { + score = createText(std::to_string(it->first), font, LEADERBOARD_FONT_SIZE, LEADERBOARD_X + FOUR_DIGIT_SCORE_OFFSET, LEADERBOARD_Y + ROW_HEIGHT * (i + 1) + BORDER_OFFSET); + } else { + score = createText(std::to_string(it->first), font, LEADERBOARD_FONT_SIZE, LEADERBOARD_X + FIVE_DIGIT_SCORE_OFFSET, LEADERBOARD_Y + ROW_HEIGHT * (i + 1) + BORDER_OFFSET); + } + window.draw(score); + } +} diff --git a/ObjectOrientedProgramming/ClassesAndObjects/StaticMembers/task-info.yaml b/ObjectOrientedProgramming/ClassesAndObjects/StaticMembers/task-info.yaml index 295aee2..1cb94e9 100644 --- a/ObjectOrientedProgramming/ClassesAndObjects/StaticMembers/task-info.yaml +++ b/ObjectOrientedProgramming/ClassesAndObjects/StaticMembers/task-info.yaml @@ -45,3 +45,7 @@ files: - name: test/test.cpp visible: false propagatable: false +- name: src/leaderboard.cpp + visible: false +- name: src/leaderboardscene.cpp + visible: false