He intentado seguir los pasos del los tutoriales de Hektor Profe (Youtube), y mas o menos me voy defendiendo y aclarando, poco a poco. En este ultimo, el de la maquina de estados para un juego RPG, no consigo que pase de estado caminando a parado. Cuando para al personaje se queda a image_speed = 0, pero no se queda con el image_index = 0. Otra cosa que tampoco me funciona es el tema de saltar el primer frame de la animación (en el cual coloco la imagen parada del personaje). No se que estoy haciendo mal, realmente he copiado el código directamente. Muchas gracias y un saludo!
Evento Create
[gml]
image_speed = 0
enum ej {
parado = prota_parado,
caminando = prota_caminando
}
dir = "abajo";
estado = ej.parado;
[/gml]
Evento Step
[gml]
//Variables
v = 5;
vh = 0;
vv = 0;
//Deteccion de direccion
vh = (-keyboard_check(vk_left) + keyboard_check(vk_right)) * v;
vv = (-keyboard_check(vk_up) + keyboard_check(vk_down)) * v;
//Colision horizontal
if place_meeting(x+vh,y,obj_cartel) //esta es la colision normal
{ repeat(v)//Este es un bucle "repeat"
{ if !place_meeting(x+sign(vh),y,obj_cartel)// "if !" quiere decir lo contrario
{ x += sign(vh); }
else
{break;}
}
vh = 0 }
//Colision vertical
if place_meeting(x,y+vv,obj_cartel)
{ repeat(v)
{ if !place_meeting(x,y+sign(vv),obj_cartel)
{ y += sign(vv); }
else
{ break; }
}
vv = 0 }
//Detección de dirección
if (vv<0) dir = "arriba";
else if (vv>0) dir = "abajo";
else if (vh<0) dir = "izquierda";
else if (vh>0) dir = "derecha";
//Detección de estado
if (dir != "") estado = ej.caminando;
if (vv == 0 and vh == 0) estado = ej.parado;
x += vh //si esto lo colocamos justo despues de la deteccion de movimiento
//la colision no funciona
y += vv
script_execute(estado)
[/gml]
Y estos serian los dos scripts
prota_parado
image_speed = 0;
iamge_index = 0;
prota_caminando
[gml]
image_speed = 1
if (image_index == 0) image_index++;
switch (dir) {
case "abajo":
sprite_index = spr_prota_abajo;
break;
case "arriba":
sprite_index = spr_prota_arriba;
break;
case "izquierda":
sprite_index = spr_prota_izquierda;
break;
case "derecha":
sprite_index = spr_prota_derecha;
break;
}
[/gml]
Muchas gracias si os tomais la molestia, un saludo!
Evento Create
[gml]
image_speed = 0
enum ej {
parado = prota_parado,
caminando = prota_caminando
}
dir = "abajo";
estado = ej.parado;
[/gml]
Evento Step
[gml]
//Variables
v = 5;
vh = 0;
vv = 0;
//Deteccion de direccion
vh = (-keyboard_check(vk_left) + keyboard_check(vk_right)) * v;
vv = (-keyboard_check(vk_up) + keyboard_check(vk_down)) * v;
//Colision horizontal
if place_meeting(x+vh,y,obj_cartel) //esta es la colision normal
{ repeat(v)//Este es un bucle "repeat"
{ if !place_meeting(x+sign(vh),y,obj_cartel)// "if !" quiere decir lo contrario
{ x += sign(vh); }
else
{break;}
}
vh = 0 }
//Colision vertical
if place_meeting(x,y+vv,obj_cartel)
{ repeat(v)
{ if !place_meeting(x,y+sign(vv),obj_cartel)
{ y += sign(vv); }
else
{ break; }
}
vv = 0 }
//Detección de dirección
if (vv<0) dir = "arriba";
else if (vv>0) dir = "abajo";
else if (vh<0) dir = "izquierda";
else if (vh>0) dir = "derecha";
//Detección de estado
if (dir != "") estado = ej.caminando;
if (vv == 0 and vh == 0) estado = ej.parado;
x += vh //si esto lo colocamos justo despues de la deteccion de movimiento
//la colision no funciona
y += vv
script_execute(estado)
[/gml]
Y estos serian los dos scripts
prota_parado
image_speed = 0;
iamge_index = 0;
prota_caminando
[gml]
image_speed = 1
if (image_index == 0) image_index++;
switch (dir) {
case "abajo":
sprite_index = spr_prota_abajo;
break;
case "arriba":
sprite_index = spr_prota_arriba;
break;
case "izquierda":
sprite_index = spr_prota_izquierda;
break;
case "derecha":
sprite_index = spr_prota_derecha;
break;
}
[/gml]
Muchas gracias si os tomais la molestia, un saludo!