PDA

Ver la versión completa : Fondos transparentes en sprites, ayuda



(_=*ZaXeR*=_)
19/01/2004, 00:32
Hola:
Tengo un problema con las transparencias las funciones para pintar los sprites en pantalla, no soy capaz de hacer que el fondo de los sprites sea transparente, me podrias decir como lo haceis?
Gracias

Wonder Boy
19/01/2004, 00:48
Hola ZaXeR, puedo sentir su intensa actividad en el mundo de la programación y eso me agrada :)

Vamos a ver,
primero decirte que yo estoy en pañales en cuanto a desarrollo fuera de MS-DOS y que estoy empezando ahora con Windows pero, por decirte algo a ver si fuera y pudiera ayudarte, quizás imaginarás que por lo general los sprites utilizan un color fondo que el sistema lo interpretará como transparente (simplemente, la función que dibuja el gráfico no pinta los pixels con dicho color) y que normalmente suele ser el primer color de la paleta, o sea, el 0.

No especificas con que estás trabajando pero a ver si ésto te puede ayudar.

Ya te digo que estoy en ello y ahora mismo me iba a empollar tutoriales y cosas sobre SDL... :)

Suerte compañero y cuéntanos qué tal!

Un Saludo!
;-)

(_=*ZaXeR*=_)
19/01/2004, 01:18
Hombre WonderBoy, espero que hayas pillado una camara guena, yo tambien estoy un poco verde en la programacion fuera de ms-dos (bueno quitando Visual Basic que es en lo que hice el proyecto de fin de modulo de DAI y un poco de C builder) pero es que de usar sprites en los juegos no lo he hecho nada mas que una vez y era usando codigo copiao, osea que 0 patatero.Siempre he usado caracteres ASCII para personajes y tonterias.

Lo que me dices que de la funcion deja de pintar los pixels del color que le indicas, si lo sabia, pero lo que no se es cuales son los colores de la paleta de 256 colores en la GP32, ni su numeracion ni nada de nada, asi que hice una cosa que vi en un tutorial:

...........................tol codigo que falta.................................

GpTransBlt(NULL,&gpsurface[nflip],x,y,width, height,
(unsigned char*)image,
0, 0, width, height, 0xe3 /*color e.i. purple*/);

...........................tol codigo que falta.................................

Osea que dice que el purple es el 0xe3 hice un sprite con el 0xe3 para que me saliera de fondo transparente, y nada de nada, pero claro como purple hay tos los que quieras y mas pues imaginate, seria mas facil si supiera los colores negro blanco yo que bueno el blanco creo que es el 0xff, pero de todas formas estos dos son los mas usuales en los sprites.

Pos espero que tengas avances en la programacion y ya nos intercambiaremos los proyectos, yo estoy que no paro entre examenes, otras ideas, y no creo que pueda conseguir muxo ya sabes el sindrome.... etc etc.

Ah!! te aconsejo que pases del SDL, porque luego vas a ver que necesitaras usar el SDK para algunas cosas y veras que es mas comodo el SDK por tutoriales y ejemplos que hay ya hechos, a no ser que quieras portabilidad, para otras plataformas. Yo comence con el GDL que es tela de sencillo y lo deje, aunque las animaciones es otra cosa que se me esta resistiendo con el SDK y tendre que abrir otro post para que me ayuden con ese tema tambien.

Un saludo

Wonder Boy
19/01/2004, 01:42
Claro, la cámara, pues me pillaré al final la BENQ DC2410 3.1 y espero que pronto, ya te contaré :)

La verdad, es que programé tambien en DIV 2 (siempre sin salir del DOS :D ) y bueno lo que dices está bien, pero como mencionas, busco ahora mismo la portabilidad.

De todas formas, tengo que decirte que de momento voy a programar para Windows en SDL con Visual C++ 6.0 ya que anoche lo dejé instalao y configurao e hice mi primera ventana Windows, osea, primer programa Windows aunque luego se quedara bloqueo jeje pero es tampoco inicializaba la libreria ni la cerraba ni na y entonces no me extraña... :D

Tambien querré portar a otros sistemas como la GP32 (enporsupuesto :)) y algún otro...

