Hola estoy programando la IA de un enemigo, en la cual el mismo utiliza un sistema de path con el cual me sigue y esquiva los objetos solidos, dispara al jugador y cuando este se alejo un poco este deja de seguirlo, ahora lo que quiero hacer pero no se me ocurre como es que cuando el enemigo ya no este dentro se regresa a la posicion en donde estaba inicialmente y que de ser posible haga un pequeño patrullaje por la zona. desde ya mil gracias.-
Tenés que dividir la ia en estados, en el primer estado patrulla y en el segundo sigue al jugador, esto lo hacés facil mediante variables. Ahora, en el estado de patrullar tenés que ponerle que se x=xstart y y=ystart entonces activa una variable que comienza el movimiento hacia el segundo punto donde debe patrullar (guardado en variables), y si se encuentra en el segundo punto la variable cambia y comienza a moverse hacia el primer punto, si no llegás a entender pasame el gmk, lo retoco un poco y listo
Saludos!
muchas gracias por la respuesta. te comento como funciona en codigo del enemigo:
en el evento create uso esto:
//VARIABLES PRINCIPALES
image_speed=0.50
Creado="No"//Permite Realizar Cambios Sin Modificar Todo Los Objetos De Misma Clase
Accion="Parado"//Accion Que Esta Realizando
Herir="No"//Permite Que Se Lo Dañe Con Amnimacion De Ves En Cuando
Z=y//Posicion De Profundidad Y Altura
//Pocicion De Ataque
XPos=0
YPos=0
Jugador="COM"//Se Puede Establecer El Jugador O La PC
SaludMax=100//Salud Maxima
Salud=SaludMax//Salud
Escudo=SaludMax//Escudo
//Animación
AnimIni=0//Saltea Al Frame Inicial De La Animación
AnimFrame=0//Frame De La Animacion En El Que Esta
AnimFin=0//Saltea Al Frame Final De La Animación
Frames=15//La cantidad De Frames Que Saltea En Cada Animacion
Multi=0//Miltiplica La Cantidad De Frames Que Saltea
//Datos Arma
Arma="Metralla"
CadenciaMax=50//Velocidad De Disparo Maxima
Cadencia=0//Velocidad De Disparo
CapacidadMax=30//Capacidad De Municion Maxima
Capacidad=0//Capacidad De Municion
Municion=100//Municion Total Maxima
CargaMax=20//Velocidad De Carga Maxima
Carga=CargaMax//Velocidad De Carga
//Inteligencia Artificial
IA="Ninguna"
var size;
size=16
grilla=mp_grid_create(0,0,room_width/size,room_height/size,size,size)
mp_grid_add_instances(grilla,Caja,0)
ruta=path_add()
en el evento step:
if vidas<1
{show_message("You Winner"); game_restart();}
//si no tiene vidas el objPersonaje osea tu ganas.
if instance_exists(Personaje)
{
direction=point_direction(x,y,Personaje.x,Personaje.y)
//Profundidad Del Objeto
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
depth=-Z;Z=y
Scr_MovEnemigo();
Scr_AtaqueEnemigo();
}
//solo si existe el objPersonaje el ejecuta los script.
//se compara si existe ya que al destruirlo podria dar algun error.
//Scr_MovEnemigo
if distance_to_point(Personaje.x,Personaje.y)<400 and distance_to_point(Personaje.x,Personaje.y)>150{
path_end()
Accion="Parado"
if mp_grid_path(grilla,ruta,x,y,Personaje.x,Personaje.y,1)=1 path_start(ruta,6,0,1)
Accion="Correr"
}
else {
speed=0;
path_end();
if distance_to_point(Personaje.x,Personaje.y)>400 and Accion="Disparar" {
Accion="Parado";
}else { Accion="Disparar"; }
}
//////////////////////////////////////////////////////////////
//Se Destruye La Instancia Y Crea La Sangre
if Salud<=0{
repeat(3+random(3))instance_create(x-20+random(40),y-20+random(40),Sangre)
repeat(1+random(2))instance_create(x-20+random(40),y-20+random(40),Sangre)
instance_destroy()}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//HERIDO
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//Accion Que Recibe Cuando Es Dañado...
if Accion="Herido"{speed=0
//Se Queda Parado Si Termina La Animación
if image_index>=AnimFin+Frames*Multi{Accion="Parado"}
}
//////////
////Scr_AtaqueEnemigo()
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//Recargar
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//Recarga Si Se Quedo Sin Balas
if Carga>=CargaMax and Capacidad<=0{Carga=0
if Arma="Metralla"{sound_play(S_Recarga)}
if Arma="Lanza Misiles"{sound_play(S_Recarga2)}
}
//Cargando...
if Carga<CargaMax{Carga+=1}
//Ya Esta Cargada La Municion
if Carga>=CargaMax and Capacidad<=0{Carga=CargaMax;Capacidad=CapacidadMax;Municion-=Capacidad}
//DISPARAR
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
if Accion="Disparar"{
//Cadencia De Disparo
if Cadencia<CadenciaMax and Capacidad>0{Cadencia+=1}
//Dispara Solo Cuando Es Determenido Frame
if image_index=AnimIni+Frames*Multi+4{speed=0
if Cadencia>=CadenciaMax{Cadencia=0;Capacidad-=1
//Metralla_________________________________________________________________________________________________________
if Arma="Metralla"{
instance_create(x+60*cos(degtorad(direction)),y-90-30*sin(degtorad(direction)),Bala)
with(Bala){if Creado="No"{x=Personaje.x;y=Personaje.y;depth=Personaje.depth-10;Creado="Si"}}
}
//Lanza Misiles____________________________________________________________________________________________________
//if Arma="Lanza Misiles"{
//instance_create(x+60*cos(degtorad(direction)),y-90-30*sin(degtorad(direction)),Misil)
//with(Misil){if Creado="No"{XPos=other.XPos;YPos=other.YPos;depth=other.depth-10;ID=other.id;Creado="Si"}}}
}}
//Se Queda Parado Si Termina La Animación
if image_index>=AnimFin+Frames*Multi{Accion="Parado"}
}
y por ultimo en el evento end step ejecuta este script:
Scr_EndStepEnemigo();
el cual lo unico q hace es verificar y asignar la animacion y sprites acordes a cada accion y la direccion, los cuales son:
//aca va el codigo de cada direccion, pero no lo puse porq es muy largo.-
if Accion="Parado"{AnimIni=0;AnimFin=14.25;Frames=15}
if Accion="Recargar"{AnimIni=0;AnimFin=14.25;Frames=15}
if Accion="Correr"{AnimIni=120;AnimFin=134.25;Frames=15}
if Accion="Disparar"{AnimIni=240;AnimFin=248.25;Frames=9}
if Accion="Herido"{AnimIni=312;AnimFin=324.25;Frames=13}
bueno y eso es todo de ahy en mas no se me ocurre como implementar lo que consulte. gracias
Que quilombo de código xD
Mejor pasame editable por pm o msn, me da pachorra ponerme a buscar entre todo eso, además de que no podría testear que lo que pongo funciona
ACA TE PASO EL CODIGO. SI LO SOLUCIONAS JOYA. GRACIAS.-
Hola texic veo q aun no me has respondido decime has tenido algun problema con el codigo o con el archivo que subi. por favor avisame es importante. gracias.-
Tsss, sinceramente no pude con tu código, es una maraña de cosas, eso del path start y path end por acá y por allá afecta todo el código y no logré que se activara la función que hacía que el enemigo patrullara, le tendría que dedicar más tiempo revisando, pero he estado ocupado cursando y con lo de ver las donaciones por movil, cuando pueda le echo una segunda mirada, mientras tanto probá vos a ver q te sale
Ok. Texic igual mil gracias si tenes algo avisame igual yo voy seguir probando si. de nuevo muchas gracias.- a y te agregue al mesenger un abrazo.
Hola Texic te comento que solo unos minutos despues de responderte me puse a pensar un poco y lo solucione, lo unico que hice fue crear dos variables, una que guarde el valor inicial de x y otra el de y del enemigo ni bien arranca el juego y luego compruebo que si el jugador se aleja lo suficiente utilizo este codigo:
if Regresar=1 {
if mp_grid_path(grilla,ruta,x,y,PosicionX,PosicionY,1)=1 {path_start(ruta,6,0,1)}
}
donde Regresar unicamente comprueba cuando debe regresar en este caso si es 1 (esta lejos) regresa a la posicion inicial.-
lo probe y funciona perfecto lo unico que me queda implementar ahora q si se te ocurre alguna idea te agradeceria es el tema de que cuando vuelva a su posicion inicial haga un pequeño patrullaje. gracias.-
Esa es la parte jodida, hacé que cuando esté a cierta distancia de la posiciónx y posicióny regresar se ponga en 2 y cuando regresar se ponga en 2 realize el patrullaje, ya sea moviéndose a una nueva posición previamente declarada o un path de patrullaje en base a la posición inicial del enemigo
Ok. voy a seguir probando y decime texic tenes alguna idea de como podria hacer para que se mueva de manera aleatoria, pero sin alejarse demasiado?
Podés crear el punto de patrulla en un rango a partir de la posición inicial y que vaya cambiando. Suponiendo que las variables que almacenan la x e y a patrullar sean patrolx y patroly sería
dir=irandom(360) //dirección aleatoria en 360º
patrolx=lengthdir_x(irandom_range(200,400),dir) //mínima y máxima distancia de patrulla
patroly=lengthdir_y(irandom_range(200,400),dir) //idem