#pragma once #include #include #include #include #include #include #include #include "game_engine.hpp" #include using std::string; enum class Value { BLACK=0, DARK_DARK, DARK_MID, DARK_LIGHT, MID, LIGHT_DARK, LIGHT_MID, LIGHT_LIGHT, WHITE, TRANSPARENT }; constexpr int FPS=30; constexpr int X_DIM = 1920 / 2; constexpr int Y_DIM = 1080 / 2; constexpr int TEXT_SIZE = 48; constexpr Value TEXT_COLOR = Value::LIGHT_LIGHT; constexpr int Y_LINES = 23; constexpr int X_ROWS = 48; constexpr Value BOX_OUTLINE = Value::MID; constexpr int BOX_THICKNESS=10; constexpr Value BOX_FILL = Value::TRANSPARENT; enum class Button { NONE, START, STOP }; class SoundQuip { public: sf::Sound sound; sf::SoundBuffer buffer; bool initialized; SoundQuip() {}; void load(nlohmann::json &data, const char *file_key, bool loop=false); void play(); void stop(); }; class SFMLBackend { sf::ContextSettings settings; sf::RenderWindow window; sf::Sprite face_sprite; sf::Texture face_texture; sf::Sprite stop_button; sf::Texture stop_texture; sf::Sprite start_button; sf::Texture start_texture; std::chrono::time_point clock_start; Button buttons = Button::STOP; int hit_points = 50; sf::Font font; GameEngine &game; std::vector log; public: SFMLBackend(GameEngine &g); // prevent copy SFMLBackend(SFMLBackend &g) = delete; void startup(); bool is_open(); void shutdown(); void change_face(const string name); void handle_events(); void update_entities(); void update_log(std::vector &lines); sf::Color value(Value level); sf::RectangleShape box(int x, int y, int width, int height, Value fill=BOX_FILL, Value outline=BOX_OUTLINE, int thickness=BOX_THICKNESS); void write_text(int x, int y, string content, float size_mult=1.0f, Value color=TEXT_COLOR); void Window_update(); };