Pixel de colisión

Started by Arcontus, October 18, 2010, 07:06:22 PM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

Arcontus

Buenas chicos,

me surge una duda: está claro que mediante la función "collision" podemos averiguar si un proceso colisiona con otro pero, ¿existe algun modo de saber la posición de dicho pixel?

Pej: estoy desarrollando un juego de naves, y me gustaría que cuando las naves colisionan contra paredes, se produzca unas chispas u otro efecto similar, pero para ello, necesito saber en que punto he de mostrarlas.

Gracias de antemano,

Saludos!
5Leaps, el primer juego comercial desarrollado para BennuGD. http://www.5leaps.com

SplinterGU

Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Arcontus

Quote from: SplinterGU on October 18, 2010, 07:42:59 PM
no, no es posible...

Pues es curioso, por que si para valorar con collision el programa ha de ver si un pixel colisiona con otro, no debería ser demasiado complicado incluir una función que retorne ese punto ¿correcto?.

¿Se os ocurre alguna idea para solucionar este reto?

Saludos!
5Leaps, el primer juego comercial desarrollado para BennuGD. http://www.5leaps.com

Rein (K´)ah Al-Ghul

suponiendo q las paredes sean procesos, cuando la nave colisiona con las paredes esta podria crear procesos q son chispas...

digamos q la nave explata si se cocha con las paredes, podrias poner un mapa de dureza con dos colores uno que saque chispas y otro q haga q explote...

Rein (K´)ah Al-Ghul
Infected with the Krieger strain of the Human-MetaHuman Vampiric Virus.

en vez de darme Karma positivo, denme (K´)arma negativ

Arcontus

Quote from: Rein (K´)ah Al-Ghul on October 18, 2010, 10:00:24 PM
suponiendo q las paredes sean procesos, cuando la nave colisiona con las paredes esta podria crear procesos q son chispas...

digamos q la nave explata si se cocha con las paredes, podrias poner un mapa de dureza con dos colores uno que saque chispas y otro q haga q explote...

Esa es la idea, el problema es saber donde está ese roce.
5Leaps, el primer juego comercial desarrollado para BennuGD. http://www.5leaps.com

Windgate

Se podría calcular la posición exacta recorriendo ambos mapas con map_get_pixel hasta localizar las zonas que coinciden. De hecho no sería complicado hacer una función que para toda posición de pixel coincidente invocase un proceso chispa en esa posición.

Ojalá tuviese tanto tiempo como antes para programar estas cositas, de verdad, con map_get_pixel sería facilísimo hacer la función que te digo :'(

PD: Y si existiesen los punteros a función/proceso... Apúntalos nuevamente para la 2.0 Splinter :D
Iván García Subero. Programador, profesor de informática, monitor de actividades culturales y presidente de TRINIT Asociación de Informáticos de Zaragoza. http://trinit.es

DCelso

pues yo no lo veo tan fácil, deberías de sacar la posicion absoluta de cada pixel de cada gráfico de los procesos inplicados en el mapa de la pantalla y calcular su pixel de color en su posición relativa del gráfico, osea, sería crearte a manini el collision, es mas, no solo un pixel dará colisión, podría darse el caso de que colisionen mas de un pixel si tus procesos se mueven a mas de un pixel por frame. Osea sería como crearte un collision que devuelva un array de pixeles. :D
Monstruos Diabólicos

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

Drumpi

Bueno, si no se ha alterado el punto de control 0, sería tan fácil como buscar el punto de colisión entre los que forman la línea que los unen, sobre todo porque conoceríamos el tamaño de los mapas de ambos procesos.

Pero claro, estoy suponiendo colisiones entre objetos sencillos (formas cuadradas o redondas). Si uno es el mapa del nivel...
En ese caso: map_get_pixel en todos los puntos de la circunferencia/cuadrado que rodea a la nave y buscar el punto medio entre todos los que choquen.
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)

SplinterGU

Quote from: Arcontus on October 18, 2010, 08:16:53 PM
Quote from: SplinterGU on October 18, 2010, 07:42:59 PM
no, no es posible...

Pues es curioso, por que si para valorar con collision el programa ha de ver si un pixel colisiona con otro, no debería ser demasiado complicado incluir una función que retorne ese punto ¿correcto?.

¿Se os ocurre alguna idea para solucionar este reto?

Saludos!

pues no, no es curioso, hacer una colision del tipo que pensas no seria algo muy optimo, que ya de por si no lo es la funcion de colision, ya el simple hecho de que el primer punto (o juego de puntos, dependiendo de la profundidad de los graficos involucrados) que se detecta la colision ya se dice que colisiona, pero este primer punto no necesaria es el hotspot de la colision.

Quote from: Windgate on October 18, 2010, 10:47:45 PM
Se podría calcular la posición exacta recorriendo ambos mapas con map_get_pixel hasta localizar las zonas que coinciden. De hecho no sería complicado hacer una función que para toda posición de pixel coincidente invocase un proceso chispa en esa posición.

