Comunidad Game Maker

Ayuda => Preguntas y respuestas => Mensaje iniciado por: EnDark2000 en Noviembre 19, 2013, 06:10:37 PM

Título: Inteligencia Artificial Avanzada
Publicado por: EnDark2000 en Noviembre 19, 2013, 06:10:37 PM
Muy buenas, makeros.
En este nuevo tema que hago me gustaria pediros una gran ayuda con la IA de mi juego.

Empezare explicar de que va mi proyecto para que podáis pillar la idea que tengo yo en mente.

    Basicamente es un juego TDS(Top Down Shooter), sin embargo tiene parte de RPG, asta ahora aun no tenemos hecha la historia pero yo, que soy el programador de nuestro equipo, necesito tener algunas cosas preparadas para cuando empecemos a desarrollar el juego, sepa el funcionamiento de todo lo que incluye.
    Como dije es un TDS y los controles son con "W", "S" y con el raton. Con "W" se mueve el personaje hacia la posición del ratón y con la "S", Se aleja de el.
    Como en todo Shooter deben de haber enemigos, en este también habrán y seguramente sean mas que muchos. Por ahora estoy tratando de hacer un patrón básico de IA para los enemigos que disparen, para así, poder copiar y pegarlo en todos los enemigos que usen arma de rango y modificarlo a mi gusto. Para los enemigos que solo atacan cuerpo a cuerpo supongo que sera muy parecido así que teniendo uno creo que que me las apañare yo solo.

    Por ahora tengo hecho esto de acá:
obj_enemy
CREATE EVENT:
canshoot = 0;
hp = 100;
alert = 0;


STEP EVENT:
canshoot -=1;
if (collision_line(x,y,obj_Player.x,obj_Player.y,obj_wall,true,true)<0)&&(distance_to_object(obj_Player)<=200){
    alert += 10;
    if (alert >= 1000){alert = 1000;}
    if (alert >= 300) && (alert <= 1000){
        if canshoot < 0{
            canshoot = 20;
            instance_create(x,y,obj_bullet_enemy);
        }
    }
   
}
if (distance_to_object(obj_Player)> 0)&&(alert >=300 && alert <=1000 ){
    if (point_distance(x,y,obj_Player.x,obj_Player.y) <= 32){ exit; }
    if not(collision_rectangle((x+cos(degtorad(direction)))+14,y-14,(x+cos(degtorad(direction)))-14,y+14,obj_wall,0,0)){
        x +=cos(degtorad(direction))
    }
    if not(collision_rectangle(x-14,(y-sin(degtorad(direction)))+14,x+14,(y-sin(degtorad(direction)))-14,obj_wall,0,0)){
        y -=sin(degtorad(direction))
    }
    image_angle = direction;
}
       
       
if not (collision_line(x,y,obj_Player.x,obj_Player.y,obj_wall,true,true)<0){alert -=5;}

END STEP EVENT:
direction = point_direction(x,y,obj_Player.x,obj_Player.y);

COLLISSION EVENT (obj_bullet_P_dream)(Bala de la torreta que tambien funciona mal pero eso intentare arreglarlo yo solo jeje)
if (hp >> 0)&&(hp <= 100){
    hp -=5;
}else{
    instance_destroy();
}


Este ultimo lo pongo por si alguien sabe alguna manera de ahorrar código, pero no afecta en absoluto en el funcionamiento de la IA por ahora.

Bien este fue el objeto enemigo, ahora pasemos al objeto jugador (obj_Player):
STEP EVENT:
if (keyboard_check(ord('W'))){
    if (point_distance(x,y,mouse_x,mouse_y) <= 32){ exit; }
    if not(collision_rectangle((x+cos(degtorad(direction))*3)+14,y-14,(x+cos(degtorad(direction))*3)-14,y+14,obj_wall,0,0)){
        x +=cos(degtorad(direction))*3;
    }
    if not(collision_rectangle(x-14,(y-sin(degtorad(direction))*3)+14,x+14,(y-sin(degtorad(direction))*3)-14,obj_wall,0,0)){
        y -=sin(degtorad(direction))*3;
    }
}
if (keyboard_check(ord('S'))){
    if not(collision_rectangle((x-cos(degtorad(direction))*3)+14,y-14,(x-cos(degtorad(direction))*3)-14,y+14,obj_wall,0,0)){
        x -=cos(degtorad(direction))*3;
    }
    if not(collision_rectangle(x-14,(y+sin(degtorad(direction))*3)+14,x+14,(y+sin(degtorad(direction))*3)-14,obj_wall,0,0)){
        y +=sin(degtorad(direction))*3;
    }
}


