Pixtudio: Modulación de color para el gráfico de un scroll.

Started by logotytye, March 27, 2019, 01:53:38 AM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

logotytye

Hola a todos, me encuentro con un dilema que no se como resolver,

Necesito cambiar la modulación de color a un grafico de un scroll en pixtudio (para hacer que las paredes luzcan de distinto color en diferentes mundos) pero resulta que según leí en foros no esta disponible la función rbgscale en pixtudio y lo que si está disponible son las variables locales de proceso: modr, modg, modb, las cuales funcionan muy bien y de maravilla pero creo que no se sirven ya que lo que se necesita es cambiar la modulación de un grafico suelto, por ahí existe un video donde Joseba hace lo que quiero pero no se si lo hizo para bennugd o pixtudio https://vimeo.com/155582188

Como podría hacer eso en pixtudio? o es que hay algun hack que desconozco..?

de antemano gracias.


Futu-block

eso tiene toa la pinta de ser el fondo de un color que se vá cambiando y los edificios por delante

para hacer eso basta con... espera, que es pixtudio y las variables no son iguales, creo, te lo pongo en pseudo codigo:

-pintas un recuadro del tamaño de la pantalla o le das a clear screen si el proceso del scroll te lo permite, da igual, y luego según vayan pasando unos frames o en un bloque for, le metes un incremento de colores RBG al recuadro o la pantalla según te convenga. Al atardecer pasa de un celeste a un azul oscuro y/o negro (ergo disminuir R y G rapidamente y B mas lento) y al amanecer puede pasar por un rojizo o incluso amarillo o blanco, bastaría con aumentar R y G al doble o triple del B y cuando lleguen al tope bajarlos hasta que llegue el B al tope

con un bloque for te sale facil

logotytye

Mmm entiendo, quiere decir que al ser pixtudio la conversión de colores pasa a ser a través de un proceso obligatoriamente (o grafico suelto en memoria)?

Futu-block

nope, en bennu es map_clear(fpg,grafico,rgb(125,215,21)) que en pixtudio igual sería clear_map(...) o cualquier otra sentencia

panreyes

Buenas logotytye

En principio actualmente no hay ninguna función para hacer modulación de color sin modificar la textura, me explico: modr, modg y modb le dicen a la textura el porcentaje que tienen que mostrar de los colores rojo, verde y azul, pero no sirve para modificar el color en sí.

De todas formas, rgbscale sí que existe, pero cada vez que se modifica una textura el engine tiene que actualizarla en la VRAM de la GPU y no es demasiado rápido en hacerlo, por lo que si necesitas hacerlo a menudo en cada frame puede suponer un problema.

Yo utilizo esta función para actualizar FPGs enteros:

Function colorea_fpg(file, float r, float g, float b);
Private
new_file;
i;
Begin
new_file=fpg_new();
from i=1 to 999;
if(map_exists(file,i))
fpg_add(new_file,i,file,i);
rgbscale(new_file,i,r,g,b);
end
end
return new_file;
End

logotytye

Gracias colegas, Panreyes estoy seguro que tu función sirve, solo que el pixtudio no existe rgbscale, por lo tanto estoy tratando de recrear la función rgbscale para cambiar un mapa, tengo mapas de 32x32 en 16bits y aplico la formula que esta en la documentación oficial de rgbscale http://wiki.bennugd.org/index.php?title=Rgbscale  pero los gráficos que me genera tienen colores raros, no representa lo que yo creo que debería ser, si pueden probar la función que hice para ver si necesita alguna corrección con respecto a la formula. los bytes los cambie por int y viceversa, parecen dar mismo resultado graficas raras, podria alguien comparar esta función con el verdadero rgbscale de bennu para ver si esta acorde?

El idgrafico es el que se va a cambiar de colores debe ser de 32x32, para esta prueba use png sueltos normalitos.
ejecute la funcion así: rgbscalex(ladrillo, 50, 101, 22);

adjunto archivo de los colores raros en que me convierte la imagen.

function rgbscalex(int idgrafico, int r, int g, int b)
private
   int i=1, j=1;
   byte my_r, my_g, my_b;
   int estado;
   byte c;
   byte newpixel_r, newpixel_g, newpixel_b;
begin
   for(i=1; i<=32; i++)
      for(j=1; j<=32; j++)
         estado = rgb_get(map_get_pixel(0, idgrafico, i, j), &my_r, &my_g, &my_b, 16);
         c = 0.3 * my_r + 0.59 * my_g + 0.11 * my_b;
         newpixel_r = r * c;
         newpixel_g = g * c;
         newpixel_b = b * c;         
         map_put_pixel (0, idgrafico, i, j, rgb(newpixel_r, newpixel_g, newpixel_b));
      end
   end
end

panreyes

Hola de nuevo logotytye :)

Me has hecho dudar, te lo prometo xD
RGBScale existe y funciona en PixTudio. Forma parte del módulo mod_effects.

logotytye

Uy no sabia eso pensé que pertenecía a mod_map, depronto le estoy buscando la quinta pata al gato, en unas horas entro e importo ese módulo aver que. pero bueno, si no escribo el post nunca lo sabría, gracias!!!!!

logotytye

Quote from: panreyes on April 11, 2019, 09:38:02 AM
Hola de nuevo logotytye :)

Me has hecho dudar, te lo prometo xD
RGBScale existe y funciona en PixTudio. Forma parte del módulo mod_effects.

Así es, estaba en mod_effects, muchas gracias panreyes. karma++