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.
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.
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
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;
}
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
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.
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]