Ojalá tuviese tanto tiempo como antes para programar estas cositas, de verdad, con map_get_pixel sería facilísimo hacer la función que te digo :'(

PD: Y si existiesen los punteros a función/proceso... Apúntalos nuevamente para la 2.0 Splinter :D

eso seria terriblemente lento.

Quote from: DCelso on October 18, 2010, 11:03:13 PM
pues yo no lo veo tan fácil, deberías de sacar la posicion absoluta de cada pixel de cada gráfico de los procesos inplicados en el mapa de la pantalla y calcular su pixel de color en su posición relativa del gráfico, osea, sería crearte a manini el collision, es mas, no solo un pixel dará colisión, podría darse el caso de que colisionen mas de un pixel si tus procesos se mueven a mas de un pixel por frame. Osea sería como crearte un collision que devuelva un array de pixeles. :D

el color no tiene nada que ver, pero por ahi va la cosa, el problema no es simple como vos decis, porque en la mayoria de los casos (yo diria mas del 90%) no colisiona 1 solo pixel, sino que lo hacen muchos, y el "hotspot" de colision podria estar determinado por muchas cosas, como angulos, direccion del movimiento de cada uno de los objetos que estan colisionando y otras tantas cosas, para esto deberia tenerse en cuenta algun algoritmo de fisica.

no hay que olvidar que calcular posicion pixel a pixel seria una locura de procesamiento, es ilogico, ademas de que el algoritmo no debe limitarse solo a la primera colision, sino que deberia detectar todos los puntos de colision y procesarlo en base a reglas fisicas que variaran segun la aplicacion.

Quote from: Drumpi on October 19, 2010, 12:02:46 AM
Bueno, si no se ha alterado el punto de control 0, sería tan fácil como buscar el punto de colisión entre los que forman la línea que los unen, sobre todo porque conoceríamos el tamaño de los mapas de ambos procesos.

Pero claro, estoy suponiendo colisiones entre objetos sencillos (formas cuadradas o redondas). Si uno es el mapa del nivel...
En ese caso: map_get_pixel en todos los puntos de la circunferencia/cuadrado que rodea a la nave y buscar el punto medio entre todos los que choquen.

el punto de control 0 no significa que vaya a colisionar con el.

la cosa seria tener muchos puntos de control, y si un objeto colision, verificar cuales puntos de control entre ellos colisionan con el objeto, y en ese caso tomar alguno de ellos como el punto de impacto, con la cantidad de puntos de control adecuadas no importaria mucho la precision del impacto.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Noivern

#9
mmm quizás viendolo como un sistema vectorial y un margen de impacto...
y si obtienes el ángulo que hay entre lo que chocas y tu protagonista. Con ese dato, a partir del centro de tu prota le sumas a la X el (coseno del ángulo) * |distancia entre los puntos - margen de impacto| y la Y el (seno del angulo)  * |distancia - margen impacto|. En el punto que obtengase creas las chispas.
El margen de impacto es con lo que choca el prota... no va a ser  pixel preciso, pero yo creo que te serviría para lo que quieres hacer.
A ver si mis mates no me fallan y me dejan en ridículo xD u.u

Windgate

Sería lento, pero tampoco tanto, al fin y al cabo consistiría en recorrer 2 mapas pixel a pixel. El problema vendría si se ha alterado el valor de size o de angle xD
Iván García Subero. Programador, profesor de informática, monitor de actividades culturales y presidente de TRINIT Asociación de Informáticos de Zaragoza. http://trinit.es

SplinterGU

cierto, me habia olvidado de eso, igual pensa que no son 2 mapas, pixel a pixel, pueden ser mas, obviamente deberia ser solo de los que colisionan, pero bueno, se podria, haciendo un map_put sobre otro.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

osk

O no lo entendido bien, o soy un genio (!?), pero con un simple x=father.x ¿no sería suficiente para colocar las chispas donde colisiona la nave?

TYCO

Quote from: osk on October 19, 2010, 03:56:14 PM
O no lo entendido bien, o soy un genio (!?), pero con un simple x=father.x ¿no sería suficiente para colocar las chispas donde colisiona la nave?
Sí, siempre y cuando crees pequeños procesos ocultos que estén por los bordes de la nave y compruebes con collision si tocan la pared.
Programador, Escritor/Guionista y Deportista.

Todo Modo Gráfico tiene por detrás una Línea de Comandos.

SnowCraft Remake (100%)
Rally Mortal (87%)

SplinterGU

Quote from: osk on October 19, 2010, 03:56:14 PM
O no lo entendido bien, o soy un genio (!?), pero con un simple x=father.x ¿no sería suficiente para colocar las chispas donde colisiona la nave?

pues no, un simple father.x no es el punto del impacto, a menos que la "bala" o "misil" o lo que sea, sea lo suficientemente pequeño, pero no siempre son balas lo que colisiona, suponete un juego donde son autos que colisionan entre si, y queres ponerle chispas en el roce, con father.x no lo lograras.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2