Ver la versión completa : Otros Lenguajes [BennuGD] Cambiando colores a los gráficos con paleta de 8 bits
masteries
03/07/2016, 20:16
@panreyes (https://www.gp32spain.com/foros/member.php?u=22886)
@SplinterGU
(https://www.gp32spain.com/foros/member.php?u=40474)
@Drumpi
(https://www.gp32spain.com/foros/member.php?u=12408)
@GameMaster
(https://www.gp32spain.com/foros/member.php?u=33277)
@tognin (https://www.gp32spain.com/foros/member.php?u=3784)
Saludos compañer@s forer@s,
Sucede que me ha dado por continuar trabajando en el juego de carreras con pseudo 3D, Masteries-Runners, pues llevaba tiempo sin tocarlo y me estoy decidiendo a terminarlo...
Y dadas las perrerías que se me ocurren, pues a veces las paso un poquito canutas para lograr lo que pretendo.
Entrando en acción:
-El juego ( https://www.youtube.com/watch?v=Sjz_zElwVCI ) emplea paleta de color de 8 bits, y los gráficos emplean esa misma paleta.
-Ahora: quiero poder cambiar el color de las líneas laterales, de dos tonos verdes a dos tonos grises para tramos en ciudad, dos tonos marrones para tramos de montaña así como cambiar los colores de los coches... la idea no es cambiar la paleta entera, sino los índices de las paletas de cada fichero de gráficos, de forma que utilizando siempre la misma paleta de 8 bits, un fichero de gráficos .fpg cuyo índice 23 apuntaba al color 23 de la paleta general de 8 bits, haciendo que ahora dicho índice número 23 apunte al color 60 de la paleta general y así, el color índice 23 de los gráficos contenidos en ese fichero .fpg cambiarían a marrón... he estado probando estas cosas al cacharrear en lenguaje C en un Atari STE (en un PC también serviría) y he logrado mostrar 24 colores en pantalla, además de haber estado estudiando el juego Lotus en versión para dicho ordenador y he detectado que hace cosas así con la asignación de colores para cada uno de los gráficos, así que también quiero hacer cosas así con este juego que me traigo entre manos :) .
¿La pregunta que os hago es si esto puede hacerse utilizando BennuGD? , y si no puede hacerse directamente, tal vez se pudiera con un "workaround" cambiando la paleta de color de un fichero .fpg (pal_map_assign ¿?) ahora mismo no sabría decir... de ahí la solicitud de ayuda.
Gracias anticipadas,
Me quiere sonar que había una funcion en div para cambiar un color de la paleta, pero no la recuerdo.
Me suena otra que era roll_palette pero no creo que te sirva.
Aunque el mayor problema es que no emtienfo bien tu explicación. Se lo que quieres pero no llego a ver como lo haces funcionar, asi que no se me ocurre como ayudarte.
GameMaster
03/07/2016, 21:38
porque no posteas en el foro de bennugd ? no necesitarias llamar a nadie, los expertos ya verian tu hilo :D
en modo 8 bits puedes cambiar los colores en tiempo real, creo que ahora incluso el juego rulando a 16bits de color se pueden cargar fpg's en modo 8 bits para hacerle efectos de forma independiente
Pero la cosa es saber como funcionan esas lineas ¿cada una es un proceso con su gráfico? ¿Son gráficos dibujados con funciones draw? La solucion cambia en función de como está programado.
masteries
03/07/2016, 23:44
porque no posteas en el foro de bennugd ? no necesitarias llamar a nadie, los expertos ya verian tu hilo :D
No hagas como que no te gusta que te llamen :)
En realidad no se trata de cambiar la paleta de 8 bits, si no de cambiar a donde apuntan los índices de las paletas de algunos gráficos; para poder cambiar sus colores sin cambiar la paleta.
Imagina que tienes un proceso (un personaje vestido de rojo) que tiene asociado un fichero .fpg, que contiene los gráficos que utiliza.
Ahora necesitas que ese mismo personaje aparezca de azul, sabes los índices de los 4 o 5 tonos rojos que utiliza y a qué entrada de la paleta apuntan, lo que necesitas es hacer que sus índices apunten a otras entradas que se corresponden con tonos azules. De esta forma cambias los colores del personaje, sin cambiar la paleta que utilizas, dado que si cambias la paleta das al traste con todo el colorido.
Por lo que me he estado documentando, todo esto es muy común tanto en los tiempos de las paletas de 8 bits, como en máquinas que no llegaban a tantos colores. Siendo una técnica habitual en esos juegos escritos en C y ensamblador; pero en este caso toca Bennu, y no un Bennu demasiado moderno, ya que mi máquina objetivo es PlayStation 2 y hay tantos cambios en el port de Bennu que tengo entre manos... que es imposible hablar de portar un Bennu nuevo.
Creo que ha quedado más claro, de todas formas probaré con pal_map_assign a ver que sale.
futu-block
04/07/2016, 00:50
jo, no merezco ni ser mencionado... TT_TT
-----Actualizado-----
Por cierto, que habia una forma de cambiar los colores, como tu dices el
pal_map_assign ese de los cohones que nunca terminé de saber como...
aunque yo optaria por cambiar el numero de grafico, tienes hasta mil en un solo fpg
Entiendo que no te vale con duplicar los gráficos en otros colores e ir cambiando según te venga bien ¿no?
SplinterGU
04/07/2016, 01:39
muy bien no se entiende lo que planteas, pero lo que entiendo es que dices cambiar el valor del pixel (el valor del pixel es el indice en la paleta), por otro indice en runtime. eso es mucho mas pesado que cambiar el valor de la paleta. pero si cambiar ese valor de la paleta te arruina los colores de otras zonas del grafico o de otros graficos, lo que debes hacer es tus graficos a consciencia.
que quiero decir con esto?
con esto quiero decir, que deberias optimizar tus graficos para que usen X cantidad de colores de la paleta, reservandote Y colores para poder manipularlos, por ejemplo, opimizas los graficos a 240 colores, de esta forma te reservas 15 colores para jugar, agarras por ejemplo el color/indice 251 (el primero reservado) pintas con ese color la zona del grafico que quieres vaya variando y le asignas al indice 251 de la paleta lo que quieras tenga en cada momento, con lo que no perjudicas ningun grafico ni ningun otro color y esto seria optimo.
si te referias a otra cosa, pues no te entendi.
-----Actualizado-----
por otro lado, me gusta mucho el runner masteries corriendo en ps2, felicitaciones!
masteries
04/07/2016, 10:34
muy bien no se entiende lo que planteas, pero lo que entiendo es que dices cambiar el valor del pixel (el valor del pixel es el indice en la paleta), por otro indice en runtime. eso es mucho mas pesado que cambiar el valor de la paleta. pero si cambiar ese valor de la paleta te arruina los colores de otras zonas del grafico o de otros graficos, lo que debes hacer es tus graficos a consciencia.
que quiero decir con esto?
con esto quiero decir, que deberias optimizar tus graficos para que usen X cantidad de colores de la paleta, reservandote Y colores para poder manipularlos, por ejemplo, opimizas los graficos a 240 colores, de esta forma te reservas 15 colores para jugar, agarras por ejemplo el color/indice 251 (el primero reservado) pintas con ese color la zona del grafico que quieres vaya variando y le asignas al indice 251 de la paleta lo que quieras tenga en cada momento, con lo que no perjudicas ningun grafico ni ningun otro color y esto seria optimo.
si te referias a otra cosa, pues no te entendi.
SplinterGU
Si, esa es una de las cosas en las que estaba pensando... para cambiar los colores de los coches y de las líneas laterales de la carretera tendré que hacer esto. Pero sigue sin permitirme cambiar los colores de unos gráficos y de otros no (pertenecientes al mismo set gráfico), al final en estos casos me toca tirar de lo "viejo" y consumir un par de megabytes más de RAM.
Por cierto, dado que te interesa, el vídeo que he puesto es muy viejo; ahora el port de PS2 emplea un mezclador de audio en Tiempo-Real, ejecutado en una IRQ a 50/60 Hz donde se mezcla 1/50 o 1/60 de segundo de audio.
Yo te doy animos para conseguirlo porque no he tocado Bennu en mi vida ni tengo ni idea de como ayudarte. Has invocado al djinn equivocado :D
slaudos
GameMaster
04/07/2016, 10:57
masteries
masteries
04/07/2016, 11:17
@masteries (https://www.gp32spain.com/foros/member.php?u=28729)
GameMaster , ¡como te superas cada día!
lo que pide masteries es algo bastante "habitual" ....
tener el mismo sprite en diferentes colores sin tener que duplicar el sprite.
solo se me ocurre que cargues 2 veces el sprite y cambies los pixeles justo despues de la carga.
como se hace en bennugd, ni idea, pero apuesto a que existen funciones de manipulacion de pixels de un sprite.
Aiken
GameMaster
04/07/2016, 11:30
donde tenias tu pagina de descargas para ps2 @masteries (https://www.gp32spain.com/foros/member.php?u=28729)
masteries
04/07/2016, 12:06
lo que pide masteries es algo bastante "habitual" ....
tener el mismo sprite en diferentes colores sin tener que duplicar el sprite.
solo se me ocurre que cargues 2 veces el sprite y cambies los pixeles justo despues de la carga.
como se hace en bennugd, ni idea, pero apuesto a que existen funciones de manipulacion de pixels de un sprite.
Aiken
Aiken
Tú sí que has sabido sintetizar la idea, yo sólo he explicado lo que pretendía hacer a nivel "programa"; esa es la idea, no consumir memoria 2 o más veces pero tener 2 o más gráficos con diferentes colores, estando ya los colores disponibles en la paleta cargada.
futu-block
04/07/2016, 12:20
Igual dejando un "gráfico" base con relleno transparente sobre un gráfico base de un color o dibujando una forma básica que haga de fondo y cambiándole el color según desees, te puede servir
SplinterGU
04/07/2016, 14:23
SplinterGU
@masteries
Si, esa es una de las cosas en las que estaba pensando... para cambiar los colores de los coches y de las líneas laterales de la carretera tendré que hacer esto. Pero sigue sin permitirme cambiar los colores de unos gráficos y de otros no (pertenecientes al mismo set gráfico), al final en estos casos me toca tirar de lo "viejo" y consumir un par de megabytes más de RAM.
Por cierto, dado que te interesa, el vídeo que he puesto es muy viejo; ahora el port de PS2 emplea un mezclador de audio en Tiempo-Real, ejecutado en una IRQ a 50/60 Hz donde se mezcla 1/50 o 1/60 de segundo de audio.
el tema es que los modos 8 bits tenes 1 paleta para todo, si usas un modo de video de 16bits o 32bits, y graficos de 8bits, podes asignar 1 paleta para cada grafico individualmente, y de esta forma podes algo similar a lo que queres hacer, pero lo hace directamente el motor al hacer el dibujado del sprite.
si en ps2 usas 32bits, entonces si podes hacer esto, en ese caso usas map_pal_asign (para asignarla a un grafico) o directamente usar la variable PALETTE en el proceso y modifica solo a ese proceso, a PALETTE le asignas el valor de un LOAD_PAL o un NEW_PAL (para mi, esta es mejor, porque podes mantener procesos con el grafico original y otros modificados)
usando esto ultimo no tenes que optimizar los graficos ni nada raro.
bueno, espero esto te sirva.
-----Actualizado-----
SplinterGU
Si, esa es una de las cosas en las que estaba pensando... para cambiar los colores de los coches y de las líneas laterales de la carretera tendré que hacer esto. Pero sigue sin permitirme cambiar los colores de unos gráficos y de otros no (pertenecientes al mismo set gráfico), al final en estos casos me toca tirar de lo "viejo" y consumir un par de megabytes más de RAM.
Por cierto, dado que te interesa, el vídeo que he puesto es muy viejo; ahora el port de PS2 emplea un mezclador de audio en Tiempo-Real, ejecutado en una IRQ a 50/60 Hz donde se mezcla 1/50 o 1/60 de segundo de audio.
me olvide preguntarte, veo que en el video sigue el problema de que los objetos lejanos vienen mas rapido que los cercanos, eso ya lo has solucionado en las ultimas versiones?
Podrías limitar el numero de coches en escena, por ejemplo tener 3 coches con diferentes colores asignados de la paleta (coche1 colores del 101 a 110, coche2 de 111 a 120, coche3 de 121 a 130), e ir cambiando los colores concretos de cada coche cuando salgan de la escena (supongo se puede editar el color de forma individual en la paleta de 8bit), daría la sensación de que en el juego hay coches de muchos colores cuando realmente solo tienes gráficos de 3 coches coloreados.
No se si me explico bien y se entiendo lo que digo, o si te sirve o no.
masteries
04/07/2016, 19:30
Podrías limitar el numero de coches en escena, por ejemplo tener 3 coches con diferentes colores asignados de la paleta (coche1 colores del 101 a 110, coche2 de 111 a 120, coche3 de 121 a 130), e ir cambiando los colores concretos de cada coche cuando salgan de la escena (supongo se puede editar el color de forma individual en la paleta de 8bit), daría la sensación de que en el juego hay coches de muchos colores cuando realmente solo tienes gráficos de 3 coches coloreados.
No se si me explico bien y se entiendo lo que digo, o si te sirve o no.
Gracias, es buena idea esa.
El ahorro de memoria se debe a que quiero que el juego quepa entero en la RAM de una PlayStation2 y también se pueda jugar a él en una GP2X F100 / F200.
Gracias, es buena idea esa.
El ahorro de memoria se debe a que quiero que el juego quepa entero en la RAM de una PlayStation2 y también se pueda jugar a él en una GP2X F100 / F200.
La ram siempre es un tema complejo. hay que comerse el coco e ingeniárselas para hacer lo posible con lo que se tiene.
SplinterGU
04/07/2016, 20:50
Gracias, es buena idea esa.
El ahorro de memoria se debe a que quiero que el juego quepa entero en la RAM de una PlayStation2 y también se pueda jugar a él en una GP2X F100 / F200.
asi no vas a ahorrar memoria, porque necesitas tener el grafico con pixels de diferentes color en memoria... la forma de ahorrar es como te dije yo, si es que usas modo de 32bits (que segun veo en wikipedia es lo que soporta ps2), cada paleta son solamente 768bytes, y solo tenes 1 coche en memoria y lo podes dibujar con tantos colores como quieras, solo a un costo de 768bytes cada vez que le asignas una paleta nueva y esa paleta se puede reutilizar sin consumir memoria.
ejemplo
paleta1 = load_pal o new_pal; // 768 bytes de memoria
paleta2 = load_pal o new_pal; // 768 bytes de memoria
proceso1
grafico = lala;
palette = paleta1; // 0 bytes de memoria extra, esto no consume memoria, ni procesamiento extra para dibujarlo
end
proceso2
grafico = lala;
palette = paleta1; // 0 bytes de memoria extra, esto no consume memoria, ni procesamiento extra para dibujarlo
end
proceso3
grafico = lala;
palette = paleta2; // 0 bytes de memoria extra, esto no consume memoria, ni procesamiento extra para dibujarlo
end
y asi
masteries
05/07/2016, 09:35
asi no vas a ahorrar memoria, porque necesitas tener el grafico con pixels de diferentes color en memoria... la forma de ahorrar es como te dije yo, si es que usas modo de 32bits (que segun veo en wikipedia es lo que soporta ps2), cada paleta son solamente 768bytes, y solo tenes 1 coche en memoria y lo podes dibujar con tantos colores como quieras, solo a un costo de 768bytes cada vez que le asignas una paleta nueva y esa paleta se puede reutilizar sin consumir memoria.
ejemplo
paleta1 = load_pal o new_pal; // 768 bytes de memoria
paleta2 = load_pal o new_pal; // 768 bytes de memoria
proceso1
grafico = lala;
palette = paleta1; // 0 bytes de memoria extra, esto no consume memoria, ni procesamiento extra para dibujarlo
end
proceso2
grafico = lala;
palette = paleta1; // 0 bytes de memoria extra, esto no consume memoria, ni procesamiento extra para dibujarlo
end
proceso3
grafico = lala;
palette = paleta2; // 0 bytes de memoria extra, esto no consume memoria, ni procesamiento extra para dibujarlo
end
y asi
Si eso ya lo sé Splinter... sólo quería agradecer al muchacho el hecho de haber querido participar, ya fuese brillante o moderada su intervención.
No tenía intención ni esperaba que nadie echara por tierra su propuesta, pues a todas luces no parecía necesario.
-----Actualizado-----
La ram siempre es un tema complejo. hay que comerse el coco e ingeniárselas para hacer lo posible con lo que se tiene.
Y que funcione bien en una GP2X también tiene su gracia :)
SplinterGU
05/07/2016, 14:11
Si eso ya lo sé Splinter... sólo quería agradecer al muchacho el hecho de haber querido participar, ya fuese brillante o moderada su intervención.
No tenía intención ni esperaba que nadie echara por tierra su propuesta, pues a todas luces no parecía necesario.
-----Actualizado-----
Y que funcione bien en una GP2X también tiene su gracia :)
perdon, pense que no se habia entendido lo que explique, y por eso replantee mi explicacion...
Jo, si lo hubieras puesto en el foro de Bennu te habría contestado mucho antes. Como ahora estoy con un proyecto tras otro, casi me paso por allí dos veces al día y por aquí casi nada :D
Bueno, lo ideal por velocidad y recursos es lo que te han comentado: cambiar los colores de la paleta.
http://wiki.bennugd.org/index.php?title=Pal_set
Pero claro, entiendo que no es posible porque quieres tener gráficos iguales de diferente color. Ahí te toca duplicar los gráficos y modificar los colores con
http://wiki.bennugd.org/index.php?title=Map_get_pixel
http://wiki.bennugd.org/index.php?title=Map_put_pixel
Que es una tarea lenta (todas las funciones PUT son lentas).
Pero bueno, hay otra forma más rápida y similar a lo que se hacía en los 80, pero sigues necesitando duplicar los gráficos si quieres que tengan diferentes colores entre sí, y es usar el
http://wiki.bennugd.org/index.php?title=Map_buffer
Así no haces uso del renderer ni nada para acceder a los datos del mapa, tienes acceso directo, y si tienes los bloques de memoria localizados, puedes hacer la asignación muchísimo más rápidamente con:
http://wiki.bennugd.org/index.php?title=Memset
Es que ya, para reducir más memoria, necesitarías crearte un formato de mapa con menos bpp, pero entonces ya tienes que lidiar con map_put_pixel y demás, y te iba a bajar el rendimiento cosa mala.
La única opción que se me ocurre es que uses la técnica de NES para conseguir sprites con más colores, usando superposición de dos imágenes:
- Crea un sprite de 8bits normal, con sus colores de paleta, etc.
- Crea un sprite de 1bpp (sí, existen mapas de ese tipo) y usa esto para asignar el color:
http://wiki.bennugd.org/index.php?title=Drawing_color
- Colócalo estratégicamente sobre el sprite, usando un "proceso dummie".
Al ser un mapa de 1bpp puede consumir como 8 veces menos que un map de 8bpp, pero no he trabajado lo suficiente con ellos para decirte cómo de efectivo es este método, ni cómo funciona DRAWING_COLOR, ni con qué programa puedes crear mapas/fpgs de 1bpp.
Es más, incluso puedes usar varios mapas de 1bpp en lugar de un mapa de 8bpp, uno por cada color que necesites aplicar, pero ya no sé cómo irá eso de rendimiento. Tendrás que experimentar (y comentar los resultados :D:D:D).
SplinterGU
08/07/2016, 03:16
a mi me gustaria saber la profundidad de colores del juego...
masteries
08/07/2016, 13:20
Jo, si lo hubieras puesto en el foro de Bennu te habría contestado mucho antes. Como ahora estoy con un proyecto tras otro, casi me paso por allí dos veces al día y por aquí casi nada :D
Bueno, lo ideal por velocidad y recursos es lo que te han comentado: cambiar los colores de la paleta.
http://wiki.bennugd.org/index.php?title=Pal_set
Pero claro, entiendo que no es posible porque quieres tener gráficos iguales de diferente color. Ahí te toca duplicar los gráficos y modificar los colores con
http://wiki.bennugd.org/index.php?title=Map_get_pixel
http://wiki.bennugd.org/index.php?title=Map_put_pixel
Que es una tarea lenta (todas las funciones PUT son lentas).
Pero bueno, hay otra forma más rápida y similar a lo que se hacía en los 80, pero sigues necesitando duplicar los gráficos si quieres que tengan diferentes colores entre sí, y es usar el
http://wiki.bennugd.org/index.php?title=Map_buffer
Así no haces uso del renderer ni nada para acceder a los datos del mapa, tienes acceso directo, y si tienes los bloques de memoria localizados, puedes hacer la asignación muchísimo más rápidamente con:
http://wiki.bennugd.org/index.php?title=Memset
Es que ya, para reducir más memoria, necesitarías crearte un formato de mapa con menos bpp, pero entonces ya tienes que lidiar con map_put_pixel y demás, y te iba a bajar el rendimiento cosa mala.
La única opción que se me ocurre es que uses la técnica de NES para conseguir sprites con más colores, usando superposición de dos imágenes:
- Crea un sprite de 8bits normal, con sus colores de paleta, etc.
- Crea un sprite de 1bpp (sí, existen mapas de ese tipo) y usa esto para asignar el color:
http://wiki.bennugd.org/index.php?title=Drawing_color
- Colócalo estratégicamente sobre el sprite, usando un "proceso dummie".
Al ser un mapa de 1bpp puede consumir como 8 veces menos que un map de 8bpp, pero no he trabajado lo suficiente con ellos para decirte cómo de efectivo es este método, ni cómo funciona DRAWING_COLOR, ni con qué programa puedes crear mapas/fpgs de 1bpp.
Es más, incluso puedes usar varios mapas de 1bpp en lugar de un mapa de 8bpp, uno por cada color que necesites aplicar, pero ya no sé cómo irá eso de rendimiento. Tendrás que experimentar (y comentar los resultados :D:D:D).
Gracias Drumpi,
La técnica de NES tiene su gracia, y su efectividad... de hecho la voy a entrenar a ver qué se cuenta.
Drawing_color lo estoy usando, pues en el juego ahora se generan gráficos (puentes, túneles, catenarias/cables) con draw_box, draw_line.
El juego utiliza color de 8 bits; todo en él es fruto de chapucillas y experimentación, como ha señalado Drumpi.
Para mi, la única manera de hacer esto y no aumentar el uso de memoria (ya sea duplicando gráficos en el fpg o en la ram) es tener un proceso que esté vigilando que no haya coches en pantalla; y cuando no haya coches haga un cambio de colores de paleta; de manera que los coches varíen de color durante la partida, pero que no se les vea cambiar de color mientras están visibles en pantalla.
josepzin
02/08/2016, 22:12
¿Alguien de por aquí?
Acercamiento a la comunidad BennuGD: Javis
http://zxdevs.com/2016/08/tuutut/
SplinterGU
03/08/2016, 00:50
gracias josepzin
futu-block
03/08/2016, 01:57
Jarl!!
Bueno, pues cinco años y medio después, me he puesto a hacerle un ejemplo a Futublock en el que se usan diferentes paletas de 8bits en un entorno 16 bits, usando un único FPG para crear dos equipaciones diferentes para dos jugadres de fútbol (gráficos cortesía de... lo siento, no lo recuerdo, el autor del Soccer en modo7 de DIV2 ^^U).
http://forum.bennugd.org/index.php?topic=4328.msg68878#msg68878
Si no lo veis es porque necesitais estar logueados, restricciones del foro :awesome:
Hay un ejemplo más símple un poco más atrás (con instrucciones para arreglar el bug en el código ^^U), pero en esta podeis seleccionar un trozo de la equipación y un color y ver magia. Eso sí, según comentan, los gráficos 8bits en modos de 16 y 32 bits consumen más tiempo de CPU que usar directamente gráficos de resolución nativa (pero la mitad de memoria).
¡Ostrás! ¡La entrevista! ¡La había olvidado por completo!
Powered by vBulletin® Version 4.2.5 Copyright © 2026 vBulletin Solutions Inc. All rights reserved.