Comunidad Game Maker

Ayuda => Preguntas y respuestas => Mensaje iniciado por: nonoroman en Octubre 22, 2014, 02:19:53 PM

Título: PUNTO EXACTO DONDE COLISIONA EL OBJETO.
Publicado por: nonoroman en Octubre 22, 2014, 02:19:53 PM
Buenas, otra vez ando por aqui. jejej. ;)

Ahora traigo la siguiente cuestion.

Cuando un objeto, colisiona con otro, como podemos averiguar el punto exacto del alto y el ancho del objecto donde ha producido la colision, para asi hacer una accion u otra.

Es posible esto??

Espero vuestra ayuda.

;D ;D
Título: Re:PUNTO EXACTO DONDE COLISIONA EL OBJETO.
Publicado por: kostra en Octubre 22, 2014, 02:32:03 PM
bueno, piensa que cuenta el punto donde túpusiste que lo detecta, por ejemplo en la derecha "place_loquesea(x+2,y); 2 por ejemplo, y también cuenta la velocidad en la que vaya el objeto... por ejemplo si un objeto está en la coordenada x = 0; y va a una velocidad de 4, al colisionar con otro que su xoffset esté en 65 por ejemplo, pues de 0, de 4 en 4 siendo esa su velocidad, pues colisionaría estando en 32, contando que fuera un sprite de ancho 32px, pues la colisión la cuenta a partir del último pixel de su mask, según la dirección en la que colisiona, pues estando en la coordenada 32, ya que va de 4 en 4, 32+32 que es su ancho = 64 y en el place_tal pusiste x+2, por lo tanto detecta a la 66 por lo tanto hay 2 píxels que están colisionando, el 66 y el 65... espero haberme explicado, claro que es solo para que entiendas cómo funciona, pues espero que el siguiente te diga una fórmula mágica para saber siempre cual es el punto exacto, yo no sé ni si existe xD
Título: Re:PUNTO EXACTO DONDE COLISIONA EL OBJETO.
Publicado por: penumbra en Octubre 22, 2014, 10:36:38 PM
1. Si quieres algo exacto comenzaré por preguntarte cómo es que manejas las colisiones en tu juego exactamente.

2. Generalmente, tal grado de exactitud no es necesaria el 99% de las veces, porque si quieres usar un sistema que por ejemplo, sepa diferenciar si te han golpeado en la cabeza o en el pecho, hay maneras más rápidas de lograrlo sin tener que calcular distancias y puntos exactos. Yo comenzaría por indicar qué pretendes hacer en mi juego, así es probable que más usuarios tengan una idea y ofrezcan sugerencias.
Título: Re:PUNTO EXACTO DONDE COLISIONA EL OBJETO.
Publicado por: nonoroman en Octubre 23, 2014, 05:53:29 PM
Si Penumbra, eso es lo que busco.

Voy a explicarlo exactamente. El tema es que llevando un vehiculo, en caso de colision voy hacer que este sufra daños y deformaciones en la carroceria, pero esto daños deben de ser en la zona donde se ha producido el choque.

Por ejemplo, si al vehiculo le colisiona otro, por el lado derecho. No voy hacer que se rompa el paragolpes trasero, sino, que mi idea es que el lado derecho unicamente sea la que se deforme.

Para asi darle mas realismo.

Tampoco necesito una exactitud al 100por100 pero si que dividire las partes del coche en varias zonas. Por ejemplo,  delantera, trasera, lateral derecho e izquierdo. Quizas apure un poco mas, pero mas o meno algo asi seria mas que suficiente.

Esto se haria chequeando el ancho y el alto del vehiculo en cada colision, pero que funcion utilizo??

Help me!!!!! jejejjee.
Título: Re:PUNTO EXACTO DONDE COLISIONA EL OBJETO.
Publicado por: kostra en Octubre 23, 2014, 06:25:53 PM
y por qué no montas el coche por partes?, tansolo haces que un objeto invisible con una buena mask sea la que se maneja y todos los demás, que serían las partes, le sigan al compás xd, así todo te sería mucho más fácil ^_^
Título: Re:PUNTO EXACTO DONDE COLISIONA EL OBJETO.
Publicado por: nonoroman en Octubre 23, 2014, 11:02:24 PM
Pero Kostra, el diseño del coche esta en una sola parte.

como dices, deberia desmontar el diseño en varias partes??

y a la hora de la programacion. como trato a todas las partes de una sola vez?? No se, creo que es demadiado complejo.

Yo pensaba en el alto y ancho del coche y controlar esto.

Creo que deberia ser posible.
Título: Re:PUNTO EXACTO DONDE COLISIONA EL OBJETO.
Publicado por: kostra en Octubre 24, 2014, 03:13:02 AM
desmontar en partes un sprite, tampoco es nada del otro mundo xd

y bueno, para montarlo, quizás es algo más costoso la primera tirada, pero luego te facilita el trabajo
lo suyo sería, tener el objeto base, lo que tiene el manejo del coche y tal, este, creará tantos objetos como partes haya (por comodidad de no tener que poner cada parte en cada room) las partes, recomiendo que al cortar la imagen, se mantenga cada una en su posición tal y como estaban en el coche completo, al igual que su punto de origen (el offset), así en esas partes, cada una, o con un parent, le dices que siga al objeto base, manteniendo el mismo ángulo de esta base y posición (la cual, recomiendo dibujar con draw los sprites, para que no haya retraso al seguir la base)

