Comunidad Game Maker

Ayuda => Preguntas y respuestas => Mensaje iniciado por: saruman en Octubre 04, 2015, 07:23:30 PM

Título: (RESUELTO)como detectar colisión una sola vez con el mismo objeto?
Publicado por: saruman en Octubre 04, 2015, 07:23:30 PM
me gustaría saber como puedo hacer que un objeto detecte una colisión pero solo una vez con ese objeto.
básicamente esto:
si el objeto A colisiona con UN objeto B la variable (variable cualquiera) += 1, esto solo pasara una ves con este objeto B, pero si colisiona con otro objeto B que no sea el anterior a la variable cualquiera se le vuelve a sumar 1.
pero si el objeto B que ya colisiono con un objeto A buelve a colisionar con otro objeto A a la variable cualquiera de este objeto A se le suma 1
espero que se entienda lo que trato de explicar, les agradecería mucho si me ayudaran.
Título: Re:como detectar colisión una sola vez con el mismo objeto?
Publicado por: Jaume en Octubre 04, 2015, 07:42:23 PM
Hola, se me ocurren un par de cosas aunque hace poco que estoy con GM.  Puedes convertir el objeto B en un objeto C con las mismas propiedades pero sin el evento colision con A.
O puedes poner una variable en el objeto B tipo Colisionado Si/No.  Y controlar que cuando colisione si es No sume 1 y si es Si no haga nada.

No se si me explico.  Aunque por aqui hay gente que seguro te da mejores respuestas.
Título: Re:como detectar colisión una sola vez con el mismo objeto?
Publicado por: saruman en Octubre 04, 2015, 07:57:06 PM
Cita de: Jaume en Octubre 04, 2015, 07:42:23 PM
Hola, se me ocurren un par de cosas aunque hace poco que estoy con GM.  Puedes convertir el objeto B en un objeto C con las mismas propiedades pero sin el evento colision con A.
O puedes poner una variable en el objeto B tipo Colisionado Si/No.  Y controlar que cuando colisione si es No sume 1 y si es Si no haga nada.

No se si me explico.  Aunque por aqui hay gente que seguro te da mejores respuestas.

el problema es que existen barios objetos A y B, asi que no creo que un sistema asi funcione, pero igual gracias
Título: Re:como detectar colisión una sola vez con el mismo objeto?
Publicado por: WalterSit02 en Octubre 04, 2015, 08:08:22 PM
Se me ocurre algo asi.
en el evento create del objeto B puedes poner algo como
Tocado = false;

le creas un evento de colision al objeto B cuando toca el objeto A.
el codigo de colision seria algo como esto:


if Tocado = false {
other.Variable+=1;}

Tocado = true;


Espero que te sirva


Editado: si vas a tener muchos objetos B creo que seria mas optimo que solo el objeto A verifique las colisiones. asi que te dejo esta segunda opcion:
el evento create del objeto B sigue igual, pero no le creas un evento de colision.
en cambio en el objeto A creas un evento de colision para cuando toca el objeto B y le pones este codigo:


if other.Tocado=false {
Variable+=1;
other.Tocado=true;
}


Título: Re:como detectar colisión una sola vez con el mismo objeto?
Publicado por: saruman en Octubre 04, 2015, 08:13:29 PM
Cita de: WalterSit02 en Octubre 04, 2015, 08:08:22 PM
Se me ocurre algo asi.
en el evento create del objeto B puedes poner algo como
Tocado = false;

le creas un evento de colision al objeto B cuando toca el objeto A.
el codigo de colision seria algo como esto:


if Tocado = false {
other.Variable+=1;}

Tocado = true;


Espero que te sirva

el problema es que si el objeto B colisiona con otro objeto A el objeto B ya no le sumaria a la variable de este objeto A nuevo
Título: Re:como detectar colisión una sola vez con el mismo objeto?
Publicado por: WalterSit02 en Octubre 04, 2015, 08:36:46 PM
Ya encontre una manera a lo que pides... no es optima si al final van a haber muchos objetos B, pero funciona.
en este caso ya no se requiere ningun codigo en el objeto B

evento create del objeto A:
[gml]
Total=0;//total de objetos B con los que se colisiono (dejar en 0)
Colisionados[0]=0;//dejamos el primer index en 0 para que no dee error al verificar el array por primera vez.
Variable=0;//esta variable la cambias por lo que quieras
[/gml]

evento de colision del objeto A contra el objeto B

[gml]
for (i = 0; i <= Total; i+=1){//bucle para revisar las colisiones que se efectuaron hasta ahora
if (Colisionados == other.id) exit; //si ya colisiono con ese objeto B nos salimos del evento colision
if (i = Total){ // si llegamos al final del bucle y no hubo una colision con ese objeto hacemos lo siguiente:
Total+=1;
Colisionados[Total] = other.id;
Variable+=1;}
}
[/gml]

Espero que se entienda, Suerte!

Editado: se que es mas optimo hacer esto mismo pero con ds_map o ds_list, el problema es que no se usarlos bien xD si tu o un user del foro lo adapta para que use listas, va a ser mucho mas optimo si estamos hablando de cientos de objetos.

Título: Re:como detectar colisión una sola vez con el mismo objeto?
Publicado por: Clamud en Octubre 04, 2015, 10:16:02 PM
Esta es la versión con listas.

Evento Create de objeto A
[gml]
colision = ds_list_create(); //crear lista
[/gml]

Evento colisión de objeto A con objeto B
[gml]
if( ds_list_find_index(colision,other.id) < 0 )
{ //si la instacia colisionada no se encuentra en la lista
    ds_list_add(colision,other.id) //agregar id
    variable += 1; //incrementar variable
}
[/gml]