Comunidad Game Maker

Ayuda => Preguntas y respuestas => Mensaje iniciado por: Black_Cat en Mayo 08, 2016, 10:48:07 PM

Título: Hacer que mi IA plataformas salte(Esquive) un disparo
Publicado por: Black_Cat en Mayo 08, 2016, 10:48:07 PM
holaaa, estoy desarrollando un juego en donde hay una mascota que puede dispararle a los enemigos.
mi principal problema es el diseño de una iA que pueda esquivar el disparo:

bueno básicamente lo que tengo programado, es el mejor de los casos. Que la mascota tire y el enemigo salte, efectivamente:

(http://i1244.photobucket.com/albums/gg569/Gato-San/caso_bueno_zpssz5bf5q3.png) (http://s1244.photobucket.com/user/Gato-San/media/caso_bueno_zpssz5bf5q3.png.html)

bueno, el codigo que uso es lo que sigue:

[GML]

if (saltar){
    y -= 4;
    vspeed = -8;
    hspeed = 0;
    saltar = false;
    puede_saltar = false;
    alarm[0] = 30;
}


if (distance_to_object(disparo_normal) < 80){
   
    if (puede_saltar)
        saltar = true;       
}


if (place_free(x,y+1)){
    gravity = 0.5;
}[/GML]

a grandes rasgos hace que el enemigo salte, si lo tiene permitido, cuando la bala esta muy cerca.
Bien hasta ahí no hay problemas con que salte si va a chocar con un disparo. Tengo dos problemas:

caso 1:
(http://i1244.photobucket.com/albums/gg569/Gato-San/caso_malo_zpsmrfyk1u7.png) (http://s1244.photobucket.com/user/Gato-San/media/caso_malo_zpsmrfyk1u7.png.html)

acá el enemigo salta de todas maneras, aunque la bala no vaya a impactarlo directamente. Esto quiere decir que la bala le debería pasar por encima de la cabeza y no deberia saltar.
Basicamente la IA comete suicidio XD

caso 2:

(http://i1244.photobucket.com/albums/gg569/Gato-San/caso_malo2_zpsj21k09mv.png) (http://s1244.photobucket.com/user/Gato-San/media/caso_malo2_zpsj21k09mv.png.html)

basicamente es una derivacion del primero. El enemigo salta aunque no este en peligro. De hecho, salta solo porque el disparo esta cerca.

Entonces resumiendo: El enemigo salta solo porque la bala esta cerca. Esto tengo entendido que es por el uso de distance_to_object(...)

Ahora, yo quisiera poder obtener la id del disparo que va a matar al enemigo en cuestion para poder operarla correctamente. Por ejemplo, ya que tengo la ID, puedo ver si esta por debajo de la pared.
Pero el inconveniente es que distance_to_object(...) devuelve un real, o bien, la distancia entre los objetos.

¿Cómo podría solucionar estos inconvenientes?

saludos :D
Título: Re:Hacer que mi IA plataformas salte(Esquive) un disparo
Publicado por: bygdle en Mayo 08, 2016, 10:54:26 PM
La mágica collision_rectangle() solucionará tu problema sin problemas(?) xD
En vez de detectar la distancia de las balas al enemigo, deberías comprobar si alguna bala está chocando directamente (o si va a chocar) con el enemigo. Algo así:
[gml]
rango = 160; //La distancia a la que detectará las balas, de un solo lado
var col = collision_rectangle(x - rango, y, x + sprite_width+rango, y + sprite_height, bala, false, true); //Buscamos balas que vayan a chocar. Imaginando que las coordenadas del sprite del enemigo son 0,0
if col != noone {//Si una bala va a chocar
    //Saltar
}
[/gml]
Título: Re:Hacer que mi IA plataformas salte(Esquive) un disparo
Publicado por: Black_Cat en Mayo 08, 2016, 11:07:38 PM
bueno, eso solucionó el problema mas rápido de lo que tenia pensado XD

tenia en mente usar el id para calcular si habia paredes de por medio o si la altura del disparo era mayor al enemigo :P

Aunque se dan todavía casos como expuesto en la imagen del adjunto.
Creo que sencillamente se puede solucionar detectando la direccion del disparo.

gracias! :D
Título: Re:Hacer que mi IA plataformas salte(Esquive) un disparo
Publicado por: bygdle en Mayo 08, 2016, 11:11:03 PM
Creo que con esto se arregla:
[gml]
//Dentro del if anterior
if sign(col.hspeed) == -sign(col.x - x)
    //Saltar
[/gml]