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]
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]