Múltiples paletas enmodo 16 bits?

Started by Drumpi, September 27, 2016, 11:28:15 AM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

Drumpi

Vale, me rindo, no pillo cómo se pueden asignar paletas a determinados procesos.
Cargo dos paletas diferentes y las guardo en sendos int, y luego se lo paso como parámetro a un proceso "dummie" (se congela y ahí se queda sin hacer nada) para que lo almacene en su variable local PALETTE, pero al ejecutar todos los procesos usan la misma paleta.
He probado en 8bits y ambas paletas tienen diferentes colores y se ve cómo cada una muestra las imágenes en diferentes colores. Tampoco tiene nada que ver que los procesos dummies estén congelados, pues con un bucle infinito ocurre igual.

Os pongo el código y os adjunto los ficheros para que probeis.


program prueba_de_paletas;

PRIVATE
    int trajes_graph;
    int paleta_trajes;
    int paleta_div;
   
    int id_imagenes[2][3];
   
    int cont1, cont2;
BEGIN
    set_fps(50,0);
    set_mode(800,600,16);
   
    trajes_graph = load_fpg("TRAJE.FPG");    //Cargamos FPG
    paleta_trajes = load_pal("TRAJE.FPG");    //Cargamos una paleta
    paleta_div = load_pal("DIV.PAL");        //Cargamos otra paleta
    //paleta_div = load_pal("items.fpg");        //Cargamos otra paleta
   
    //Creamos las imágenes, con diferentes paletas
    id_imagenes[0][0] = imagen(trajes_graph,1, 80, 80, 0, paleta_trajes);
    id_imagenes[0][1] = imagen(trajes_graph,3, 80, 150, 0, paleta_trajes);
    id_imagenes[0][2] = imagen(trajes_graph,4, 80, 195, 0, paleta_trajes);
    id_imagenes[1][0] = imagen(trajes_graph,1, 240, 80, 0, paleta_div);
    id_imagenes[1][1] = imagen(trajes_graph,3, 240, 150, 0, paleta_div);
    id_imagenes[1][2] = imagen(trajes_graph,4, 240, 195, 0, paleta_div);
   
    //Bucle de espera
    while(!key(_ESC))
        frame;
    end
   
   
    //SE CIERRA EL CHIRINGUITO
    //Matamos a todos los procesos de imágenes
    for (cont1 = 0; cont1 < 2; cont1++)
        for (cont2 = 0; cont2 < 3; cont2++)
            if ((id_imagenes[cont1][cont2] != 0) && exists(id_imagenes[cont1][cont2]))
                signal(id_imagenes[cont1][cont2], s_kill);
            end
        end
    end
    //Descarga de recursos
    unload_fpg(trajes_graph);
    unload_pal(paleta_trajes);
    unload_pal(paleta_div);
END

process imagen (file, graph, x, y, z, pallete)
begin
    signal(id, s_freeze);
    frame;
end


Y es que según esto:
http://forum.bennugd.org/index.php?topic=102.msg2732#msg2732
La variable existe y hace eso, no lo he soñado, pero no aparece en la wiki, y la única solución que se da es clonar el FPG y asignarle una paleta de colores diferentes (al FPG o al MAP).
SplinterGU hace otra alusión a lo mismo en esta página:
http://forum.bennugd.org/index.php?topic=2012.msg35910#msg35910

FUTU: luego sigo con el tema de cambiar colores a las paletas y eso, de momento los problemas de uno en uno, pero así se haría lo de tener diferentes paletas por cada proceso.
Hala, como con 1001 procesos sólo va a 9 FPS, vamos a meterle 32 veces más, a ver si revienta.
(Drumpi epic moment)

Drumpi

Vale, acabo de verlo: el proceso dummie hace:
process imagen (file, graph, x, y, z, pallete)

Cuando debería ser:
process imagen (file, graph, x, y, z, palette)

Así funciona. ¡¡¡Dos horas para ver esto!!!
Futu, ya tienes tu primer ejemplo. Ahora voy con la modificación de colores.
Hala, como con 1001 procesos sólo va a 9 FPS, vamos a meterle 32 veces más, a ver si revienta.
(Drumpi epic moment)

Futu-block

#2
si, eso es lo que me revienta, una puta letra cambiada...

aparte que gracias, lo pruebo y te dig lo que sea meno bonito, je je je


Que por cierto, ¿como se edita una paleta? ¿con que se ''abre''?

Drumpi

Tranquilo que aquí viene la respuesta.
Se abre con load_pal, como siempre, y se edita con "set_colors", ahora llamada "pal_set".
Aquí tienes el ejemplo.

