Les notificacions ara accepten un vector de cadenes en lloc de una o dos cadenes

This commit is contained in:
2024-11-03 18:12:46 +01:00
parent 69a92cba66
commit f29eb2f411
6 changed files with 61 additions and 75 deletions

View File

@@ -1451,7 +1451,7 @@ void Game::checkEvents()
case SDLK_3: // Activa el modo para pasar el juego automaticamente
{
auto_pop_balloons_ = !auto_pop_balloons_;
Notifier::get()->showText("auto_pop_balloons_ " + boolToString(auto_pop_balloons_));
Notifier::get()->showText({"auto_pop_balloons_ " + boolToString(auto_pop_balloons_)});
break;
}
case SDLK_4: // Suelta un item

View File

@@ -40,9 +40,9 @@ namespace globalInputs
{
#ifdef ARCADE
const int index = code == section::Options::QUIT_WITH_CONTROLLER ? 116 : 94;
Notifier::get()->showText(lang::getText(index), std::string(), -1, exit_code);
Notifier::get()->showText({lang::getText(index), std::string()}, -1, exit_code);
#else
Notifier::get()->showText(lang::getText(94), std::string(), -1, exit_code);
Notifier::get()->showText({lang::getText(94), std::string()}, -1, exit_code);
#endif
}
}
@@ -51,7 +51,7 @@ namespace globalInputs
void reset()
{
section::name = section::Name::INIT;
Notifier::get()->showText("Reset");
Notifier::get()->showText({"Reset"});
}
// Activa o desactiva el audio
@@ -68,7 +68,7 @@ namespace globalInputs
JA_SetMusicVolume(0);
JA_SetSoundVolume(0);
}
Notifier::get()->showText("Audio " + boolToOnOff(options.audio.enabled));
Notifier::get()->showText({"Audio " + boolToOnOff(options.audio.enabled)});
}
// Comprueba los inputs que se pueden introducir en cualquier sección del juego
@@ -82,7 +82,7 @@ namespace globalInputs
{
Screen::get()->toggleVideoMode();
const std::string mode = options.video.mode == ScreenVideoMode::WINDOW ? "Window" : "Fullscreen";
Notifier::get()->showText(mode + " mode");
Notifier::get()->showText({mode + " mode"});
return;
}
@@ -91,7 +91,7 @@ namespace globalInputs
{
Screen::get()->decWindowSize();
const std::string size = std::to_string(options.video.window.size);
Notifier::get()->showText("Window size x" + size);
Notifier::get()->showText({"Window size x" + size});
return;
}
@@ -100,7 +100,7 @@ namespace globalInputs
{
Screen::get()->incWindowSize();
const std::string size = std::to_string(options.video.window.size);
Notifier::get()->showText("Window size x" + size);
Notifier::get()->showText({"Window size x" + size});
return;
}
#endif

View File

