Diciembre 15, 2017, 11:34:31 PM Ultima modificación: Diciembre 15, 2017, 11:44:03 PM por royer11
Hola que tal, ;D
Me ha interesado siempre crear una maquina de estados, para no escribir demasiado y que se entienda. Resulta que en la mayoría de vídeos o información que he encontrado siempre han estado relacionados a juegos RPG, este usa todas las direcciones y en mi situación solo necesito un juego con 3 direcciones-->"derecha,izquierda,arriba", bueno usaría abajo solamente para cambiar de sprite  y la mascara de colision. Por ejemplo:


   creo un objeto con el nombre de  "obj_jugador"
dentro de el, creo un evento create con los siguientes datos
[gml]
///evento create añado
hsp = 0;   //velocidad horizontal
vsp = 0;   //velocidad vertical
grav = 1;       //gravedad
movespeed = 5;   //movimiento
jumpspeed = 15;   //velocidad de salto
//como haria aqui para crear la maquina de estados
[/gml]
Ahora creamos un evento step e insertamos esto
[gml]
/// 1 Gravedad
if (vsp < 20) && !place_meeting(x, y+1, obj_Pared) vsp += grav;

// 5 Saltos (antes de las colisiones)
key_jump = keyboard_check_pressed(vk_up);
if (place_meeting(x,y+1,obj_Pared)){
   if (key_jump)
    {
        vsp = -jumpspeed;
    }
}

// 1 Colisión vertical ( contra el suelo)
if (place_meeting(x,y+vsp,obj_Pared))
{
//    // 1 Mientras no encontremos colisión a 1px ajustamos de 1 en 1
    while(!place_meeting(x,y+sign(vsp),obj_Pared))
    {
        y += sign(vsp);
    }
    vsp = 0;
}

// 1 Finalmente sumamos la velocidad vertical a la Y
y += vsp;

// 2 Detectar movimientos y reacción horizontal (antes de las colisiones)
key_right = keyboard_check(vk_right);
key_left = -keyboard_check(vk_left);
move = key_left + key_right;
hsp = move * movespeed;

// 4 Colisión horizontal ( contra las paredes)
if (place_meeting(x+hsp,y,obj_Pared))
{
    while(!place_meeting(x+sign(hsp),y,obj_Pared))
    {
        x += sign(hsp);
    }
    hsp = 0;
}

// 6 Colisión contra Obstáculo
if (place_meeting(x+1,y,obj_Rueda))
{
    room_restart();
}

// 7 Colisión contra Enemigo
if (place_meeting(x+1,y,obj_Enemigo))
{
    room_restart();
}

// 2 Finalmente sumamos la velocidad horizontal a la X
x += hsp;
[/gml]
En el ejemplo del RPG es de la siguiente manera
evento create
[gml]
///evento steep
enum state {
   idle; //descansando
   up;
   down;
   left;
   right;
}
dir = state.right;     //direccion
is_moving = false;
image_speed =0.5;
[/gml]
ahora  dentro del evento Step
[gml]
//si se presiona una tecla
if (keyboard_check(vk_left))
{
   dir = state.left;
   is_moving = true;
}
else if (keyboard_check(vk_right))
{
   dir = state.right;
   is_moving = true;
}
else if (keyboard_check(vk_up))
{
   dir = state.up;
   is_moving = true;
}else if (keyboard_check(vk_down))
{
   dir = state.down;
   is_moving = true;
}
else
{
   dir = dir;
   is_moving = false;
}
[/gml]
[gml]
///movimiento
if is_moving
{
   switch (dir)
   {
   case state.up:
      y -=4;
     break;
    case state.down:
      y +=4;
     break;
    case state.left:
      x -=4;
     break;
    case state.right:
      x +=4;
     break;
   }

}
[/gml]
[gml]
///añadir sprites
if is_moving
{
   switch (dir)
   {
   case state.up:
      sprite_index=spr_walk-.up;
      break;
      //asi sucesivamente para las demas
   }
}
[/gml]
Podrian ser tan amables de ayudarme a como adaptar este codigo?, la dificultad se me genera cuando se crea el codigo de gravedad y colisiones
   

No veo muy nesesario integrar el ejemplo que encontraste XD, por lo regular las maquinas de estados se usan para inteligencia artificial. Es raro verlas en el jugador

#2 Diciembre 16, 2017, 05:46:45 PM Ultima modificación: Diciembre 16, 2017, 05:48:50 PM por Zanget
No conozco la manera correcta de crear una maquina de estados, pero te recomiendo que le dediques un poco de tiempo a estudiarlo y así podrás adaptar tu código como quieras y de forma optimizada, mira esta maquina de estado de pixelated pope para plataforma:

Aqui te dejo el video:
https://www.youtube.com/watch?v=aPokXuWE6e0

El link del gmz:
https://www.dropbox.com/s/3bmqxnlc4q2zevz/FSMPlatformerExample.gmz?dl=0

Y por ultimo te dejo un tutorial de un youtuber español de game maker (Escuela de videojuegos) que habla de como utilizar la maquina de estado de PixelatedPope para crear un beat'em up.
https://www.youtube.com/watch?v=7vuoJSgVf7A&list=PLiplYDjUMtthkY440n-pWCf5anHYQUc_o

Espero que te sirva!!

Zanget.

es muy perfecto esta información, aunque tiene demasiados códigos que he terminado exhausto y en sobre todo me agrada la parte donde hace ramp o sube las colinas o muros

Si son demasiados códigos, pero deberías considerar que si estas trabajando en un proyecto para fines comerciales pues creo que es muy necesario la calidad de los códigos, si el caso es lo contrario, pues puedes ojearlo un rato y sacarle lo necesario para adaptarlo a tu proyecto.

aun estoy en fines de educación así que voy a comenzar con lo que hay y a probar se ha dicho, ..me refiero al codigo  :D