Cómo funciona: primero debes hacer clic en la prenda que quieras cambiar (lo siento, por ahorro de recursos, el puntero del ratón es un cuadrado de 3x3 pixels blancos). Puedes seleccionar la camiseta, el pantalón o los calcetines de cualquiera de los dos equipos. Debes darte cuenta de que ambas equipaciones usan el mismo FPG de 8bits, pero sus procesos usan paletas distintas, de ahí que sólo vas a cambiar una de las dos.
No se va a ver qué has seleccionado, pero te darás cuenta tan pronto hagas clic en uno de los colores de la derecha. Incluso vas a poder ver cómo se cambian los colores en las paletas en tiempo real (son dos procesos aparte que han pintado cuadrados de cada uno de los colores en un mapa nuevo, por si te lo preguntas, nada del otro jueves).
Cada prenda de ropa usa 5 colores diferentes de la paleta, por lo que es necesario cambiar los 5. Para ello uso un array de 5*3 bytes (cada color usa 3bytes, para los valores R, G y B). Tu seleccionas uno de los colores de la derecha, pero los otros 4 los creo yo por código usando valores más pequeños de R, G y B. No te asustes que no es magia.

Creo que el código está suficientemente claro. Es el mismo del mensaje anterior, pero ampliado con la selección de prendas y colores, y los cambios de paleta. He puesto comentarios por todas partes, aunque creo que el código es lo suficientemente sencillo. Y si aun tienes dudas, ahí está la wiki con más ejemplos.

Y si no queda claro algo, pues nada, me dices el número de línea y te respondo (o cualquiera de los presentes, si llegan antes que yo :D).

NOTA: para seleccionar prendas y colores he usado el método de mapas de durezas en los menús, como se describe en los primeros capítulos de los manuales de DIV.

NOTA2: He tenido que setear dump y restore type a 1, porque si los dejaba a cero no se refrescaba la pantalla hasta que se desplazase el ratón por encima de la imagen. Creo que es el comportamiento correcto, pero lo dejo caer por si no lo fuera.
Hala, como con 1001 procesos sólo va a 9 FPS, vamos a meterle 32 veces más, a ver si revienta.
(Drumpi epic moment)

Futu-block

buf, esto de ''copiar'' codigo de la gente me mata...

¿dudas? muchas, por ejemplo ¿como se crea una paleta? osea, ¿sirve una paleta creada del gimp, por ejemplo?

y dejando a un lao el tema de la paleta, me centro mas en un grafico de un solo color, cambiarselo a traves de, eso, dar valor a tres variables, la roja, la verde y la azul

Ya con esto ultimo tendria todo el pescao vendio, es lo unico que necesito ;)

Drumpi

Las paletas sólo se pueden generar directamente con DIV, aunque puedes extraerlas de un FPG de 8bits abierto en FPGEdit 2005 (y seguramente de algún otro editor). No, no valen las paletas de potochof, porque Bennu (y Fenix, y DIV) usan un formato de paleta propio muy muy sencillo.
Pero no te preocupes: puedes leer paletas desde FPGs, MAPs y creo que desde FNTs de 8 bits. Puedes crear un FPG de 8 bits con cualquier editor, y debería generarte una nueva paleta al introducir el primer gráfico, o al hacer la conversión a 8bits (de nuevo, FPGEdit te permite hacer la conversión 16->8 y autogenerar una paleta, y verla, pero no ordenarla, para eso creo que smart FPG sí te da alguna utilidad).

¿Consejo a lo bruto? Crea en BMP un gráfico con los 256 colores que necesitas, guárdalo en un FPG de 16bits, conviértelo a 8bits y listo (a menos que quieras extraer la paleta). La pega es que no puedes repetir colores (salvo el primero y los últimos, que serán negro puro).

El tercer párrafo no lo he entendido.

Tu copia lo que necesites del código. ¡No lo calques! Lo lees, lo entiendes y lo escribes de nuevo. Yo te he hecho un ejemplo muy completo, pero a lo mejor tu no necesitas cambiar 5 colores sino uno, y la cosa se simplifica muchísimo.
Hala, como con 1001 procesos sólo va a 9 FPS, vamos a meterle 32 veces más, a ver si revienta.
(Drumpi epic moment)

Futu-block

Vale, a ver si ahora puedo expresarme mejor con un dibujito

El grafico total se compone de varios graficos ''intermedios'' correspondiente al pelo + arriba la cara + arriba la nariz, ojos y boca (no exactamente pero por ahora pal ejemplo vale) El grafico del pelo se compone de un trazo y un relleno, en mi caso lo voy a hacer 10 graficos iguales con los colores ''mas usuales'' Fotos:



