Commit 0a84ad8c authored by Печенин Данила Михайлович's avatar Печенин Данила Михайлович
Browse files

Buttons were added to SelectState window

parent 9dce19ba
No related merge requests found
Showing with 107 additions and 39 deletions
+107 -39
File deleted
File added
...@@ -3,15 +3,15 @@ ...@@ -3,15 +3,15 @@
class MyFont { class MyFont {
public: public:
static MyFont& Instance() { static sf::Font& Instance() {
static MyFont instance; static MyFont instance;
return instance; return instance.m_font;
} }
MyFont(const MyFont&) = delete; MyFont(const MyFont&) = delete;
MyFont& operator=(const MyFont&) = delete; MyFont& operator=(const MyFont&) = delete;
private: private:
MyFont() { MyFont() {
if (!m_font.loadFromFile(config::FONT_FILE) if (!m_font.loadFromFile(config::FONT_FILE))
throw std::runtime_error("Failed to load font"); throw std::runtime_error("Failed to load font");
} }
~MyFont() = default; ~MyFont() = default;
......
...@@ -8,7 +8,7 @@ namespace config { ...@@ -8,7 +8,7 @@ namespace config {
const sf::Vector2f BUTTON_SIZE = { 250, 100 }; const sf::Vector2f BUTTON_SIZE = { 250, 100 };
const size_t BUTTON_FONT_SIZE = static_cast<size_t>(BUTTON_SIZE.y / 1.5f); const size_t BUTTON_FONT_SIZE = static_cast<size_t>(BUTTON_SIZE.y / 1.5f);
constexpr float BUTTON_FRAME_THICKNESS = 2.0f; constexpr float BUTTON_FRAME_THICKNESS = 2.0f;
constexpr char FONT_FILE[] = "Calibri-Light.ttf"; constexpr char FONT_FILE[] = "calibril.ttf";
constexpr char SELECT_LEVEL_TITLE[] = "Select Level"; constexpr char SELECT_LEVEL_TITLE[] = "Select Level";
const sf::VideoMode SELECT_LEVEL_VIDEO_MODE{ 400, 600 }; const sf::VideoMode SELECT_LEVEL_VIDEO_MODE{ 400, 600 };
constexpr char BUTTON_TEXT_EASY[] = "Easy"; constexpr char BUTTON_TEXT_EASY[] = "Easy";
...@@ -16,34 +16,34 @@ namespace config { ...@@ -16,34 +16,34 @@ namespace config {
constexpr char BUTTON_TEXT_HARD[] = "Hard"; constexpr char BUTTON_TEXT_HARD[] = "Hard";
constexpr char BUTTON_TEXT_EXIT[] = "Exit"; constexpr char BUTTON_TEXT_EXIT[] = "Exit";
// Игра: // Игра:
const sf::VideoMode GAME_VIDEO_MODE{ 1080, 720 }; // const sf::VideoMode GAME_VIDEO_MODE{ 1080, 720 };
constexpr char EASY_GAME_TITLE[] = "Level: Easy"; // constexpr char EASY_GAME_TITLE[] = "Level: Easy";
constexpr char MEDIUM_GAME_TITLE[] = "Level: Medium"; // constexpr char MEDIUM_GAME_TITLE[] = "Level: Medium";
constexpr char HARD_GAME_TITLE[] = "Level: Hard"; // constexpr char HARD_GAME_TITLE[] = "Level: Hard";
constexpr float EASY_GAME_ENEMY_RATIO = 0.0f; // constexpr float EASY_GAME_ENEMY_RATIO = 0.0f;
constexpr float MEDIUM_GAME_ENEMY_RATIO = 0.03f; // constexpr float MEDIUM_GAME_ENEMY_RATIO = 0.03f;
constexpr float HARD_GAME_ENEMY_RATIO = 0.07f; // constexpr float HARD_GAME_ENEMY_RATIO = 0.07f;
constexpr float ROOM_SIZE = 50; // constexpr float ROOM_SIZE = 50;
constexpr float GAME_ENEMY_SIZE = ROOM_SIZE * 0.7; // constexpr float GAME_ENEMY_SIZE = ROOM_SIZE * 0.7;
constexpr float GAME_FOOD_SIZE = ROOM_SIZE * 0.2; // constexpr float GAME_FOOD_SIZE = ROOM_SIZE * 0.2;
// Пакмэн: // Пакмэн:
constexpr float GAME_PACMAN_SIZE = ROOM_SIZE * 0.8; // constexpr float GAME_PACMAN_SIZE = ROOM_SIZE * 0.8;
constexpr sf::Keyboard::Key KEY_LEFT = sf::Keyboard::A; // constexpr sf::Keyboard::Key KEY_LEFT = sf::Keyboard::A;
constexpr sf::Keyboard::Key KEY_RIGHT = sf::Keyboard::D; // constexpr sf::Keyboard::Key KEY_RIGHT = sf::Keyboard::D;
constexpr sf::Keyboard::Key KEY_UP = sf::Keyboard::W; // constexpr sf::Keyboard::Key KEY_UP = sf::Keyboard::W;
constexpr sf::Keyboard::Key KEY_DOWN = sf::Keyboard::S; // constexpr sf::Keyboard::Key KEY_DOWN = sf::Keyboard::S;
// Цвета: // Цвета:
const sf::Color BUTTON_COLOR_TEXT{ 0, 0, 0 }; const sf::Color BUTTON_COLOR_TEXT{ 0, 0, 0 };
const sf::Color BUTTON_COLOR_FILL{ 180, 180, 180 }; const sf::Color BUTTON_COLOR_FILL{ 180, 180, 180 };
const sf::Color BUTTON_COLOR_SELECTION{ 255, 180, 180 }; const sf::Color BUTTON_COLOR_SELECTION{ 255, 180, 180 };
const sf::Color BUTTON_COLOR_FRAME{ 0, 0, 0 }; const sf::Color BUTTON_COLOR_FRAME{ 0, 0, 0 };
const sf::Color SELECT_LEVEL_BACKGROUND_COLOR{ 230,230,230 }; const sf::Color SELECT_LEVEL_BACKGROUND_COLOR{ 230,230,230 };
const sf::Color GAME_COLOR_BACKGROUND_INGAME{ 230,230,230 }; // const sf::Color GAME_COLOR_BACKGROUND_INGAME{ 230,230,230 };
const sf::Color GAME_COLOR_BACKGROUND_WIN{ 0, 255, 0 }; // const sf::Color GAME_COLOR_BACKGROUND_WIN{ 0, 255, 0 };
const sf::Color GAME_COLOR_BACKGROUND_LOST{ 255, 0, 0 }; // const sf::Color GAME_COLOR_BACKGROUND_LOST{ 255, 0, 0 };
const sf::Color GAME_COLOR_PACMAN{ 250, 150, 0 }; // const sf::Color GAME_COLOR_PACMAN{ 250, 150, 0 };
const sf::Color GAME_COLOR_ROOM{ 255, 255, 255 }; // const sf::Color GAME_COLOR_ROOM{ 255, 255, 255 };
const sf::Color GAME_COLOR_WALL{ 0, 0, 0 }; // const sf::Color GAME_COLOR_WALL{ 0, 0, 0 };
const sf::Color GAME_FOOD_COLOR{ 0, 200, 100 }; // const sf::Color GAME_FOOD_COLOR{ 0, 200, 100 };
const sf::Color GAME_ENEMY_COLOR{ 255, 50, 0 }; // const sf::Color GAME_ENEMY_COLOR{ 255, 50, 0 };
} }
\ No newline at end of file
#include "SelectState.h" #include "SelectState.h"
#include "../ExitState/ExitState.h" #include "../ExitState/ExitState.h"
#include "../../Configuration.h" #include "../../Configuration.h"
#include "../../BasicAbstractions/Font.h"
void Button::draw_into(sf::RenderWindow& window) const {
window.draw(m_rectangle);
window.draw(m_text);
}
void Button::set(const sf::Vector2f pos, const sf::Vector2f size, const std::string& text, const size_t font_size) {//, std::shared_ptr<ISelectCommand> ptr_command) {
m_rectangle.setSize(size);
m_rectangle.setPosition(pos);
m_rectangle.setFillColor(config::BUTTON_COLOR_FILL);
m_rectangle.setOutlineThickness(config::BUTTON_FRAME_THICKNESS);
m_rectangle.setOutlineColor(config::BUTTON_COLOR_FRAME);
m_text.setFont(MyFont::Instance());
m_text.setCharacterSize(font_size);
m_text.setFillColor(config::BUTTON_COLOR_TEXT);
m_text.setString(text);
const sf::FloatRect text_bounds = m_text.getLocalBounds();
const sf::Vector2f button_pos = m_rectangle.getPosition();
const sf::Vector2f button_size = m_rectangle.getSize();
m_text.setPosition(
round(button_pos.x + (button_size.x - text_bounds.width) / 2 - text_bounds.left),
round(button_pos.y + (button_size.y - text_bounds.height) / 2 - text_bounds.top)
);
}
void Button::select() {
m_rectangle.setFillColor(config::BUTTON_COLOR_SELECTION);
}
void Button::unselect() {
m_rectangle.setFillColor(config::BUTTON_COLOR_FILL);
}
bool Button::is_position_in(const sf::Vector2f pos) const {
return pos.x >= m_rectangle.getPosition().x && pos.x <= (m_rectangle.getPosition().x + m_rectangle.getSize().x)
&& pos.y >= m_rectangle.getPosition().y && pos.y <= (m_rectangle.getPosition().y + m_rectangle.getSize().y);
}
Menu::Menu(IStateManager& state_manager) {
const float pos_left = (static_cast<float>(config::SELECT_LEVEL_VIDEO_MODE.width) - config::BUTTON_SIZE.x) / 2;
const float pos_diff = (static_cast<float>(config::SELECT_LEVEL_VIDEO_MODE.height) - config::BUTTON_SIZE.y * 4) / 10;
const float pos_top = (static_cast<float>(config::SELECT_LEVEL_VIDEO_MODE.height) - config::BUTTON_SIZE.y*4 - pos_diff*3) / 2;
m_buttons[0].set(sf::Vector2f{pos_left, pos_top},
config::BUTTON_SIZE, config::BUTTON_TEXT_EASY, config::BUTTON_FONT_SIZE);
m_buttons[1].set(sf::Vector2f{pos_left, pos_top + config::BUTTON_SIZE.y + pos_diff},
config::BUTTON_SIZE, config::BUTTON_TEXT_MEDIUM, config::BUTTON_FONT_SIZE);
m_buttons[2].set(sf::Vector2f{pos_left, pos_top + 2*(config::BUTTON_SIZE.y + pos_diff)},
config::BUTTON_SIZE, config::BUTTON_TEXT_HARD, config::BUTTON_FONT_SIZE);
m_buttons[3].set(sf::Vector2f{pos_left, pos_top + 3*(config::BUTTON_SIZE.y + pos_diff)},
config::BUTTON_SIZE, config::BUTTON_TEXT_EXIT, config::BUTTON_FONT_SIZE);
}
void Menu::process_mouse(const sf::Vector2f pos, bool is_pressed) {
for (auto& button : m_buttons) {
if (button.is_position_in(pos))
button.select();
else button.unselect();
}
}
void Menu::draw_into(sf::RenderWindow& window) const {
for (auto& button : m_buttons) {
button.draw_into(window);
}
}
void SelectState::event_handling() { void SelectState::event_handling() {
sf::Event event{}; sf::Event event{};
...@@ -13,11 +79,13 @@ void SelectState::event_handling() { ...@@ -13,11 +79,13 @@ void SelectState::event_handling() {
} }
void SelectState::update() { void SelectState::update() {
m_menu.process_mouse(m_window.mapPixelToCoords(sf::Mouse::getPosition(m_window)), true);
} }
void SelectState::render() { void SelectState::render() {
m_window.clear(config::SELECT_LEVEL_BACKGROUND_COLOR);
m_menu.draw_into(m_window);
m_window.display();
} }
bool SelectState::do_step() { bool SelectState::do_step() {
......
...@@ -7,23 +7,23 @@ ...@@ -7,23 +7,23 @@
class Button: public IDrawable { class Button: public IDrawable {
public: public:
Button() = default; Button() = default;
void set(sf::Vector2f pos, sf::Vector2f size, std::string text, size_t font_size, std::shared_ptr<ISelectCommand> ptr_command) {} void set(sf::Vector2f pos, sf::Vector2f size, const std::string& text, size_t font_size);//, std::shared_ptr<ISelectCommand> ptr_command);
bool select() {} void select();
bool unselect() {} void unselect();
bool is_position_in(sf::Vector2f pos) {} bool is_position_in(sf::Vector2f pos) const;
void push() {} // void push();
void draw_into(sf::RenderWindow& window) const override {} void draw_into(sf::RenderWindow& window) const override;
private: private:
sf::Text m_text; sf::Text m_text;
sf::RectangleShape m_rectangle; sf::RectangleShape m_rectangle;
std::shared_ptr<ISelectCommand> m_ptr_command; //std::shared_ptr<ISelectCommand> m_ptr_command; /// @todo shared_ptr?
}; };
class Menu: public IDrawable { class Menu: public IDrawable {
public: public:
explicit Menu(IStateManager& state_manager) {} explicit Menu(IStateManager& state_manager);
void process_mouse(sf::Vector2f pos, bool is_pressed) {} void process_mouse(sf::Vector2f pos, bool is_pressed);
void draw_into(sf::RenderWindow& window) const override {} void draw_into(sf::RenderWindow& window) const override;
private: private:
std::array<Button, 4> m_buttons; std::array<Button, 4> m_buttons;
}; };
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment