Octubre 04, 2015, 04:49:43 PM Ultima modificación: Octubre 04, 2015, 06:00:31 PM por Jaume
Hola otra vez,

hay alguna funcion que me devuelva true o false si un objeto esta en colision con otro, pero el objeto entero, osea todos los pixeles del objeto 1 esten colisionando con los pixeles del objeto 2?

Gracias

¿Qué forma tienen los sprites? porque hay que tener en cuenta de que pueden haber formas de sprites que son imposibles de colisionar en todos sus píxeles con otra por la razón que aunque se pongan superpuestas le sobran píxeles de un lado o del otro.

En caso que tus sprites funcionen bajo el sistema de física de Game Maker tienes a tu disposición una función que podría ayudarte como:
phy_collision_points

No la he usado nunca, pero en la ayuda dice que esta función devuelve el número de puntos que colisionan. No se si con puntos se refiere a píxel o a que cosa. Pero igualmente deberías saber cuántos píxels tiene cada sprite para saber si colisionaron todos. Encima usar físicas para poder acceder a esta función, etc.

Pero te doy una idea simplificada que podría resolver este asunto de forma aproximada. Supongamos que cada sprite está enmarcado en un rectángulo imaginario, en este caso la solución es ver si un rectángulo está completamente dentro del otro. Si te parece bien esta idea te puedo armar un proyecto en Game Maker para que lo veas.


#2 Octubre 04, 2015, 10:30:59 PM Ultima modificación: Octubre 04, 2015, 10:35:15 PM por penumbra
Puedes usar las variables bbox_top, bbox_bottom, bbox_left y bbox_right para saber si la caja de colisión de un objeto se encuentra dentro de la caja de colisión del otro, pero para que esto funcione siempre y la colisión sea correcta, los sprites tienen que tener muy poco o nada de espacio vacío a su alrededor. Por ejemplo, si se tiene un sprite con un círculo de radio 8 pixeles centrado, pero el sprite mide 64X64, el circulo podría estar totalmente dentro del otro objeto, pero su caja de colisión podría no estarlo.

http://docs.yoyogames.com/source/dadiospice/002_reference/objects%20and%20instances/instances/instance%20properties/bbox_right.html

Otra manera de hacerlo, aunque sería más tarea, seria usar por ejemplo, las funciones collision_line() o collision_point(). Por ejemplo, volviendo a considerar el sprite circular de radio 8 centrado: se podría preguntar si 5 pixeles (zona fuera del círculo) arriba hay colisión, si 5 pixeles a la derecha hay colisión, etc. Una vez verificadas las 4 zonas (u 8, si se quiere más precisión), si todas devolvieron la misma id, es que el objeto con sprite circular está dentro del otro objeto

Gracias por las ideas, al final jugando con las mascaras de los sprites he conseguido el efecto que queria.  Gracias.