Bueno, estoy haciendo que mi enemigo me detecto a uno de mis soldados, y lo ataque con collision ellipse, pero aquí atacaría al primero que se encontrase.
Lo que me gustaría es hacer que si se encuentra a varios, haga una comprobación, y ataque al que cumpla un criterio. No se hacer que salte al siguiente que collisiona. La comprobación si.
a = collision_ellipse(x,y,x2,y2,objAmigo, false,false) //aquí puede detectar hasta 5.
if a > 0 {if a.Vida < daño {scratake(id,idamigo)} else {aquí, que salte al siguiente collisionado.}
Para que se puedan detectar varias colisiones de la instancia "enemigo" con las instancias "amigo", la colisión se debe determinar desde las instancias "amigo". El código se podría colocar dentro del objeto amigo, o usar un with en el objeto enemigo:
[gml]
with( obAmigo )
{
if collision_ellipse( x1,y1, x2,y2, other.id, false,false )
if( Vida < other.dano ) { scratake(other.id,id); break; }
}
[/gml]
El break termina la búsqueda si es que ya se realizó un ataque.
Gracias, o no lo entiendo, o no me explique bien, o no le encuentro utilidad.
Me explico mejor.
Los enemigos tienes una variable que la distancia de ataque. Puede ser 1,2,3,4, etcc. Lo que quiero es que me detecte si tienen amigos dentro de la distancia de ataque, esto lo hago con collion_elipse, pero lo malo, es que ha veces me detecta unos que no están en el tablero de juego, están en otra zona esperando y tal. Y lo que quiero es poder comprobar si es alguno de estos, y si lo es, que vaya al siguiente detectado. Si no tendré que diseñar otro sistema de collision.
No entendí bien, ¿porqué si el enemigo ha encontrado un contrincante pasa al siguiente?
Si la detección se hace en zonas inesperadas es porque las coordenadas de la elipse no son correctas.
Es que en el juego, hay una zona de espera, para poner a mis criaturas en el juego. Entonces no quiero que colisiones con estas.
Porque si un enemigo tiene 4 de distancia de ataque, abarca casi media pantalla, y alguno que lo tiene, entonces cuando esta cerca, me los detecta como amigos y les ataca, aunque no estén en juego.
Me estoy acordando ahora, que hay algo de si es solido o no el objeto, para el tema de colisiones, quizás podría probar por hay, que funciones detectas los solidos y cuales no??, Asi cuando ya los ponga en juego, le activo el solido y que los detecte.
Puedes usar la variable solid, pero sólo tiene utilidad si se usa un evento de colisión o con las funciones de movimiento. En las funciones collision_ no se toma en cuenta si las instancias son sólidas. Otra opción es crear una variable que indique si la instancia está en juego:
[gml]
with( obAmigo )
{
if( en_juego )
if( collision_ellipse( x1,y1, x2,y2, other.id, false,false ) )
if( vida < other.dano ) { scratake(other.id,id); break; }
}
[/gml]