END STEP EVENT:
direction = point_direction(x,y,mouse_x,mouse_y);
image_angle = direction;


Objeto muro (obj_wall):
simplemente es solido y no tiene ningún evento


    Bueno estos fueron los códigos que de alguna manera influyen en la IA del enemigo. Ahora al problema que tengo:
El problema es el siguente, cuando el enemigo me ve, la variable alert empieza a subir asta llegar a 1000, que es, cuando el enemigo se da cuenta de que me tiene que disparar y seguir. Si el enemigo no me ve empezara a bajar la variable alert y cuando esta llega a 300 el enemigo deja de seguirme. Asta aquí, bien, todo funciona correctamente. Lo que pasa es que el enemigo al seguirme se estanca en las paredes y no tiene la capacidad de rodearlas e ir en la dirección en la que se fue el personaje. Dicho esto, necesito que alguien me de una solución o algún consejo que me pueda ayudar con este problema. Aparte de que necesito que el enemigo rodee las paredes, necesito que no las toque mientras sigue al personaje, cosa que no veo manera de hacerla. Intente pararme a pensar unos días e ir probando pero es algo que no conseguí. Si hay que cambiar todo el código, bien, pero necesito una solución y espero que haya gente que sepa ayudarme con este problema.

Dejare un GMZ Para que puedan ver lo que les quiero decir :)

Gracias de antemano, y me despido :)
Salu2
Título: Re:Inteligencia Artificial Avanzada
Publicado por: romon_28 en Noviembre 20, 2013, 02:36:53 PM
tenes que usar los "mp_grid..." te pase un ejemplo en  :GM8: espero que lo puedas abrir
Título: Re:Inteligencia Artificial Avanzada
Publicado por: EnDark2000 en Noviembre 21, 2013, 08:17:59 PM
Gracias por la ayuda aun que soy algo nuevo en el gml e hice el mismo script en mi proyecto y use el mismo codigo en los eventos del enemigo. El problema es que no me funciona, simplemente se queda parado el enemigo y no hace nada :S

PD: encerré el código que tenia antes en /*...*/
Título: Re:Inteligencia Artificial Avanzada
Publicado por: EnDark2000 en Noviembre 25, 2013, 07:06:59 PM
Cita de: romon_28 en Noviembre 20, 2013, 02:36:53 PM
tenes que usar los "mp_grid..." te pase un ejemplo en  :GM8: espero que lo puedas abrir
Ok solucione yo solo el problema de que no se mueva pero no consigo entender como funciona el script exactamente :( si puedes explicármelo te lo agradecería ya que si no se el funcionamiento, no podre usarlo bien :(
Salu2
Título: Re:Inteligencia Artificial Avanzada
Publicado por: jmbs19 en Noviembre 26, 2013, 02:56:13 PM
podrias usar el "mp_potential_step" este lo que te va a pedir es a donde quieres que vaya el objeto, la velocidad de este y si quieres que evite objetos solidos o todos, yo personalmente uso este, devido a que estoy programando en perspectiva isometrica y no me sirve muy bien el mp_grid, ahora el mp_grid es mejor debido a que busca el camino mas cercano, mientras que el mp_potential_step busca ir directamente al objetivo, y si se encuentra un obstaculo lo rodea.
Título: Re:Inteligencia Artificial Avanzada
Publicado por: EnDark2000 en Noviembre 26, 2013, 04:38:20 PM
Cita de: jmbs19 en Noviembre 26, 2013, 02:56:13 PM
podrias usar el "mp_potential_step" este lo que te va a pedir es a donde quieres que vaya el objeto, la velocidad de este y si quieres que evite objetos solidos o todos, yo personalmente uso este, devido a que estoy programando en perspectiva isometrica y no me sirve muy bien el mp_grid, ahora el mp_grid es mejor debido a que busca el camino mas cercano, mientras que el mp_potential_step busca ir directamente al objetivo, y si se encuentra un obstaculo lo rodea.
El caso es que soy demasiado novato y no entiendo el funcionamiento de casi ninguna función y variable de gml. Estaría muy bien que alguien de esta comunidad que sepa, no todo, pero mucho de gml haga alguna serie de videotutoriales o tutoriales normales. Por que leyendo el manual uno se aburre y puede no entender algunas cosas como en mi caso, que soy extrangero, hay muchas cosas que se mencionan en el manual que no consigo entender. Un ejemplo seria un post que publique hace ya unos buenos días y nadie me responde mi duda :(, ni si quiera la leen. En fin, estaría realmente bien eso, que alguien se molestara por ayudar a los demás :)