Hombre, yo hice cosicas con la VGA en aquel modo 13h y quieras o no se te quedan cosas que ahora te sirven, como es normal :)

Yo tambien hacía sobre tó con el Turbo Basic programicas con caracteres ASCII... unos decoraos jeje... recuerdo uno que 2, uno de pasar pantallas y el otro tambien pero tenía hasta animaciones cíclicas jajej de ASCII (los enemigos) y de tonterías nada que eran muy divertidos los gráficos ASCII jajaj qué tiempos... :D

En cuanto a tu cuestión, pos macho no se, es lo que te digo, que si trabajas con 256 colores quizás el sistema interpreta como transparente (o no pintado) el primero de la paleta, osea, el 0 como te decía.

Por si no lo sabes, que supongo que sí, aunque haya 2 o más colores idénticos, es decir, con los mismos valores en sus componentes RGB (rojo, verde y azul) no serán tendrán el mismo código de color aunque sean iguales en cuanto al color...

Es decir, el color 0 tiene unos componentes RGB de 0,0,0 o sea negro, ¿no? y el color 177 tiene tambien de RGB 0,0,0 sin embargo, son 2 colores distintos: uno es el 1 y el otro es el 177 de la paleta...

Quizás ya supieras ésto pero por si acaso... :)

Pos ¿qué te voy a decir? que a ver si solucionas tu cosa porque ya ves que estoy yo tambien miaja verdecillo (de momento ;)) y no sé decirte y que ya estaremos en contacto sí, y veremos nuestros progresos... :D

Ah! el Síndrome claro... :-D

Un Saludo compañero y que tengas pocos atascos en la programación!
;-)

Aiken
19/01/2004, 01:53
Vereis ...

Lo del TransBlit ... el color que le pasas como ultimo parametro es la posicion de la paletta que sera el color transparente.

Es decir en la posicion 0 puede estar el color que tu quieras. El negro no esta obligatorio en el 0 ni el purpura en la 3.

Cuando tu haces un dibujo defines la paleta, de 256 colores en los casos que yo he utilizado ...

En el psp o potosop ... en algun lugar teneis que tener la paleta ... alli elegir el primer color que aparezca (sea cual sea) y ya prodreis decirle al TransBlit que no pinte el 0x0 pando esto como ultimo parametro.

No se si habeis entendido que cuando decis 0x0, le estais diciendo al TransBlit que no pinte el primer color de la paletta, sea cual sea, a el le da igual si es negro o que.

Si a vosotros os hace ilusion que el fondo sea negro (cosa que da igual pues no se va a pintar), pues en el psp o potosop en algun lugar habra un editar paleta en el que podreis decir en cada posicion de la paleta que color va.

Espero os sirva ..
Aiken

(_=*ZaXeR*=_)
19/01/2004, 02:05
El problema esta en los primeros colores de la paleta de colores son los mas utilizados para hacer los sprites que se usan en los juegos, rojo amarillo azul.... osea que el primero no nos vale, de ahi que necesite sabe cuales son los correspondientes en la paleta de la gp32, para saber como debo hacer el sprite y cual usar de fondo, yo uso el purpura como dice el ejemplo 0xe3, pero luego ese color me lo pinta y no se porque, y si usara el 0x0 osea el rojo (si miramos la paleta del photoshop) pues nos jode el sprite, porque uso el rojo.

(_=*ZaXeR*=_)
19/01/2004, 02:12
Bueno el problema lo puedo dividir en dos mas bien:
1º Yo cojo la funcion

GpTransBlt(NULL,&gpsurface[nflip],x,y,width, height,
(unsigned char*)image,
0, 0, width, height, 0xe3 /*color e.i. purple*/);

y pinto mi sprite con el fondo en purpura como dice el ejemplo, porque teoricamente sera el color que no se pintara, y me servira para hacerlo transparente, pero nada, que se me pinta igual, a la funcion se la suda que yo use el mismo color que yo le he pasado para que no pinte, la puñetera me lo pinta.

2º No se el codigo de la paleta de otros colores, porque seria interesante saberlo, si tienes sprites que pintas con distintos colores, no puedes coger el primero por que si 0x0 para que no
te lo pinte si el primero lo estas usando, asi con cualquiera.


Wonderboy lo de los colores en RGB la verdad es que no lo sabia, gracias por la info