En el caso que a alguien no le gusten mis colores basicos usaré una ''dureza del pelo'' otro grafico exactamente sobre el primero, mas que ná para que se vea el borde negro y asi ser un grafico con un solo color, que debe de cambiar de color segun el apaño mio con el selector via raton o por teclado escribiendo numero

parece facil, un grafico que cambie el color segun unas variables dadas; me da igual modificar las paletas o no, o si tengo que crear un grafico con 256 colores y ponerlos en un fpg

¿cuales son los parametros de set_palette? esos son los que puedo modficar '' a mano''??

Drumpi

http://wiki.bennugd.org/index.php?title=Pal_set
ID de la paleta a la que le quieres cambiar el color (opcional, se puede ignorar si quieres usar la paleta del sistema), el primer color que quieres cambiar, el número de colores que quieres cambiar, y un puntero al array con los datos de los nuevos colores.
Hala, como con 1001 procesos sólo va a 9 FPS, vamos a meterle 32 veces más, a ver si revienta.
(Drumpi epic moment)

FreeYourMind


DCelso

a ver, en 32 bits ya no se usan paletas. se usa superposición de imágenes con alfas cercanas a 127 (la mitad)
por lo que es más rápido cambiar los colores. solo necesitas tener un gráfico en escala de grises (colores cercanos a blanco zonas claras, colores cercanos a negro zonas oscuras), que será la base, y encima se le ponen las capas alfa de las zonas que quieras  cambiar de color
a lo mejor esto facilita lo que quieres hacer, o no se.

Y la opción de toda la vida, por lo que fue tan potente div en 8 bits, el uso de paletas en 8 bits y como se programó toa la vida en consolas de 8 bits.
Tienes una imagen con una paleta de 8 bits, una paleta de 8 bits que no deja de ser un vector de 256 colores (los que quieras) cada color de 24 bits (8 r, 8 g, 8 b)  (en versiones de 16 era el truco de 565 dejando mas bits para el verde porque el ojo ve mas verdes) pero a nosotros nos importa un carajo eso, a la cuenta de la vieja son 24 bits, ya los formatos al guardar convierten a 16 o lo que quiera que guarden sus formatos de paleta.

Por lo tanto volviendo al tema tienes un array de 256 colores, pues normalmente toda la vida se han agrupado en 16 grupos de 16 colores. formando una matriz de 16x16, cada fila reproesenta un grupo de 16 colores.
pues cada grupo se usa para dibujar un objeto (es decir son los colores de un objeto) por lo tanto puedes dibujar 16 objetos disntintos totalmente independientes en colores con una paleta de 256 colores.

Y aqui es donde viene el potencial de usar esto así. supongamos que de los grupos, usamos el primero para el personaje princiapl (16 colores) y ponemos al tio pues pelo rojo, pantalones azules, camisa morada, (guapo eh.)
Y ahora usamos el siguiente para el enemigo, ponemos no se pelo negro, camisa verde, pantalones azules. (se pueden repetir colores, es decir, la paleta de 256 colores no obligan a que sean distintos, por lo que podemos volver a repetir un color de un grupo en otro)

Tendriamos de los 256 colores los 16 primeros para dibujar el personaje principal los 16 siguiente para el enemigo.

Por tanto si usamos esa paleta para cada sprite de enemigos y malos usando bien sus grupos. luego con solo cambiar la paleta por otra podriamos cambiar a todos los sprites a la vez de colores sin haber tocado la información de cada sprite, solo la información de color.
Ya que cada imagen irá a buscar su color al indice de la paleta y la paleta habrá cambiado estos por otros..

Pues así de facil o de dificil, para hacer eso pues se puede usar paintshop pro o cualquier programa orientado a sprites (los orientados a retoque fotográfico para esto son un puto coñazo, se puede hacer pero muy ortopedicamente)
en paint shop pro creas una imagen de cero de 8 bits, hay una opcion para editar paleta, la editas tal cual explicqué, luego dibujas lo que quieras. y guardas todas tus imagenes usando esa misma paleta de 8 bits.
Luego abres una imagen la que sea y te vas a editar paleta y cambias los colores a gusto pero sin reorganizar en imagen los nuevos colores, solo cambiar color en paleta, rapidamente al cambiarlo va cambiando el color del sprite, ahora terminado el cambio de color, guardas la paleta, como .pal, y vuelves a repetir para todas las paletas que quieras.

bien pues desde bennu, es tan facil como hacer load_png para cargar las imagenes 8 bits con la información de sprite y luego load_pal para cargar la paleta y seleccionar la que quieras...


