#pragma once #include // Para Uint8 #include // Para unique_ptr, shared_ptr #include // Para string #include "sprite.h" // Para Sprite #include "utils.h" // Para Color class Texture; // --- Constantes para flags de texto --- constexpr int TEXT_COLOR = 1; constexpr int TEXT_SHADOW = 2; constexpr int TEXT_CENTER = 4; constexpr int TEXT_STROKE = 8; // --- Estructuras auxiliares --- struct TextOffset { int x, y, w; }; struct TextFile { int box_width; // Anchura de la caja de cada caracter en el png int box_height; // Altura de la caja de cada caracter en el png TextOffset offset[128]; // Vector con las posiciones y ancho de cada letra }; // Llena una estructura TextFile desde un fichero auto loadTextFile(const std::string &file_path) -> std::shared_ptr; // --- Clase Text: pinta texto en pantalla a partir de un bitmap --- class Text { public: // --- Constructores y destructor --- Text(std::shared_ptr texture, const std::string &text_file); Text(std::shared_ptr texture, std::shared_ptr text_file); ~Text() = default; // --- Métodos de escritura en pantalla --- void write(int x, int y, const std::string &text, int kerning = 1, int lenght = -1); // Escribe el texto en pantalla void write2X(int x, int y, const std::string &text, int kerning = 1); // Escribe el texto al doble de tamaño // --- Escritura en textura --- auto writeToTexture(const std::string &text, int zoom = 1, int kerning = 1) -> std::shared_ptr; // Escribe el texto en una textura auto writeDXToTexture(Uint8 flags, const std::string &text, int kerning = 1, Color text_color = Color(), Uint8 shadow_distance = 1, Color shadow_color = Color(), int lenght = -1) -> std::shared_ptr; // Escribe el texto con extras en una textura // --- Métodos de escritura avanzada --- void writeColored(int x, int y, const std::string &text, Color color, int kerning = 1, int lenght = -1); // Escribe el texto con colores void writeShadowed(int x, int y, const std::string &text, Color color, Uint8 shadow_distance = 1, int kerning = 1, int lenght = -1); // Escribe el texto con sombra void writeCentered(int x, int y, const std::string &text, int kerning = 1, int lenght = -1); // Escribe el texto centrado en un punto x void writeDX(Uint8 flags, int x, int y, const std::string &text, int kerning = 1, Color text_color = Color(), Uint8 shadow_distance = 1, Color shadow_color = Color(), int lenght = -1); // Escribe texto con extras // --- Utilidades --- [[nodiscard]] auto lenght(const std::string &text, int kerning = 1) const -> int; // Obtiene la longitud en pixels de una cadena [[nodiscard]] auto getCharacterSize() const -> int; // Devuelve el tamaño de caracter actual // --- Configuración --- void setFixedWidth(bool value); // Establece si se usa un tamaño fijo de letra void setPalette(int number); // Establece una paleta private: // --- Objetos y punteros --- std::unique_ptr sprite_ = nullptr; // Objeto con los gráficos para el texto // --- Variables --- int box_width_ = 0; // Anchura de la caja de cada caracter en el png int box_height_ = 0; // Altura de la caja de cada caracter en el png bool fixed_width_ = false; // Indica si el texto se ha de escribir con longitud fija en todas las letras TextOffset offset_[128] = {}; // Vector con las posiciones y ancho de cada letra };