(_=*ZaXeR*=_)
20/01/2004, 10:55
Bueno alguien me puede decir que pasa y darme una solucion?
o es que a nadie le interesa este post?

Zheo
20/01/2004, 15:13
¿Tienes el Photoshop Gimp o Paint Shop Pro? Lo digo para que edites la imagen en modo indexado, abras la paleta (en el PS tabla de colores) y cambias el primer color con el que uses de transparente.

¿Al final el color que se le pasa a la funcion es el valor numérico del color, o la posición del color en la paleta? Ante la duda, yo probaría las dos opciones a ver si alguna funciona, ya que con un editor puedes conocer ambos valores.

Un saludo.

PD: tampoco es necesario ponerse exigente, que digo yo que si la gente no contesta será porque o no sabe o no puede.

(_=*ZaXeR*=_)
21/01/2004, 09:33
Hombre lo de exisgente, teniendo en cuenta que todo el mundo esta programando para la GP32 en este foro, el que mas y el que menos, pues me resulta extraño que nadie responda. Ademas es un tema que es bastante interesante que deberia haber subscitado un mayor interes a mi parecer., y que no quiero quie desaparezca en las profundidades del foro sin obtener respuesta. Es mas lo que me extraña es que nadie me haya respondido a el post que escribi el otro dia informando sobre un bug que yo habia descubierto en el GP32converter.
Asi a bote pronto puedo recordar que programando en el foro estan mortimor, chui, wave, miki-chan, sd-snatcher, karthur, rlyeh.... y muchos mas que de memoria no voy a recordar logicamente, porque estos son los que mas me suenan, pero he visto muchos que han puesto sus trabajos en el foro para que los pruebe la gente.

Zheo
21/01/2004, 23:24
No hombre, lo digo porque la petición puede parecer un poco brusca, no por otra cosa. Además, en este foro hay bueno rollo y tal. Vamos que no es nada, simplemente me extrañó la petición.

Supongo que si no contestan puede ser por falta de tiempo o por descuido.
Por ejemplo yo vi este mensaje y no pude contestar en el momento y luego se me pasó :( Cuando se volvió a escribir pues me salió en los mensajes nuevos pues aproveché :P :P

¿por cierto, te ha funcionado algo, algún progreso?
Si se me ocurre algo más lo pongo, pero a priori no se me ocurre nada más que lo que ya te puse...

A ver si lo consigues :)
Un saludo.

Aiken
22/01/2004, 01:37
Veamos ... atentos !!!

IMPORTANTE QUE TU SPRITE SEA DE 256 COLORES, con paletta de 256 colores, al menos para que funcione este ejemplo.

1)Como se hace pues ... en el menu Colors --> decrease color depth --> 256 colors.

2) Ahora cada color tiene como index (lo que teneis que usar en el blit la posicion que tienen en la paletta) esto se me como menu Colors ---> Edit palette (por ejemplo). Ver imagen que adjunto.

En la imagen adjunto, es la ventana que sale en el paintshoppro cuando dais a edit palette.

3) Desde la ventana de edit palette si vas haciendo clicks en los colores abajo de esa misma ventana sale el "palette index" que es el numero que teneis que pasarle al blit como parametro.


METODO DE LA HERRAMIENTA DROPPER

Con tu sprite abierto, y asegurandote que esta en 256 colores, y sino le hace un decrease color depth ....

Eliges la herramienta "dropper" de la barra de herramientas y con el dropper seleccionado veras que en la herramienta de colores (imagen adjunta dos) te pone la informacion del color que hay debajo del raton. Te pone los valores R,G y B, y luego el valor de I, o sea el index, o sea lo que le tienes que pasar al blit de la gp32.

Haber que te parece ...
no he podido adjuntar la imagenes porque tengo la adsl chunga

Aiken
22/01/2004, 01:40
a ver si puedes ver el ejemplo del dropper

Aiken
22/01/2004, 01:48
Veamos ... atentos !!!

IMPORTANTE QUE TU SPRITE SEA DE 256 COLORES, con paletta de 256 colores, al menos para que funcione este ejemplo.

1)Como se hace pues ... en el menu Colors --> decrease color depth --> 256 colors.