Eso es todo aplicado a sistema de 8 bits con unica y exclusivamente 256 colores en pantalla.
Al llegar la tecnología de 16 bits ( y lo mismo en 24 bits) la cosa cambió, porque ya se puede hacer lo que quereis hacer y es donde estaba el potencial de fenix. en vez de grupos de 16 colores para cada sprite puedes usar la paleta entera 256, ya que al cargar en pantalla tienes capacida para toda la gama de colores que pueda hacerse con 16 bits, así que la tecnica con respecto a 8 bits cambia en que tienes un .pal para cambiar de color por sprite, en vez de por juego como pasaba antes.

y la forma de usarlo es parecida, cargas el fenix en 16 bits, y cada png de 8 bits con la paleta que quieras por separado. antes era cargar un .pal para el juego entero, ahora es cargar un .pal para cada sprite a parte de todos los .png de la animación.

Y por eso mi fpgedit 4.0 hace todo eso, para no perder la capacidad de cambio rápido de color que daban los sistemas de 8 bits y se traspasó a 16 bits.

Mi fpg edit tiene edición de paletas, con soporte de cargar y guardar paletas. tal cual tenía div. además el interfaz final que le dí a fpg edit era totalmente extraído del antiguo DIV, así resultara más facil para el que lo usó continuar la metodología.

Espero que os sirva de algo para lo que estais intentando hacer si no pues nada, ahí llevais información actuamente obsoleta :D


Monstruos Diabólicos

"A PAck of classic GAMEs For BennuGD" en desarrollo
http://code.google.com/p/apagame4be/

darío

Si usas Smart Fpg Editor puedes hacer lo siguiente:

Usa tu editor de imagenes favoritos para generar una imagen GIF con el set de colores que quieres que tenga la cara "estándar". Las imágenes GIF son siempre de 8 bits así que te evitas hacer conversiones.

Create un nuevo FPG de 8 bits y cuando te pida una "paleta" selecciona simplemente el archivo GIF (Smart Fpg Editor puede leer la paleta de cualquier archivo de 8 bits soportado, ya sea PNG, BMP, GIF o TIFF).

Añade la cara al FPG.

Usa el editor de paletas, modifica los colores a tu gusto y usa la opción de exportar paletas para generar varias paletas con las distintas variaciones de la cara que quieras si quieres tener set de colores predefinidos.






My sites:
Smart Fpg Editor - Painless FPG Edition for Bennu and PixTudio
fenixlib - .NET support for manipulating PixTudio, Bennu and Div graphic formats

DCelso

dario, ¿por qué no usas vb.net?
visual basic 6 es muy limitado y no funciona bien el entorno de desarrollo visual studio 6 desde windows vista.
¿Has intentado hacer scroll en el editor visual? ¿Has intentado ordenar componentes en lista al hacer click en columnas? ¿has intentado ejecutar archivos en red?
Yo me he encontrado con mil problemas en las aplicaciones visual basic 6 e intentar editarlas con sistemas operativos mas allá de XP es un infierno. :D Yo he tenido que migrar todas a vb.net con visual studio 2008, cambian algunas cosas pero casi todo es igual o más facil, y existe un visual studio 2008 gratuito, por lo que no tienes el problema de licencia. Visual basic 6 no es gratuito.
Monstruos Diabólicos

"A PAck of classic GAMEs For BennuGD" en desarrollo
http://code.google.com/p/apagame4be/

Futu-block

La charla es interesantisima, pero ¿ como cambio el color de un solo sprite cargado de un fpg?
Creo que la solucionar es map put píxel y cambiar manualmente píxel por píxel

DCelso

A ver, si la imagen es de 8 bits, debería ser tan facil como

pal_map_assign(fpg_id,map_id,pal_load("mipaleta2.pal"))
Monstruos Diabólicos

"A PAck of classic GAMEs For BennuGD" en desarrollo
http://code.google.com/p/apagame4be/

Drumpi

O lo que he dicho yo: asignar la paleta al proceso en cuestión. Todo depende de si quieres cambiar los colores a un FPG entero o sólo al gráfico que tiene un proceso.
Si tienes un solo color por cada parte del cuerpo, y tienes menos de 255 partes, te conviene usar una única paleta como dice DCelso y no te metes en lios. Pero como los gráficos vectoriales por lo general usan degradados de colores, lo ideal sería tener una paleta por cada grupo de elementos que tengan colores en común (una paleta para la piel de cara, tronco y extremidades; otra paleta para la camiseta y mangas; otra para el pantalón y perneras) o las que te quepan (puedes tener una paleta por personaje).

Todo depende de qué es exactamente lo que intentas hacer, y sobre todo, con cuantos colores.
Hala, como con 1001 procesos sólo va a 9 FPS, vamos a meterle 32 veces más, a ver si revienta.
(Drumpi epic moment)