Comunidad Game Maker

Ayuda => Preguntas y respuestas => Mensaje iniciado por: sanosuke en Junio 24, 2014, 11:20:14 AM

Título: IA de los enemigos
Publicado por: sanosuke en Junio 24, 2014, 11:20:14 AM
 :GMS:

hola chicos, tengo un problemilla tengo este codigo para las ia´s de los enemigos:
sacado de este foro
//AI
//ATACAR
if instance_number(obj_alien)=0 //si no existe jugador
    {
        atacar= false        //atacar es falso
        global.ataquegranjero = false
    }   
if instance_number(obj_alien)>0//si hay por lo menos un jugador
    {
        if (distance_to_object(obj_alien)<250 //si la distancia al jugador es menor a 250
        and point_direction(x,y,obj_alien.x,obj_alien.y)>direction-45 // y la direction hacia el jugador esta entre los
        and point_direction(x,y,obj_alien.x,obj_alien.y)<direction+45)// 90� del angulo de vision
        //or distance_to_object(obj_alien)<6 // � si esta muy cerca
        then
        {
       
        {
                atacar=true //tiene que ataca
                pasear=false //debe dejar de estar paseando por el mapa
              }
        }
                   
        else //de lo contrario
              {
                if distance_to_object(obj_alien)>180 //si la distancia hacia el jugador es mayor a 200
                atacar=false                      //debe dejar de atacar
                global.ataquegranjero = false
               
              }
}

if atacar=true //si atacar es verdadero
    {
        move_towards_point(obj_alien.x,obj_alien.y,4);//debe moverse hacia el jugador.

        if collision_line (obj_granjero.x, obj_granjero.y, obj_alien.x, obj_alien.y, obj_heno3, true, true)
            {
                atacar = false
                global.ataquegranjero = false
            }

        if collision_line (obj_granjero.x,obj_granjero.y,obj_alien.x,obj_alien.y,obj_heno1,1,1)
            {
                atacar=false
                global.ataquegranjero = false
            }

        if collision_line (obj_granjero.x,obj_granjero.y,obj_alien.x,obj_alien.y,obj_heno2,1,1)
            {
                 atacar=false
                 global.ataquegranjero = false
            }
       
    }



//PASEAR
if  atacar=false //si no esta atacando

    {pasear=true}//puede pasearse por el mapa


if pasear=true //si pasearse es verdadero
    {
        if (xmove<x+1)and(xmove>x-1) and (ymove>y-1) and (ymove<y+1) and move=true //si esta hacia donde deber�a moverse y se puede mover
        {
       
        xmove=round(xstart+random(300)+random(200)) //a donde debe moverse es X un lugar aleatorio
        ymove=round(ystart+random(300)+random(200)) //a donde debe moverse es Y un lugar aleatorio
        move=false // se desactiva mover
        speed=0
        }
        if round(random(10))=10 and move=false // si de la posibilidad se da de 1 en 60
        {
        move=true //puede moverse
        }
    }
if pasear=true and move=true //si pasear esta activada y se puede mover
    {
        move_towards_point(xmove,ymove,1.7);//debe moverse hacia la variables xmove e ymove.
       
    }


el codigo esta en el evento step del enemigo


la mecanica es la siguiente, cuando entro en la linea de vision del enemigo este me ataca (atacar=true) cuando algo interrumpe su linea de vision deja de atacarme, mi personaje puede "poseer" al enemigo pero solo cuando no me esta atacando, es decir si voy por detras del enemigo y pulso una tecla la instancia enemigo se destruye y la instancia de mi personaje cambia a la que yo quiero.

todo funciona perfecto, salvo cuando hay mas de un enemigo en escena.

este codigo va en la colision del personaje con el enemigo y es el que hace que cambie mi instancia.
if keyboard_check(vk_space) 
{
    if global.ataquegranjero = false
        {
        instance_change (obj_granjero_pos,false)
        view_visible[0] = 0
        view_visible[1] = 1
        }


resumiendo cuando hay dos o mas enemigos en escena la variable global.ataquegranjero siempre es false, asi que si un enemigo me esta atacando y otro no, la instancia del personaje cambia pero el enemigo no es destruido.
no se si me he explicado bien ???

alguna sugerencia para evitar este problema?
Título: Re:IA de los enemigos
Publicado por: Guacusio en Junio 24, 2014, 03:10:09 PM
¿Dónde destruyes la instancia enemigo?
Título: Re:IA de los enemigos
Publicado por: Clamud en Junio 24, 2014, 04:40:28 PM
Hola. Si entendí bien, el enemigo es obj_alien y el jugador es obj_granjero.
El problema está en que el objeto jugador responde a las variables obj_alien.x y obj_alien.y que son las coordenadas de la primera instancia creada de obj_alien, así que aunque tengas muchos enemigos cercanos, si la primera instancia creada está muy lejos, no cambiará su comportamiento.
Para solucionarlo deberías conocer el id de la instancia más cercana usando la función instance_nearest(). Podrías usar un código como éste:
[gml]alien_cercano = instance_nearest( x, y, obj_alien );[/gml]
Entonces debes modificar tu script, cambiando "obj_alien" con "(alien_cercano)" [conservando los paréntesis].
Espero que sea entendible.
Título: Re:IA de los enemigos
Publicado por: sanosuke en Junio 24, 2014, 05:26:30 PM
en realidad el obj_alien es el jugador y el obj_granjero el enemigo.
sabiendo esto deberia de usar el codigo alien_cercano = instance_nearest( x, y, obj_alien );
cambiando el "obj_alien" por "obj_granjero" ?

CitarEl problema está en que el objeto jugador responde a las variables obj_alien.x y obj_alien.y que son las coordenadas de la primera instancia creada de obj_alien
si, responde por que en realidad es el personaje.
Título: Re:IA de los enemigos
Publicado por: elviskelley en Junio 25, 2014, 04:17:18 AM
no lo que debes es guardar la Id del mas cercano. algo como; alien_cercano = instance_nearest( x, y, obj_alien ); y donde haces mencion a esto obj_alien usas  esto alien_cercano  asi sea en coordenadas alien_cercano.x ...
Pero tambien recomiendo reiniciar las variables atacar y pasear y claro la id en el event bengind step lo que haces es que en el event Benging Step colocas;  atacar=false; pasear=false; alien_cercano=0; Ha modo de reiniciarlas... Esto para evitar que siemrpe tenga guardada la misma accion aun despues de destruida la instancia, es mejor que actualice la informacion segun la situacion actual... por eso lo del reinicio e variables en Benging step-
Título: Re:IA de los enemigos
Publicado por: Guacusio en Junio 25, 2014, 07:23:29 AM
Perdona que insista, pero no entiendo dónde es que destruyes la instancia enemigo cuando el personaje cambia de tipo de objeto a obj_granjero_pos. Entiendo que tu problema es que la instancia enemigo no se destruye.