2) Ahora cada color tiene como index (lo que teneis que usar en el blit la posicion que tienen en la paletta) esto se me como menu Colors ---> Edit palette (por ejemplo). Ver imagen que adjunto.

En la imagen adjunto, es la ventana que sale en el paintshoppro cuando dais a edit palette.

3) Desde la ventana de edit palette si vas haciendo clicks en los colores abajo de esa misma ventana sale el "palette index" que es el numero que teneis que pasarle al blit como parametro.


METODO DE LA HERRAMIENTA DROPPER

Con tu sprite abierto, y asegurandote que esta en 256 colores, y sino le hace un decrease color depth ....

Eliges la herramienta "dropper" de la barra de herramientas y con el dropper seleccionado veras que en la herramienta de colores (imagen adjunta dos) te pone la informacion del color que hay debajo del raton. Te pone los valores R,G y B, y luego el valor de I, o sea el index, o sea lo que le tienes que pasar al blit de la gp32.

Haber que te parece ...

(_=*ZaXeR*=_)
22/01/2004, 09:57
Habia respondido el post, y parece que esto no se entera muchas veces de lo que se hace. Bueno decia que gracias, porque he avanzado mucho, la informacion es de la ostia, ya puedo hacer el fondo como quiera sin problemas, pero lo que pasa ahora es que tengo un par de problemillas mas que solucionar:
1º Los sprites cuando se mueven dejan tras de si una estela del mismo color que los pixeles del borde del sprite, y la verdad es que me gustaria solucionarlo porque no se me ocurre como.
2ºComo hacer las animaciones usando el SDK, porque la verdad es que antes usaba el GDL hasta que decidi cambiar de librerias de desarrollo porque el compilador ADS no me lo permitia.

Espero vuestra ayuda, y muchas gracias, ya os digo que he avanzado.
Un saludo

Zheo
22/01/2004, 19:29
(_=*ZaXeR*=_) eso es porque no "repintas" el fondo al mover el sprite.

Al hacer un blit al sprite en la pantalla pierdes la parte de la imagen del fondo que tapa el sprite. La solución es redibujar el fondo, mover el sprite y luego hacer un blit del sprite.

Lo mejor que puedes hacer en vez de redibujar el fondo entero, es redibujar sólo lo que ocupa el sprite. Por ejemplo si es un sprite de 5x5 en la posición (0,0), pintas el sprite. Si lo quieres mover, coges un cuadrado (superficie) de la imagen que forma el fondo del mismo tamaño que el sprite (5x5 en este caso) y en la posición (0,0) y le haces un blit. Con esto borras el sprite y dejas el fondo como estaba. Acto seguido haces un blit del sprite de nuevo, pero en la posición nueva. -pongamos en la posición (1,0) - y así parecerá que el sprite se ha movido.

En realidad la secuencia sería fondo-fondo+sprite-fondo-fondo+sprite.... pero claro, como se hace tan rápido no da tiempo a distinguirlo

Siento no tener mucho tiempo para explicártelo, pero tengo que irme. Tengo un ejemplo de eso mismo con SDL, si lo necesitas te lo pongo. El concepto es el mismo independientemente de que API utilices.

Un saludo.

Editado: aclaradas un par de frases en las que me había expresado mal en el original.

(_=*ZaXeR*=_)
26/01/2004, 18:16
Lo de redibujar el fondo ya lo probe, pero el resultado era un parpadeo en la pantalla, por lo que supuse que existiria otro metodo, pero parece ser que no, y lo de utilizar un trozo del mismo tamaño que el sprite que se mueve, la verdad es que no lo habia pensado es una buena idea, pero la cosa es que si usas de fondo una foto, como te lo montas? si fuera todo de un mismo colo pues bastaria con poner el borde del sprite que se mueve del mismo color que el del fondo y no haria falta mucho lio pero la cuestion es utilizando un sprite de fondo y sin usar el redibujado...

Wonder Boy
26/01/2004, 21:29
Es que supongo ZaXeR que habrá que hacer alguna técnica de pantalla virtual o algo similar.

Es decir, una técnica donde jamás deberás de crear la escena (dibujar prota, enemigos, etc.) en la misma pantalla que en ese mismo momento se está volcando a la RAM Vídeo ya que si no parpadeos y demás feolidades... :-)

