summaryrefslogtreecommitdiff
path: root/src/SfmlUtils.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/SfmlUtils.h')
-rw-r--r--src/SfmlUtils.h110
1 files changed, 110 insertions, 0 deletions
diff --git a/src/SfmlUtils.h b/src/SfmlUtils.h
new file mode 100644
index 0000000..dd63cd6
--- /dev/null
+++ b/src/SfmlUtils.h
@@ -0,0 +1,110 @@
+//========================================================================
+// dng
+//------------------------------------------------------------------------
+// Copyright (c) 2022 Steph Enders <steph@senders.io>
+//
+// This software is provided 'as-is', without any express or implied
+// warranty. In no event will the authors be held liable for any damages
+// arising from the use of this software.
+//
+// Permission is granted to anyone to use this software for any purpose,
+// including commercial applications, and to alter it and redistribute it
+// freely, subject to the following restrictions:
+//
+// 1. The origin of this software must not be misrepresented; you must not
+// claim that you wrote the original software. If you use this software
+// in a product, an acknowledgment in the product documentation would
+// be appreciated but is not required.
+//
+// 2. Altered source versions must be plainly marked as such, and must not
+// be misrepresented as being the original software.
+//
+// 3. This notice may not be removed or altered from any source
+// distribution.
+//
+//========================================================================
+
+#ifndef DNG_SFML_UTILS_H
+#define DNG_SFML_UTILS_H
+
+#include "SFML/Graphics/RectangleShape.hpp"
+#include "SFML/Graphics/Text.hpp"
+#include "SFML/Window/Event.hpp"
+#include "SFML/Window/Keyboard.hpp"
+#include <cmath>
+#include <iostream>
+
+const float SPRITE_SIZE = 16.f; // squares
+const sf::Color WALL_COLOR = sf::Color(150, 150, 150, 255);
+const sf::Color BLANK_COLOR = sf::Color(216, 216, 216, 255);
+
+inline sf::Keyboard::Key get_key(sf::Event event) {
+ if (event.type == sf::Event::KeyPressed ||
+ sf::Keyboard::isKeyPressed(event.key.code)) {
+ return event.key.code;
+ }
+ return sf::Keyboard::Unknown;
+}
+
+inline sf::Vector2f to_position_xy(int x, int y) {
+ return {static_cast<float>(x) * SPRITE_SIZE,
+ static_cast<float>(y) * SPRITE_SIZE};
+}
+inline sf::Vector2f to_position(const Pos &pos) {
+ return to_position_xy(pos.x, pos.y);
+}
+
+inline sf::RectangleShape create_square(sf::Color color, int x, int y) {
+ sf::RectangleShape rect({SPRITE_SIZE - 1.f, SPRITE_SIZE - 1.f});
+ rect.setFillColor(color);
+ rect.setOutlineColor(sf::Color::Black);
+ rect.setOutlineThickness(1.f);
+ rect.setPosition(to_position_xy(x, y));
+ return rect;
+}
+
+inline sf::RectangleShape create_wall(int x, int y) {
+ return create_square(WALL_COLOR, x, y);
+}
+
+inline sf::RectangleShape create_enemy(int x, int y) {
+ return create_square(sf::Color::Magenta, x, y);
+}
+
+inline sf::RectangleShape create_player(int x, int y) {
+ return create_square(sf::Color::Cyan, x, y);
+}
+
+inline sf::RectangleShape create_treasure(int x, int y) {
+ return create_square(sf::Color::Yellow, x, y);
+}
+
+inline sf::Vector2f round(const sf::Vector2f vector) {
+ return sf::Vector2f{std::round(vector.x), std::round(vector.y)};
+}
+
+inline sf::Text write_text(const char *msg, unsigned int fontSize,
+ float lineSpacing, const sf::Font &font,
+ const sf::Vector2u windowSize) {
+ sf::Text text(msg, font, fontSize);
+ text.setOutlineThickness(4.f);
+ text.setOrigin(round(sf::Vector2f{text.getLocalBounds().width / 2,
+ text.getLocalBounds().height / 2}));
+ text.setPosition(sf::Vector2f(windowSize / 2u));
+ text.setLineSpacing(lineSpacing);
+ while (text.getGlobalBounds().top < 0 || text.getGlobalBounds().left < 0 ||
+ static_cast<unsigned int>(
+ (text.getGlobalBounds().width + text.getGlobalBounds().left) *
+ text.getLineSpacing()) > windowSize.x ||
+ static_cast<unsigned int>(
+ (text.getGlobalBounds().height + text.getGlobalBounds().top) *
+ text.getLineSpacing()) > windowSize.y) {
+ text.setCharacterSize(text.getCharacterSize() - 1);
+ text.setOrigin(round(sf::Vector2f{text.getLocalBounds().width / 2,
+ text.getLocalBounds().height / 2}));
+ text.setPosition(sf::Vector2f(windowSize / 2u));
+ }
+ return text;
+}
+
+#endif // DNG_SFML_UTILS_H \ No newline at end of file