diff --git a/source/fade.cpp b/source/fade.cpp index 13b6d26..4a90b1e 100644 --- a/source/fade.cpp +++ b/source/fade.cpp @@ -34,6 +34,8 @@ void Fade::init() r = 0; g = 0; b = 0; + numSquaresWidth = 80; + numSquaresHeight = 60; } // Pinta una transición en pantalla @@ -69,37 +71,16 @@ void Fade::render() case FADE_RANDOM_SQUARE: { - for (Uint16 i = 0; i < 50; i++) - { - // Crea un color al azar - r = 255 * (rand() % 2); - g = 255 * (rand() % 2); - b = 255 * (rand() % 2); - SDL_SetRenderDrawColor(renderer, r, g, b, 64); + SDL_RenderCopy(renderer, backbuffer, nullptr, nullptr); - // Dibujamos sobre el backbuffer - SDL_SetRenderTarget(renderer, backbuffer); - - rect1.x = rand() % (param->gameWidth - rect1.w); - rect1.y = rand() % (param->gameHeight - rect1.h); - SDL_RenderFillRect(renderer, &rect1); - - // Volvemos a usar el renderizador de forma normal - SDL_SetRenderTarget(renderer, nullptr); - - // Copiamos el backbuffer al renderizador - SDL_RenderCopy(renderer, backbuffer, nullptr, nullptr); - - // Volcamos el renderizador en pantalla - SDL_RenderPresent(renderer); - SDL_Delay(100); - } break; } default: + { break; } + } } // Pone el color en toda la textura @@ -115,32 +96,63 @@ void Fade::update() { if (enabled) { - counter++; - switch (type) { case FADE_FULLSCREEN: + { if (counter >= 255 / 4) { finished = true; } break; + } case FADE_CENTER: + { if ((counter * 4) > param->gameHeight) { finished = true; } break; + } case FADE_RANDOM_SQUARE: + { + const int delay = 1; + const int mult = 8; + if (counter % delay == 0) + { + // Dibujamos sobre el backbuffer + SDL_Texture *temp = SDL_GetRenderTarget(renderer); + SDL_SetRenderTarget(renderer, backbuffer); + + // Dibuja el cuadrado correspondiente + SDL_SetRenderDrawColor(renderer, r, g, b, 255); + const int index = std::min(counter / delay, (numSquaresWidth * numSquaresHeight) - 1); + for (int i = 0; i < mult; ++i) + { + SDL_RenderFillRect(renderer, &square[index * mult + i]); + } + + // Volvemos a usar el renderizador de forma normal + SDL_SetRenderTarget(renderer, temp); + } + + if (counter * mult / delay >= numSquaresWidth * numSquaresHeight) + { + finished = true; + } + break; } + } if (finished) { enabled = false; } + + counter++; } } @@ -177,7 +189,32 @@ void Fade::activate() case FADE_RANDOM_SQUARE: { - rect1 = {0, 0, 32, 32}; + rect1 = {0, 0, param->gameWidth / numSquaresWidth, param->gameHeight / numSquaresHeight}; + square.clear(); + + // Añade los cuadrados al vector + for (int i = 0; i < numSquaresWidth * numSquaresHeight; ++i) + { + rect1.x = (i % numSquaresWidth) * rect1.w; + rect1.y = (i / numSquaresWidth) * rect1.h; + square.push_back(rect1); + } + + // Desordena el vector de cuadrados + int num = numSquaresWidth * numSquaresHeight; + while (num > 1) + { + // agafa un nombre aleatòri entre 0 i num-1 + int num_arreu = rand() % num; + + // el element triat el swapechem amb l'ultim + SDL_Rect temp = square[num_arreu]; + square[num_arreu] = square[num - 1]; + square[num - 1] = temp; + + // I ara queda un element menys per desordenar + num--; + } break; } } diff --git a/source/fade.h b/source/fade.h index 5e54783..eb98ee0 100644 --- a/source/fade.h +++ b/source/fade.h @@ -21,14 +21,17 @@ private: SDL_Texture *backbuffer; // Textura para usar como backbuffer // Variables - Uint8 type; // Tipo de fade a realizar - Uint16 counter; // Contador interno - bool enabled; // Indica si el fade está activo - bool finished; // Indica si ha terminado la transición - Uint8 r, g, b; // Colores para el fade - SDL_Rect rect1; // Rectangulo usado para crear los efectos de transición - SDL_Rect rect2; // Rectangulo usado para crear los efectos de transición - param_t *param; // Puntero con todos los parametros del programa + Uint8 type; // Tipo de fade a realizar + Uint16 counter; // Contador interno + bool enabled; // Indica si el fade está activo + bool finished; // Indica si ha terminado la transición + Uint8 r, g, b; // Colores para el fade + SDL_Rect rect1; // Rectangulo usado para crear los efectos de transición + SDL_Rect rect2; // Rectangulo usado para crear los efectos de transición + int numSquaresWidth; // Cantidad total de cuadraditos en horizontal para el FADE_RANDOM_SQUARE + int numSquaresHeight; // Cantidad total de cuadraditos en vertical para el FADE_RANDOM_SQUARE + param_t *param; // Puntero con todos los parametros del programa + std::vector square; // Vector con los indices de los cuadrados para el FADE_RANDOM_SQUARE // Inicializa las variables void init();