No lo sé bien, pero parece que el sistema de la GP32 pa hacer to éstas cosas es más o menos así (¿una técnica de intercambio o flipping?:

1º. Tenemos dos buffers de memoria tamaño display GP32 A y B, usease, 320x240 gramos... ¡digo pixels! jaja ;)

2º. La RAM Vídeo apunta a uno A (es decir, en la pantalla se estará viendo dicho buffer) y el otro B es que utilizaremos para dibujar la siguiente secuencia del juego ya que éste está fuera de escena, es decir, no se ve en la pantalla por lo que evitamos los parpadeos molestos...

3º. Una vez dibujada la siguiete secuencia del juego en B logicamente pa evitar efectos raros como decimos, se hace que la RAMVídeo apunte ahora a tal buffer (B)

4º. Ahora se haría el 2º paso pero alrevés, es decir, se dibuja la siguiente secuencia en A...

5º De nuevo se vuelca a RAMVídeo el buffer A y así...

Sí, ha salío un poco lioso lo siento, pero a ver si te aclara algo ZaXeR....

Repito que no lo sé pero por un programa que he visto ésta tarde parece que más o menos hacía eso...

Ya me cuentas,

Un saludo.

Zheo
26/01/2004, 22:41
Hey, no ha salido mi mensaje que puse por la tarde en donde te comentaba precisamente eso :( :(

En fin, sólamente te contaba la técnica de doble buffering, que es muy simple de implementar: sólo tienes que crear otra superficie de tamaño igual que la pantalla, pintar en ella, y luego hacer un blit de todo al framebuffer.

Ahora a lo que Wonder Boy se refiere es page-flipping, que básicamente es lo mismo, pero más eficiente, porque en vez de hacer un blit a la pantalla (lo que implica transferencia de memoria) se cambia directamente y tiene el mismo efecto. Lo malo es que eso lo tiene que implementar la GP32 en hardware.

Un saludo.

(_=*ZaXeR*=_)
30/01/2004, 01:38
Lo cachondo es que sabia que eso era lo que me ibais a responder, pero es que para evitar estas cosas desde el principio habia adoptado esta tecnica del doble buffer, o eso creia yo, y parece ser que no funciona, aunque posiblemente es que no la tenga bien implementada, estoy en la duda de si yo lo tengo mal hecho o es que el problema es del software con el que lo pruebo, porque resulta que lo hago probandolo tras compilar con el visual c++. Os pondre el codigo de donde saque el ejemplo del doble buffer cuando lo encuentre.

(_=*ZaXeR*=_)
05/02/2004, 02:57
Os pongo el codigo de donde saque el que uso en mi juego, yo estaba convencido de que era doblebuffer, la verdad es que no tengo ni idea de que pasa porque la verdad estaba casi seguro de que lo estaba haciendo bien.

Aiken
05/02/2004, 09:05
Pues el codigo me parece valido ....

Pero asegurate del valor inicial de la variable nflip.

En el ejemplo no la inicializa, supongo que se inicializa a cero y empieza a pintar en la screen0, !!!!!! Ahh!! Es decir usas doublebuffering pero en lugar de pintar en la pantalla oculta pintas todo el rato el la que esta visible !!!

Prueba a inicializar la variable nflip a 1.

Aiken

(_=*ZaXeR*=_)
05/02/2004, 18:49
Ostias gracias Aiken, yo me estaba comiendo el tarro porque desde el principio queria usar el doble buffer para lo de la pantalla y no cagarla, y me lie con el codigo to convencio de que lo estaba haciendo bien, luego cuando escribi aqui que me dijisteis eso de que no usaba doble buffer me raye, y es verdad lo que dices, porque cuando me lie a usar ese codigo me pidio que lo inicializara y lo hice a 0 porqe no indicaban nada, pero yo no tenia ni idea de que el 0 era la pantalla activa y no la otra. Entonces cambiare y le metere un 1 y a ver que tal. Ya os informare de los avances cuando termine de los examenes. Y otra cosilla, ya puestos las animaciones no se como meterles mano. Porque yo las hacia con el GDL que son to sencillas, pero con el SDK ni put a idea a b quien me pone un ejemplo y me ayuda un poco.