demo: Añadido efecto de fuego en el fondo
This commit is contained in:
67
main.cpp
67
main.cpp
@@ -15,7 +15,10 @@ Código fuente creado por JailDesigner
|
||||
#include "units/texture.h"
|
||||
#include "units/screen.h"
|
||||
#include "units/input.h"
|
||||
#include "quickcg.h"
|
||||
using namespace QuickCG;
|
||||
|
||||
// Punteros
|
||||
SDL_Event *event;
|
||||
SDL_Window *window;
|
||||
SDL_Renderer *renderer;
|
||||
@@ -30,24 +33,36 @@ Text *debugText;
|
||||
Texture *texture;
|
||||
MovingSprite *sprite;
|
||||
|
||||
// Listas
|
||||
enum e_fx // Tipos de efectos disponibles para el fondo
|
||||
{
|
||||
fx_fire,
|
||||
fx_gradient
|
||||
};
|
||||
|
||||
Uint32 ticks = 0; // Variable para la frecuencia de actualización de la lógica del programa
|
||||
Uint32 ticksSpeed = 15; // Variable para la frecuencia de actualización de la lógica del programa
|
||||
bool should_exit = false; // Variable para saber si ha terminado el progra,a
|
||||
int counter = 0; // Contador para lo que se necesite
|
||||
// Variables de uso general
|
||||
Uint32 ticks = 0; // Variable para la frecuencia de actualización de la lógica del programa
|
||||
const Uint32 ticksSpeed = 15; // Variable para la frecuencia de actualización de la lógica del programa
|
||||
bool should_exit = false; // Variable para saber si ha terminado el progra,a
|
||||
int counter = 0; // Contador para lo que se necesite
|
||||
string controllerName; // Nombre del primer mando detectado
|
||||
string inputPressed; // Texto con el último input que se ha pulsado
|
||||
e_fx fx = fx_fire; // Efecto seleccionado para el fondo
|
||||
int fxTotal = 2; // Cantidad total de efectos disponibles para el fondo
|
||||
|
||||
// Variables para el efecto del degradado
|
||||
int gradColorMin = 64; // Minimo color más alto del degradado
|
||||
int gradColorMax = 192; // Minimo color más alto del degradado
|
||||
int gradCurrentColor = 192; // Color actual más alto del degradado
|
||||
int gradBreathDirection = 0; // Indica si gradCurrentColor crece o decrece
|
||||
string controllerName; // Nombre del primer mando detectado
|
||||
string inputPressed; // Texto con el último input que se ha pulsado
|
||||
e_fx fx = fx_gradient; // Efecto seleccionado para el fondo
|
||||
int fxTotal = 2; // Cantidad total de efectos disponibles para el fondo
|
||||
|
||||
// Variables para el efecto de fuego
|
||||
const int fireScreenWidth = 320; // Ancho del efecto de fuego
|
||||
const int fireScreenHeight = 180; // Alto del efecto de fuego
|
||||
Uint32 fire[fireScreenHeight][fireScreenWidth]; // Buffer con el fuego
|
||||
Uint32 buffer[fireScreenHeight][fireScreenWidth]; // Buffer para dibujar en pantalla
|
||||
ColorRGB palette[256]; // Paleta de color para el fuego
|
||||
const int fireDesp = 240 - fireScreenHeight + 3; // Fila donde comienza a dibujarse el efecto de fuego
|
||||
|
||||
// Inicializa las opciones
|
||||
void initOptions();
|
||||
@@ -240,6 +255,23 @@ void initSprite()
|
||||
// Inicializa el efecto de fuego
|
||||
void initFire()
|
||||
{
|
||||
// Inicializa el buffer de fuego
|
||||
for (int y = 0; y < fireScreenHeight; ++y)
|
||||
for (int x = 0; x < fireScreenWidth; ++x)
|
||||
fire[y][x] = 0;
|
||||
|
||||
// Inicializa la paleta
|
||||
for (int x = 0; x < 256; ++x)
|
||||
{
|
||||
// HSLtoRGB is used to generate colors:
|
||||
// Hue goes from 0 to 85: red to yellow
|
||||
// Saturation is always the maximum: 255
|
||||
// Lightness is 0..255 for x=0..128, and 255 for x=128..255
|
||||
ColorRGB color = HSLtoRGB(ColorHSL(x / 3, 255, std::min(255, x * 2)));
|
||||
// set the palette to the calculated RGB value
|
||||
// palette[x] = RGBtoINT(color);
|
||||
palette[x] = color;
|
||||
}
|
||||
}
|
||||
|
||||
// Inicializa todo
|
||||
@@ -399,6 +431,18 @@ void updateGradient()
|
||||
// Actualiza el efecto de fuego
|
||||
void updateFire()
|
||||
{
|
||||
// randomize the bottom row of the fire buffer
|
||||
const int w = fireScreenWidth;
|
||||
const int h = fireScreenHeight;
|
||||
for (int x = 0; x < w; ++x)
|
||||
fire[h - 1][x] = abs(32768 + rand()) % 256;
|
||||
// do the fire calculations for every pixel, from top to bottom
|
||||
for (int y = 0; y < h - 1; ++y)
|
||||
for (int x = 0; x < w; ++x)
|
||||
{
|
||||
fire[y][x] =
|
||||
((fire[(y + 1) % h][(x - 1 + w) % w] + fire[(y + 1) % h][(x) % w] + fire[(y + 1) % h][(x + 1) % w] + fire[(y + 2) % h][(x) % w]) * 32) / 129;
|
||||
}
|
||||
}
|
||||
|
||||
// Actualiza el efecto de fondo
|
||||
@@ -476,6 +520,13 @@ void renderGradient()
|
||||
// Dibuja el efecto de fuego
|
||||
void renderFire()
|
||||
{
|
||||
for (int y = 0; y < fireScreenHeight; ++y)
|
||||
for (int x = 0; x < fireScreenWidth; ++x)
|
||||
{
|
||||
const ColorRGB c = palette[fire[y][x]];
|
||||
SDL_SetRenderDrawColor(renderer, c.r, c.g, c.b, 255);
|
||||
SDL_RenderDrawPoint(renderer, x, y + fireDesp);
|
||||
}
|
||||
}
|
||||
|
||||
// Dibuja el efecto de fondo
|
||||
|
||||
Reference in New Issue
Block a user