diff --git a/source/common/menu.cpp b/source/common/menu.cpp index f807d3e..3f542dd 100644 --- a/source/common/menu.cpp +++ b/source/common/menu.cpp @@ -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) @@ -1002,4 +1012,24 @@ 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; } \ No newline at end of file diff --git a/source/common/menu.h b/source/common/menu.h index d878a21..151346f 100644 --- a/source/common/menu.h +++ b/source/common/menu.h @@ -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 = "");