MEJORA: Los elementos de menu reciben el selector con un degradado de color en el propio item. Falta agregar otro degradado para el elemento que pierde el foco

This commit is contained in:
2023-09-27 21:08:21 +02:00
parent 744f5d5711
commit bae3ce7028
2 changed files with 56 additions and 21 deletions

View File

@@ -60,6 +60,9 @@ Menu::Menu(SDL_Renderer *renderer, Asset *asset, Input *input, std::string file)
load(file);
}
// Calcula los colores del selector para el degradado
setSelectorItemColors();
// Deja el cursor en el primer elemento
reset();
}
@@ -108,7 +111,7 @@ bool Menu::load(std::string file_path)
if (file.good())
{
// Procesa el fichero linea a linea
//std::cout << "Reading file " << filename.c_str() << std::endl;
// std::cout << "Reading file " << filename.c_str() << std::endl;
while (std::getline(file, line))
{
if (line == "[item]")
@@ -132,7 +135,7 @@ bool Menu::load(std::string file_path)
// Procesa las dos subcadenas
if (!setItem(&item, line.substr(0, pos), line.substr(pos + 1, line.length())))
{
//std::cout << "Warning: file " << filename.c_str() << "\n, unknown parameter \"" << line.substr(0, pos).c_str() << "\"" << std::endl;
// std::cout << "Warning: file " << filename.c_str() << "\n, unknown parameter \"" << line.substr(0, pos).c_str() << "\"" << std::endl;
success = false;
}
@@ -149,7 +152,7 @@ bool Menu::load(std::string file_path)
// Procesa las dos subcadenas
if (!setVars(line.substr(0, pos), line.substr(pos + 1, line.length())))
{
//std::cout << "Warning: file " << filename.c_str() << "\n, unknown parameter \"" << line.substr(0, pos).c_str() << "\"" << std::endl;
// std::cout << "Warning: file " << filename.c_str() << "\n, unknown parameter \"" << line.substr(0, pos).c_str() << "\"" << std::endl;
success = false;
}
@@ -163,13 +166,13 @@ bool Menu::load(std::string file_path)
}
// Cierra el fichero
//std::cout << "Closing file " << filename.c_str() << std::endl;
// std::cout << "Closing file " << filename.c_str() << std::endl;
file.close();
}
// El fichero no se puede abrir
else
{
//std::cout << "Warning: Unable to open " << filename.c_str() << " file" << std::endl;
// std::cout << "Warning: Unable to open " << filename.c_str() << " file" << std::endl;
success = false;
}
@@ -422,10 +425,17 @@ void Menu::updateSelector()
}
}
selector.rect.y = int(selector.y);
// Actualiza el color del item
selector.itemColorIndex++;
selector.itemColorIndex = std::min(selector.numJumps - 1, selector.itemColorIndex);
selector.itemColor = selector.jumpItemColors[selector.itemColorIndex];
}
else
{
selector.rect.y = int(selector.y);
selector.itemColorIndex = 0;
selector.itemColor = selector.jumpItemColors[selector.numJumps - 1];
}
if (selector.resizing)
@@ -1003,3 +1013,23 @@ void Menu::setText(std::string font_png, std::string font_txt)
text = new Text(asset->get(font_png), asset->get(font_txt), renderer);
}
}
// Calcula los colores del selector para el degradado
void Menu::setSelectorItemColors()
{
const color_t colorFrom = {255, 255, 255};
const color_t colorTo = selector.itemColor;
for (int i = 0; i < selector.numJumps; ++i)
{
const float step = ((float)i / (selector.numJumps - 1));
const int r = colorFrom.r + ((colorTo.r - colorFrom.r) * step);
const int g = colorFrom.g + ((colorTo.g - colorFrom.g) * step);
const int b = colorFrom.b + ((colorTo.b - colorFrom.b) * step);
selector.jumpItemColors[i].r = r;
selector.jumpItemColors[i].g = g;
selector.jumpItemColors[i].b = b;
}
selector.itemColorIndex = 0;
}

View File

@@ -51,22 +51,24 @@ private:
struct selector_t
{
float originY; // Coordenada de origen
float targetY; // Coordenada de destino
float despY; // Cantidad de pixeles que se desplaza el selector en cada salto: (target - origin) / numJumps
bool moving; // Indica si el selector está avanzando hacia el destino
float originH; // Altura de origen
float targetH; // Altura de destino
float incH; // Cantidad de pixels que debe incrementar o decrementar el selector en cada salto
bool resizing; // Indica si el selector está cambiando de tamaño
float y; // Coordenada actual, usado para el desplazamiento
float h; // Altura actual, usado para el cambio de tamaño
int numJumps; // Numero de pasos preestablecido para llegar al destino
int index; // Elemento del menu que tiene el foco
SDL_Rect rect; // Rectangulo del selector
color_t color; // Color del selector
color_t itemColor; // Color del item
int a; // Cantidad de transparencia para el rectangulo del selector
float originY; // Coordenada de origen
float targetY; // Coordenada de destino
float despY; // Cantidad de pixeles que se desplaza el selector en cada salto: (target - origin) / numJumps
bool moving; // Indica si el selector está avanzando hacia el destino
float originH; // Altura de origen
float targetH; // Altura de destino
float incH; // Cantidad de pixels que debe incrementar o decrementar el selector en cada salto
bool resizing; // Indica si el selector está cambiando de tamaño
float y; // Coordenada actual, usado para el desplazamiento
float h; // Altura actual, usado para el cambio de tamaño
int numJumps; // Numero de pasos preestablecido para llegar al destino
int index; // Elemento del menu que tiene el foco
SDL_Rect rect; // Rectangulo del selector
color_t color; // Color del selector
color_t itemColor; // Color del item
color_t jumpItemColors[8]; // Transición de colores para el item seleccionado
int itemColorIndex; // Indice del color de transición para el item seleccionado
int a; // Cantidad de transparencia para el rectangulo del selector
};
// Objetos y punteros
@@ -139,6 +141,9 @@ private:
// Calcula la altura del selector
int getSelectorHeight(int value);
// Calcula los colores del selector para el degradado
void setSelectorItemColors();
public:
// Constructor
Menu(SDL_Renderer *renderer, Asset *asset, Input *input, std::string file = "");