esto.... mesentiende? luego ya en los objeto partes, pones la colisión con la pared, que cambie el sprite a su respectiva parte rota xd y depaso puedes hacer que saque humo cada parte a tu antojo con effects jaja
Título: Re:PUNTO EXACTO DONDE COLISIONA EL OBJETO.
Publicado por: penumbra en Octubre 24, 2014, 08:45:08 AM
Bueno, pero si consultamos el manual, veremos que GM ya incorpora funciones que hacen justamente lo que quieres, calcular colisiones en una determinada zona (circular, elipse, rectangular...) sin recurrir a objetos adicionales.

http://docs.yoyogames.com/source/dadiospice/002_reference/movement%20and%20collisions/collisions/index.html (http://docs.yoyogames.com/source/dadiospice/002_reference/movement%20and%20collisions/collisions/index.html)

por ejemplo, para definir la zona roja como zona de colisión en el sprite con origen en el centro:
(http://sia1.subirimagenes.net/img/2014/10/24/141024084218469959.png)

[gml]var colision = collision_rectangle(x + 7, y - 64, x + 27, y - 42, obj_danio_automovil, false, true)[/gml]
Título: Re:PUNTO EXACTO DONDE COLISIONA EL OBJETO.
Publicado por: nonoroman en Octubre 24, 2014, 05:04:08 PM
oleee penumbra, una cosa asi buscaba.

Voy a probarlo a ver si me funciona.

;D
Título: Re:PUNTO EXACTO DONDE COLISIONA EL OBJETO.
Publicado por: nonoroman en Octubre 24, 2014, 05:15:02 PM
Pero no entiendo bien la funcion;

las coordenadas x1 e y1 pertenecen al coche, y las coordenadas x2 e y2 pertenecen al cuadrado??

el resultado si es verdadero le dara un 1 a la variable colision y si es falso le dara un 0 a la variable colision.

Esto es asi??

???
Título: Re:PUNTO EXACTO DONDE COLISIONA EL OBJETO.
Publicado por: jokin666 en Octubre 24, 2014, 07:23:56 PM
la X1 e Y1 de collision_rectangle indican la esquina superior izquierda, y la X2 e Y2 indican la esquina inferior derecha.

Y la variable guardara la ID del objeto con el que choca, si no choca con nada tendra el valor noone

Si no necesitas la ID del objeto contra el que va a chocar puedes ponerlo simplemente en un IF:

if collision_rectangle(x,y,x+32,y+32,obj_enemigo,0,1){
   // accion cuando hay choque
}
Título: Re:PUNTO EXACTO DONDE COLISIONA EL OBJETO.
Publicado por: kostra en Octubre 24, 2014, 08:57:53 PM
D: lol yo no tenía ni idea de eso jaja, una preguntica, si en el ejemplo ese del coche, usas el rectangle, la colisión la detecta con la misma mask del sprite o genera una mask rectangular con lo que pusiste? no sé si mezplikoh
Título: Re:PUNTO EXACTO DONDE COLISIONA EL OBJETO.
Publicado por: penumbra en Octubre 24, 2014, 09:55:10 PM
Cita de: kostra en Octubre 24, 2014, 08:57:53 PM
D: lol yo no tenía ni idea de eso jaja, una preguntica, si en el ejemplo ese del coche, usas el rectangle, la colisión la detecta con la misma mask del sprite o genera una mask rectangular con lo que pusiste? no sé si mezplikoh

La función genera una zona rectangular de colisión. En esa zona no se buscan colisiones contra cualquier instancia, sólo contra las instancias que corrrespondan al objeto que se indica en la función (el quinto parámetro). En la función puedes especificar si se toma en cuenta la colisión del rectángulo contra la máscara de colisión del objeto que llama la función, en este caso, el sprite del coche. En el ejemplo que puse, esta colisión no se toma en cuenta, pero si quisieras detectarla, el último parámetro de la función lo cambias a true.

Dicho lo anterior, la función crea algo como una nueva máscara de colisión (independiente de la máscara de colisión del objeto que llama la función) en la que se prueba si ciertos objetos/instancias entran en contacto con esa región. En mi caso, en el objeto a detectar casi siempre especifico un objeto padre, para así poder detectar instancias de distintos objetos con un parent en común.
Título: Re:PUNTO EXACTO DONDE COLISIONA EL OBJETO.
Publicado por: nonoroman en Octubre 28, 2014, 10:26:07 PM
Cita de: jokin666 en Octubre 24, 2014, 07:23:56 PM
la X1 e Y1 de collision_rectangle indican la esquina superior izquierda, y la X2 e Y2 indican la esquina inferior derecha.

Y la variable guardara la ID del objeto con el que choca, si no choca con nada tendra el valor noone

Si no necesitas la ID del objeto contra el que va a chocar puedes ponerlo simplemente en un IF:

if collision_rectangle(x,y,x+32,y+32,obj_enemigo,0,1){
   // accion cuando hay choque
}


Vale, la funcion comprueba la colision contra el objeto indicado. Pero, como seria la funcion para una colision con cualquier objeto o instancia???
Título: Re:PUNTO EXACTO DONDE COLISIONA EL OBJETO.
Publicado por: penumbra en Octubre 28, 2014, 10:41:33 PM
Cita de: nonoroman en Octubre 28, 2014, 10:26:07 PM
Vale, la funcion comprueba la colision contra el objeto indicado. Pero, como seria la funcion para una colision con cualquier objeto o instancia???

En la función sólo tienes que cambiar obj_enemigo por all, pero de antemano aclaro que eso PODRÍA darte problemas ya que en cuanto colisione con lo que sea de la instancia que sea, se va a reportar una colisión.

Si eso da problemas, lo mejor es usar un objeto padre que englobe todos los objetos contra los que se quiera colisionar.