@@ -2,12 +2,14 @@
#include <SDL2/SDL_blendmode.h> // Para SDL_BLENDMODE_BLEND
#include <SDL2/SDL_pixels.h> // Para SDL_PIXELFORMAT_RGBA8888
#include <string> // Para string
#include "jail_audio.h" // Para JA_DeleteSound, JA_LoadSound, JA_Pla...
#include "param.h" // Para Param, param, ParamNotification, Par...
#include "screen.h" // Para Screen
#include "sprite.h" // Para Sprite
#include "text.h" // Para Text
#include "texture.h" // Para Texture
#include <algorithm>
#include <vector>
#include "jail_audio.h" // Para JA_DeleteSound, JA_LoadSound, JA_Pla...
#include "param.h" // Para Param, param, ParamNotification, Par...
#include "screen.h" // Para Screen
#include "sprite.h" // Para Sprite
#include "text.h" // Para Text
#include "texture.h" // Para Texture
// [SINGLETON] Hay que definir las variables estáticas, desde el .h sólo la hemos declarado
Notifier *Notifier::notifier_ = nullptr;
@@ -51,7 +53,9 @@ Notifier::~Notifier()
void Notifier::render()
{
for (int i = (int)notifications_.size() - 1; i >= 0; --i)
{
notifications_[i].sprite->render();
}
}
// Actualiza el estado de las notificaiones
@@ -154,39 +158,41 @@ void Notifier::clearFinishedNotifications()
}
}
void Notifier::showText(std::string text1, std::string text2, int icon, const std::string &code)
void Notifier::showText(std::vector<std::string> texts, int icon, const std::string &code)
{
// Cuenta el número de textos a mostrar
const int num_texts = !text1.empty() + !text2.empty();
// Si no hay texto, acaba
if (num_texts == 0)
if (texts.empty())
{
return;
}
// Si solo hay un texto, lo coloca en la primera variable
if (num_texts == 1)
{
text1 += text2;
text2.clear();
}
// Si las notificaciones no se apilan, elimina las anteriores
if (!stack_)
{
clearNotifications();
}
// Elimina las cadenas vacías
texts.erase(std::remove_if(texts.begin(), texts.end(), [](const std::string &s)
{ return s.empty(); }),
texts.end());
// Encuentra la cadena más larga
std::string longest;
for (const auto &text : texts)
{
if (text.length() > longest.length())
longest = text;
}
// Inicializa variables
constexpr auto icon_size = 16;
constexpr auto padding_out = 1;
constexpr int icon_size = 16;
constexpr int padding_out = 1;
const auto padding_in_h = text_->getCharacterSize();
const auto padding_in_v = text_->getCharacterSize() / 2;
const auto icon_space = icon >= 0 ? icon_size + padding_in_h : 0;
const std::string txt = text1.length() > text2.length() ? text1 : text2;
const auto width = text_->lenght(txt) + (padding_in_h * 2) + icon_space;
const auto height = (text_->getCharacterSize() * num_texts) + (padding_in_v * 2);
const int icon_space = icon >= 0 ? icon_size + padding_in_h : 0;
const int width = text_->lenght(longest) + (padding_in_h * 2) + icon_space;
const int height = (text_->getCharacterSize() * texts.size()) + (padding_in_v * 2);
const auto shape = NotificationShape::SQUARED;
// Posición horizontal
@@ -212,11 +218,11 @@ void Notifier::showText(std::string text1, std::string text2, int icon, const st
auto offset = 0;
if (param.notification.pos_v == NotifyPosition::TOP)
{
offset = (int)notifications_.size() > 0 ? notifications_.back().y + travel_dist : desp_v;
offset = !notifications_.empty() ? notifications_.back().y + travel_dist : desp_v;
}
else
{
offset = (int)notifications_.size() > 0 ? notifications_.back().y - travel_dist : desp_v;
offset = !notifications_.empty() ? notifications_.back().y - travel_dist : desp_v;
}
// Crea la notificacion
@@ -226,8 +232,7 @@ void Notifier::showText(std::string text1, std::string text2, int icon, const st
n.code = code;
n.y = offset;
n.travel_dist = travel_dist;
n.text1 = text1;
n.text2 = text2;
n.texts = texts;
n.shape = shape;
auto y_pos = offset + (param.notification.pos_v == NotifyPosition::TOP ? -travel_dist : travel_dist);
n.rect = {desp_h, y_pos, width, height};
@@ -264,7 +269,7 @@ void Notifier::showText(std::string text1, std::string text2, int icon, const st
}
// Dibuja el icono de la notificación
if (has_icons_ && icon >= 0 && num_texts == 2)
if (has_icons_ && icon >= 0 && texts.size() >= 2)
{
auto sp = std::make_unique<Sprite>(icon_texture_, (SDL_Rect){0, 0, icon_size, icon_size});
sp->setPosition({padding_in_h, padding_in_v, icon_size, icon_size});
@@ -273,15 +278,12 @@ void Notifier::showText(std::string text1, std::string text2, int icon, const st
}
// Escribe el texto de la notificación
Color color{255, 255, 255};
if (num_texts == 2)
{ // Dos lineas de texto
text_->writeColored(padding_in_h + icon_space, padding_in_v, text1, color);
text_->writeColored(padding_in_h + icon_space, padding_in_v + text_->getCharacterSize() + 1, text2, color);
}
else
{ // Una linea de texto
text_->writeColored(padding_in_h + icon_space, padding_in_v, text1, color);
const Color color{255, 255, 255};
int iterator = 0;
for (const auto &text : texts)
{
text_->writeColored(padding_in_h + icon_space, padding_in_v + iterator * (text_->getCharacterSize() + 1), text, color);
++iterator;
}
// Deja de dibujar en la textura
@@ -294,26 +296,18 @@ void Notifier::showText(std::string text1, std::string text2, int icon, const st
n.texture->setAlpha(0);
// Añade la notificación a la lista
notifications_.push_back(n);
notifications_.emplace_back(n);
}
// Indica si hay notificaciones activas
bool Notifier::isActive()
{
if ((int)notifications_.size() > 0)
{
return true;
}
return false;
}
bool Notifier::isActive() { return !notifications_.empty(); }
// Finaliza y elimnina todas las notificaciones activas
void Notifier::clearNotifications()
{
for (int i = 0; i < (int)notifications_.size(); ++i)
for (auto &notification : notifications_)
{
notifications_[i].status = NotificationStatus::FINISHED;
notification.status = NotificationStatus::FINISHED;
}
clearFinishedNotifications();
@@ -323,9 +317,9 @@ void Notifier::clearNotifications()
std::vector<std::string> Notifier::getCodes()
{
std::vector<std::string> codes;
for (int i = 0; i < (int)notifications_.size(); ++i)
for (const auto &notification : notifications_)
{
codes.push_back(notifications_[i].code);
codes.emplace_back(notification.code);
}
return codes;
}

View File

@@ -35,8 +35,7 @@ private:
{
std::shared_ptr<Texture> texture;
std::shared_ptr<Sprite> sprite;
std::string text1;
std::string text2;
std::vector<std::string> texts;
int counter;
NotificationStatus status;
NotificationShape shape;
@@ -47,7 +46,7 @@ private:
// Constructor
explicit Notification()
: texture(nullptr), sprite(nullptr), text1(""), text2(""), counter(0), status(NotificationStatus::RISING),
: texture(nullptr), sprite(nullptr), texts(), counter(0), status(NotificationStatus::RISING),
shape(NotificationShape::SQUARED), rect{0, 0, 0, 0}, y(0), travel_dist(0), code("") {}
};
@@ -95,15 +94,8 @@ public:
// Actualiza el estado de las notificaiones
void update();
/**
* @brief Muestra una notificación de texto por pantalla.
*
* @param text1 Primer texto opcional para mostrar (valor predeterminado: cadena vacía).
* @param text2 Segundo texto opcional para mostrar (valor predeterminado: cadena vacía).
* @param icon Icono opcional para mostrar (valor predeterminado: -1).
* @param code Permite asignar un código a la notificación (valor predeterminado: cadena vacía).
*/
void showText(std::string text1 = std::string(), std::string text2 = std::string(), int icon = -1, const std::string &code = std::string());
// Muestra una notificación de texto por pantalla
void showText(std::vector<std::string> texts, int icon = -1, const std::string &code = std::string());
// Indica si hay notificaciones activas
bool isActive();

View File

@@ -342,7 +342,7 @@ void Screen::toggleShaders()
options.video.shaders = !options.video.shaders;
setVideoMode(options.video.mode);
const std::string value = options.video.shaders ? "on" : "off";
Notifier::get()->showText("Shaders " + value);
Notifier::get()->showText({"Shaders " + value});
}
// Activa / desactiva la información de debug

View File

@@ -315,7 +315,7 @@ void Title::swapKeyboard()
{
swapOptionsKeyboard();
std::string text = lang::getText(100) + std::to_string(getPlayerWhoUsesKeyboard()) + ": " + lang::getText(69);
Notifier::get()->showText(text);
Notifier::get()->showText({text});
}
// Muestra información sobre los controles y los jugadores
@@ -343,5 +343,5 @@ void Title::showControllers()
}
}
Notifier::get()->showText(text.at(0), text.at(1));
Notifier::get()->showText({text.at(0), text.at(1)});
}