Que tal! Soy nuevo tanto en GML como en este foro
Queria preguntar unas cuantas dudas, espero puedan ayudarme
Llevo poco menos de 2 semanas intentando programar 1 enemigo, quiero que siga al jugador, ya he intentado con varios codigos y comandos y si lo he logrado pero he tenido problemas con cada uno.
--"Move_toward": Sigue al jugador pero no respeta las colisiones ni el cambio de sprite para las animaciones aun poniendole una condicional con "speed" u "Horizontalspeed"
-- "Pathfinding": Me ha servido bastante pero una vez que sigue al jugador no se detiene aunque despues le ponga "Panth_ends()" (codigo 1)
-- Intente con un codigo de un tutorial el cual tuve que adaptar ya que este era de Game Maker 1, si cumplio su objetivo de seguir al jugador y si esta cerca ejecutar animacion de ataque pero una vez que llega al punto donde se encuentra el jugador o colisiona con otro objeto no vuelve a moverse mas. (Codigo 2)

Estoy utilizando switch states y scripts para todo esto.

Mis dudas son las siguientes:
1.- Si estoy haciendo algun codigo mal o hay algun error que no he visto y si alguno de ustedes podria ayudarme con un codigo que lo solucione o que funcione mejor.
2.- ¿Es posible tener una especie de "Delay" o "Cooldown" entre los cambios de estado? Por ejemplo, que el enemigo siga al jugador durante 5 segundos o cierta cantidad de pasos y despues se quede quieto como a descansar por 5 segundos y despues a perseguir al jugador nuevamente.
3.- De igual forma hacer un "random" (es algo que aun no entiendo del todo bien como funciona, pero busco hacer que el enemigo tome su propia decision a base de aleatoriedad, por ejemplo, que persiga al enemigo, descanse 5 segundo y despues elija si lo atacara o solo pasara por encima o ejecutar otro ataque distinto.

Por cierto el juego que hago es un Top-Down View algo asi como un Beat'Em'Up clasico, les agradezco a todos su ayuda de antemano y perdonen la biblia xd.

Codigo 1

[gml]
target = obj_player;

grid = mp_grid_create(0,0,room_width/32,room_height/32,32,32);
path = path_add();
mp_grid_add_instances(path,obj_collision,1);
mp_grid_path(grid,path,x,y,target.x,target.y,1);
path_start(path,3,0,1);


   if (x == 0 && y == 0)
   {
      sprite_index = spr_enemy_idleL;
   }
   else
   {
      image_speed = 0.8;
      sprite_index = spr_enemy_runL;
   }
   
if (x != 0) && sign(target.x - x) == 1
{
   sprite_index = spr_enemy_runR;
}
if (x != 0) && sign(target.x - x) == -1
{
   sprite_index = spr_enemy_runL;
}
   


if (x == 0 && y == 0) && sign(target.x - x) == 1
{
   sprite_index = spr_enemy_IdleR;
}
if (x == 0 && y == 0) && sign(target.x - x) == -1
{
   sprite_index = spr_enemy_idleL;
}

if distance_to_object(target)
{
path_ends();
state = MONSTERSTATE.FREE;
}
[/gml]

Codigo 2

[gml]
target = obj_player;

if instance_exists(target)
{
   
   if sign(target.y - y) == -1
   {
      keyUp = true;
   }

   if sign(target.y - y) == 1
   {
      keyDown = true;
   }



   if abs(target.x - x) > 35
   {
      if sign(target.x - x) == -1
      {
      keyLeft = true;
      }
      if sign(target.x - x) == 1
      {
      keyRight = true;
      }
   }
}
else
{
   if abs(target.y - y) < 5
   {
      keyAttack = true;
   }
   else
   {
      keyAttack = false;
   }
}



if (keyAttack = true) && sign(target.x - x) == 1
{
   hsp = 0;
   vsp = 0;
   sprite_index = spr_enemy_punchR;
}
if (keyAttack = true) && sign(target.x - x) == -1
{
   hsp = 0;
   vsp = 0;
   sprite_index = spr_enemy_punchL;
}


if (animation_end())
{
   sprite_index = spr_enemy_idleL;
   state = MONSTERSTATE.FREE;
}


[/gml]

#1 Junio 23, 2020, 06:37:12 AM Ultima modificación: Junio 23, 2020, 09:26:57 AM por elmmeronw
Cita de: Harushio en Junio 23, 2020, 04:26:21 AM
--"Pathfinding": Me ha servido bastante pero una vez que sigue al jugador no se detiene aunque despues le ponga "Panth_ends()" (codigo 1)
Las rutas tiene sus propias velocidad he ignoran las speed tradicionales.
trata de utilizar esto para detenerlos.
[gml]
path_speed=0;
[/gml]

Cita de: Harushio en Junio 23, 2020, 04:26:21 AM
-- Intente con un codigo de un tutorial el cual tuve que adaptar ya que este era de Game Maker 1, si cumplio su objetivo de seguir al jugador y si esta cerca ejecutar animacion de ataque pero una vez que llega al punto donde se encuentra el jugador o colisiona con otro objeto no vuelve a moverse mas. (Codigo 2).

trata de utilizar las distancia para indicarle que cuando este muy lejos se acerque  y ataque.
esto retornara un numero entero que se ve reflejado como distancia.
recomiendo que guarde en una variable

[gml]
distancia=distance_to_object(x,y,obj_player);
[/gml]

Cita de: Harushio en Junio 23, 2020, 04:26:21 AM
2.- ¿Es posible tener una especie de "Delay" o "Cooldown" entre los cambios de estado? Por ejemplo, que el enemigo siga al jugador durante 5 segundos o cierta cantidad de pasos y despues se quede quieto como a descansar por 5 segundos y despues a perseguir al jugador nuevamente.

alarmas , las alarmas se activa una única vez(valga me la redundancia) y cuando se activa es cuando llegan a 0 pero podemos saber que una alarma no se ha ejecutado por que devolverá -1.

Esta es mi forma favorita de usarla.

Esto lo que hará es verificar la alarma la alarma esta desactivada la activara en 30 step luego de que pase lo 30 step ejecutara lo que este dentro de la alarma y volverá a ejecutarla cuando la alarma llegue a -1 como un ciclo vicioso.
[gml]
if(alarm[0]<0)
    {
        alarm[0]=30;
    }
[/gml]

Cita de: Harushio en Junio 23, 2020, 04:26:21 AM
3.- De igual forma hacer un "random" (es algo que aun no entiendo del todo bien como funciona, pero busco hacer que el enemigo tome su propia decision a base de aleatoriedad, por ejemplo, que persiga al enemigo, descanse 5 segundo y despues elija si lo atacara o solo pasara por encima o ejecutar otro ataque distinto.

La racionalizan se puede usar de forma con alarma y randow  el randow indicaría el tiempo que podría llevar una acción a otra mientra que dentro de la alarma debe existir las condiciones de la acción aliatoridad para no tener que ejecutar tanta alarmas cuando todo este equipado en una sola .

Espero que sea de ayuda y si te gusta visitarme en mi canal.


Haz sido de mucha ayuda gracias!
Ya estoy suscrito a tu canal y veo que tienes varios videos explicativos en Game Maker 1, ¿También son compatibles con Game Maker Studio 2? Quizá sea una pregunta un poco tonta pero por algunos tutorías es que he visto he tenido que adaptar el código o a veces no funcionan como es debido

¿Podrías explicarme un poco más de las alarmas?
Supongo que debo colócarlo en un Step event junto con un comando de Alarm[0] -= 1 y para cambiar el el estado
[gml]
If (alarm[1] < 0)
{
alarm[0] = 30;
state = ENEMYSTATE.FREE;
}
// y para cambiar al siguiente seria..
If (alarm[0] < 0)
{
alarm[1] = 30;
state = ENEMYSTATE.ATTACK;
}

[/gml]

¿Sería algo así?

Cita de: elmmeronw en Junio 23, 2020, 06:37:12 AM
La racionalizan se puede usar de forma con alarma y randow  el randow indicaría el tiempo que podría llevar una acción a otra mientra que dentro de la alarma debe existir las condiciones de la acción aliatoridad para no tener que ejecutar tanta alarmas cuando todo este equipado en una sola.

Me encantaría aprender más de las alarmas y el comando randow, ¿podrías explicarme un poco más si no es molestia? O recomendarme uno de tus videos en el que hables de eso.

Muchas gracias nuevamente!

La alarma es como un contador en reversa cuando la alarma está desactivada su valor es -1 cuando se activa es en 0 el número que le asigne a la alarma es el número de step que va durar para activarse el evento por ejemplo
:en mi room tiene una velocidad de 30 eso significa que 30 step son un segundo de juego para acortar un poco puede colocar esto
Para activarla y saber cuantos segundos son
[gml]
alarma[0]= room_speed*3;
[/gml]
De esa manera sabemos que si es 3 segundos

En cuanto al lugar si en un step debe estar colocado y claro dentro de la condición que dese que se ejecute.

Bueno para los número aliatorios te dejaré un enlace a la documentación de yoyos games si usas crhome solo le das a traducir y listo.

https://docs.yoyogames.com/source/dadiospice/002_reference/maths/real%20valued%20functions/index.html
:)
Saludos y gracias por tu apoyo <3

el error esta en que inicias el path sin antes verificar la posicion o  distancia y hasta el camino, antes de iniciar el path coloca una condicion if para verificar si esta el camnino libre y si esta lejos del jugador y repite el codigo en una alarma que se ejecute cada 3 segundos y verifique el camino nuevo y activo o no el path
Atentamente.-
Elvis Kelley
Mi Manual.
Mi canal de Youtube Youtube click aqui
Video tutoriales Game maker

Cita de: elviskelley en Junio 23, 2020, 02:37:38 PM
el error esta en que inicias el path sin antes verificar la posicion o  distancia y hasta el camino, antes de iniciar el path coloca una condicion if para verificar si esta el camnino libre y si esta lejos del jugador y repite el codigo en una alarma que se ejecute cada 3 segundos y verifique el camino nuevo y activo o no el path
HOO HOOO tengo un video para eso puede ser que sea de ayuda para el....
https://www.youtube.com/watch?v=Gb6KZuNqZjY&t=45s

¡Muchas gracias a ambos!
Le dare una checada al video espero que funcione en Game maker studio 2, para finalmente terminar el pequeño demo que llevo haciendo durante este tiempo.