Hola makeros, tengo algo que preguntaros y es lo siguente:
¿Como hago para que un enemigo mire en la dirección que vaya? No quiero que mire en la dirección de mi personaje porque
si lo esta persiguiendo y el personaje gira y se esconde detrás de una pared, el enemigo no puede seguir mirandole al personaje, tiene que mirar recto hacia donde va y cuando le toque girar también, se gire el en la dirección corespondiente.
Gracias de antemano y me despido
Salu2
PD: Por que nadie me hace caso? D:
Nadie sabe? esto lleva casi 1 semana aquí :(
Antes que nada, para poder contestar correctamente tu pregunta necesitaríamos saber el código de IA que tiene el NPC y ver como actúa tu NPC, después de eso es cuestión de tocar un poco el código hasta que quede funcionando que no creo que sea tan complicado.
No entiendo bien la pregunta, ¿quieres que siempre mire el enemigo a tu personaje y cuando haya algo de por medio no?
si este es tu caso, podrías almacenar la posición de ambos y que el enemigo gire en la dirección en la que tu personaje se encuentra
esto en el enemigo (step):
var dd;
global.Player_x = personaje.x
global.Player_y= personaje.y
//comprobamos si entre el enemigo y el personaje (player) existe algo, como una pared, que tendras que especificar en "obj_solid"
if collision_line( x, y, global.Player_x, global.Player_y, obj_solid, false, false )
{
go = false
}
else {go = true}
//con esto compruebas si puedes ir (if go = true) pues te mueves hacia el enemigo y te giras...
if go
{
move_towards_point(global.Player_x, global.Player_y, speed);
//con esto gira hacia donde este tu personaje
dd = ((((point_direction(x, y, global.Player_x, global.Player_y) - image_angle) mod 360) + 540) mod 360) - 180;
image_angle += min(abs(dd), 5) * sign(dd);
}
Bueno mas o menos necesito lo que ha dicho ulises pero que si hay algo de por medio, no es que no mire al personaje si no que mire en la dirección que va. este es mi código que encima va un poco mal :(
CREATE
image_angle=random(360)
pasear=0;//crea la variable pasear
atacar=0;//crea la variable atacar
xmove=xstart;// el lugar a donde debe es hacia la posicion del comienzo
ymove=ystart;//el lugar a donde debe es hacia la posicion del comienzo
move=true; // se puede mover
image_single=1;//seteamos que el sprite del objeto
//sea la pirmer imagen de la animación
r1=0;
r2=0;
ALARM 0
atacar = false;
STEP
///IA
//MANEJO DE SPRITE
image_angle=direction //la imagen rota conforme a la direcion del objeto
//AI
//ATACAR
if instance_number(obj_Player)=0 //si no existe jugador
{
atacar=false //atacar es falso
}
if instance_number(obj_Player)>0//si hay por lo menos un jugador
{
if (distance_to_object(obj_Player)<700 //si la distancia al jugador es menor a 700
and !(collision_line(x,y,obj_Player.x,obj_Player.y,obj_wall,true,true))
and point_direction(x,y,obj_Player.x,obj_Player.y)>direction-45 // y la direction hacia el jugador esta entre los
and point_direction(x,y,obj_Player.x,obj_Player.y)<direction+45)// 90° del angulo de vision
or distance_to_object(obj_Player)<50 // ó si esta muy cerca
and !(collision_line(x,y,obj_Player.x,obj_Player.y,obj_wall,true,true))
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_Player)>700)or(collision_line(x,y,obj_Player.x,obj_Player.y,obj_wall,true,true)) //si la distancia hacia el jugador es mayor a 200
alarm[0]=60; //debe dejar de atacar
}
}
if atacar=true //si atacar es verdadero
{
move_towards_point(obj_Player.x+r1,obj_Player.y+r2,1);//debe moverse hacia el jugador.
}
//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(40)+random(23)) //a donde debe moverse es X un lugar aleatorio
ymove=round(ystart+random(40)+random(23)) //a donde debe moverse es Y un lugar aleatorio
move=false // se desactiva mover
speed=0
}
if round(random(60))=60 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.5);//debe moverse hacia la variables xmove e ymove.
}
COLISION CON EL OBJETO BALA (obj_bullet_P)
atacar = true;
pasear = false;
alarm[0]= 60;
objetos que interactuan con el enemigo son los siguentes:
obj_bullet_P Bala del jugador
obj_Player Jugador
obj_wall Muro
Espero que sepan como ayudarme y lo mas importante es que me expliquen en funcionamiento del código para así aprender yo, y los que visiten este post :)
No echen ahi los codigos completos, solo hace falta al evento "Step" añadirle el codigo:
image_angle=direction
{el angulo de la imagen es igual a la direccion, o en otras palabras, voltea a done vá.}
si tu juego es de vista isometrica, bastara con unos if's :3
lo que pasa es que la direction es donde esta el objeto obj_player :/. Traté de hacer que si hay algo de por medio no siga viendo al personaje pero queda muy feo y raro ya que va en una dirección pero mira algo inclinado a donde estaba el personaje antes... no consigo hacer el código bien :(