Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Formas De Detectar Colisiones En 2d

Iniciado por Monchito, 30 de Marzo de 2004, 07:34:17 PM

« anterior - próximo »

Monchito

 Hola a todos.

Sigo iniciandome en la programación gráfica en 2D. Y, como de costumbre, sigo montándome películas en la cabeza. Ahora estoy en el tema de las colisiones entre gráficos, y buscando por internet he visto que hay varios métodos, a saber:

1- Mediante las coordenadas: el método más obvio: cuando las coordenadas de un gráfico están dentro de las de otro, es que hay colisión.

2- Mediante matrices: simplificando: imagino que la pantalla es una matriz, por ejemplo:
00100
00000
00000
00100
donde los unos representan un gráfico. Al mover el gráfico, modifico su posición en la matriz:
00100
00100
00000
00000
Y cuando tengo dos unos juntos, es que hay colisión.

3- Este método me tiene mosca :blink: : Mediante capturas de pixel. Imaginemos que el gráfico de un misil contiene un pixel de un color único. Entonces, a cada ciclo del programa busco en el gráfico de la nave enemiga un pixel de ese color. Si lo encuentro, es que hay colisión. Esto me suena muy raro, ya que se tiene que gastar un tiempo de la leche en rastrear todas las naves enemigas en busca de un pixel. Así que no se si este método es útil,  o es una paja mental del autor.

Os ruego que me deis vuestra opinión, y que me digais si hay algún otro método.

Muchas gracias.

[EX3]

 Sinceramente, si es para un juego sencillo como uno de naves como me ha parecido ke has dicho, lo mejor es colision por cuadrados o Bounding Box (creo ke lo llaman asi, no??) en el que se trata de detectar la colision de dos cuadrados ke tienen las dimensiones de los sprites (misiles, naves, etc...).

Este es el metodo mas rapido ke podras encontrar para comprobar colisiones entre dos sprites y ademas ke es muy sencillo de implementar.

Por cierto, este tema ya se trato en otro post: Stratos-AD/Programacion/Programacion grafica 2D/Control De Colisiones
Echale un ojo ke tratan justo el mismo tema, referido tb a un juego de naves.

Salu2...
José Miguel Sánchez Fernández
.NET Developer | Game Programmer | Unity Developer

Blog | Game Portfolio | LinkedIn | Twitter | Itch.io | Gamejolt

Monchito

 Gracias por tu respuesta. No había visto el post que me dices, que por cierto me va a ser de gran utilidad.

Sí, me refiero a un juego sencillo (de naves o de lo que sea). Mi pregunta se refiere a qué métodos de detección de colisiones en 2D existen. Yo he encontrado la explicación de varios en internet (los tres que digo en mi post), y me he hecho algunos juegos-pijadillas usándolos. Os comento:

1-> Con el método de las coordenadas, me he hecho el cutre-Space Invaders. Lo que hago es comprobar si el rectángulo que contiene el gráfico del disparo se solapa con el que contiene el gráfico de la nave enemiga. Por lo que he entendido, esto es algo parecido a lo que me comentas sobre bounting box. Juer, resulta que ya lo había implementado, y ni siquiera sabía que se llamaba así...

2-> Con el método de las matrices me hice el típico cutre-juego de la serpiente que va comiendo manzanitas mientras su cuerpo se alarga, y el cutre-tetris, que me quedó chulísimo y estoy super orgulloso. Éste método creo que lo entendí más o menos bien. (ole)

3-> Con el "extraño" método de las capturas de pixel me hice el cutre-Pang de la siguiente manera: al gráfico del garfio que lanza el jugador le puse un reborde de color amarillo chillón. A cada frame compruebo todas las bolas que tengo en ese momento en pantalla, y si en alguna detecto un pixel de ese color amarillo chillón, es que hay colisión entre esa bola y el garfio. El jueguecillo quedó chulo, y aunque este método funciona, es lentísimo, consume tiempo a lo bobo, hay que comprobar cada pixel de cada bola buscando ese color . De ahí mi duda de si es un método que se usa normalmente, si lo he entendido yo mal, o si es una chorrada que se le ocurrió al paisano que escribió el tutorial donde lo leí.

¿Algún otro método? Y ya de paso, ¿algún ejemplo de juego que pueda hacer para probarlo?.

Gracias de antemano.  

wialco

 Deberías comprobar primero si en verdad hay colisión entre los sprites por bounding box, esfera o elipse, que consumen menos recursos, y si en verdad la hay, entonces comprobar por píxel sólo la zona afectada entre los dos sprites.

javiel

 yo estoy intentando hacer la captura por pixel que por el momento me parece la mejor de todas y la más cómoda. Todavía no lo he implementado, pero he hecho las pruebas necesarias y no hay problema por hacerlo. Yo estoy programando en SDL y creo que se puede hacer de una manera muy sencilla, además de que te da la colision exacta

Como dice Wialco es lo mejor, y es como tenía pensado hacerlo

Primero se compureba si hay colosión entre las dos sprite y en caso afirmativo se comrpueba por pixel

saludos
uper-Tirititran: el superhéroe gaditano (http://www.super-tirititran.com)

AK47

 Saludos
Para mi, usar cajas y circulos es mas que suficiente. Ademas, segun como te lo montas, leer pixeles puede ser muuuuuuuuuuuuuuyyy lento

Loover

IndieLib Libreria 2.5d utilizando aceleración por hardware para la programación de juegos 2d.
Indie Rover The monkeys are reading!






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.