Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Colision A Nivel De Pixel En Sdl

Iniciado por nsL, 04 de Marzo de 2005, 10:49:53 PM

« anterior - próximo »

nsL

 Wenas!

He estado leyendo post antiguos de aqui que tratabais sobre los temas de colision de sprites a nivel de pixel, pero por hardware, con buffer Z y todo eso, pero desde DX. Yo hasta ahora usaba el mitiko metodo de las areas del sprite, ver si se contenian una a la otra, pero para hacer un menu por ejemplo y poner un boton con forma de hexagono ya me fastidia, pues hay zonas que se activara el boton, sin estar encima el puntero del mismo, pero si del Rect donde esta contenido el sprite.

En fin, a ver si me decis algun metodo para ver colisiones a traves de pixel desde SDL.
Estuve mirando esto: link

pero claro, ni se que son oclussion querys ni na de na. en fin , veo cercano el momento de pasarme a DX u OGL para tratar mas a nivel de hard las cosas.

P.D: Mirando por google he leido esto (a ver que os parece en cuando a rendimiento):

CitarQuick and nasty:

XOR the sprites (without  background) then memcmp the images.

If there's a change, there's been a collision, otherwise, no.



Saludos!  B)
Yo no muero hasta la muerte -

ALRAZ

 Intenta leerte este documento:

http://www.ifm.liu.se/~ulfek/projects/2d_C..._Detection.html


ahí mismo te ponen el código fuente con todo lo que necesitas para implementarlo
(Está en inglés)

nsL

 Gracias  :P  le toi echando un ojo a ver que tal.
Yo no muero hasta la muerte -

nsL

 Parece estar bien ese metodo... solo q hay un problema :P
Habria que adaptar las mascaras que crea el tio ese a las Surfaces de SDL y es un poko pestazo. Y si a eso le sumas que me fastidia usar librerias mientras lo pueda implementar yo :P (una mania que tengo). Asi q lo intentare yo, pero antes tengo que saber bien si es asi el sistema que el usa:

Supongamos tengo este sprite:
y su mascara seria

y para no complicarnos quiero colisionarlo con otro sprite igual, es decir, con la misma mascara.



Las mascaras serian superficies con pixeles en blanco toda ella, menos el contorno q sera 1 pixel negro de grosor. Para no tener que estar comparando todos los pixeles de ambas mascaras todo el dia, paso el algoritmo de colision de areas antes, para ver si estan colisionando, o al menos cerca.
Cuando me de true esa colision, tengo que hacer esta nueva:

Que seria mas o menos (espero q no sea asi, porq tardara mucho):

y=0 y x=0
Mientras (y<=sprite->h) y (!colision)
-->Recorro desde x=0 a x=sprite->w todos los pixeles de la primera mascara.
---->Si el pixel es negro comparo su posicion con todos los pixeles negros de la mascara del otro
------>Si alguno coincide, colision == true
------>Sino x++
-->y++

Mas o menos eso es lo que pense, aunq mirandolo bien son muchas comparaciones  (nooo)
De funcionar asi para colisiones de sprites esta bien, pero habria problema para colisiones con el puntero del raton. Ahi no necesariamente tiene porq colisionar con la mascara del boton/sprite, ya que el raton puede tener un movimiento rapido y saltarse la barrera de 1 pixel de grosor... (no se si me explico bien)
De todas formas, aun asi decirme si estaria bien este metodo, pues ambos me valen.

De momento voy a ir implementando una funcion pa crearme una mascara de un superficie, que aunq no sea valido este metodo, seguro me sirve en un futuro.

Saludos y gracias de mano!  B)
Yo no muero hasta la muerte -

AgeR

 Para el ratón no bastaría...?
- Comprobar su posición.
- Ver si está dentro del área del sprite.
- Si lo está, comprobar si está dentro del área real del sprite.

No haría falta hacerlo ni pixel a pixel, ya que como sabes dónde está el ratón, puedes hallar el pixel exacto del sprite donde se hallaría, y ni el pixel no coincide con el color key es que "colisiona".
No sé si me explico muy bien...  :huh:

nsL

 Hombre eso estaria bien si supuese como se halla el area real del sprite, es decir, si es un cuadrado vale, pero si son circulos combinados por ejemplo, como el dibujo de mascara que puse arriba, como hallas el area que hay dentro del mismo. Creo que eso se hacia integrando, pero no toi seguro.

Y luego a parte eso del color key, si por ejemplo paso el metodo de colisiones de area y me da true, que esta en el Rect del sprite; vale, hasta ahi bien, pero el color key de dentro del area y de fuera de ella es el mismo, blanco. Tb es cierto que las mascaras son como una sombra y no un borde solo, que me sake de la manga :P. Guay, me acabas de decir pa el metodo pa el raton, y no es muy descabellado :P

Ahora a ver si alguien me dice para la colision de sprites :D

Como ya dije en otro post, estoy algo verde y digo chorradas a veces. Si toi diciendo alguna obviedad sorry  :rolleyes:

Saludos! y Gracias!  B)  
Yo no muero hasta la muerte -

nsL

 ¿Que es mas rapido, hacer la mascara en tiempo de ejecucion, o hacer una mascara de cada sprite en .bmp (o el format qu sea) y cargarla desde SDL?

Ya estaba acabando el metodo para hacer las mascaras en tiempo de ejecucion, pero lei en una web, q era mas rapido y sencillo cargarlas ya hechas de antemano con photoshop u otro similar.

:o

Saludos!  B)  
Yo no muero hasta la muerte -

BeRSeRKeR

 
Cita de: "nsL"¿Que es mas rapido, hacer la mascara en tiempo de ejecucion, o hacer una mascara de cada sprite en .bmp (o el format qu sea) y cargarla desde SDL?
Pues no tengo ni idea pero crear la máscara en un programa como pueda ser Photoshop es rápido y si utilizas un formato como TGA o PNG podrías meter la máscara en el canal alpha.

Saludos.
¡Si te buscan en nombre de la ley, huye en nombre de la libertad!!

nsL

 ya que estamos, como la creo en photoshop?
me imagino que bajando el bpp a 1, pero no encuentro ninguna opcion....
Yo no muero hasta la muerte -






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.