Comunidad Game Maker

Ayuda => Preguntas y respuestas => Mensaje iniciado por: royer11 en Diciembre 15, 2017, 11:34:31 PM

Título: Como crear una maquina de estados en un juego de plataforma?
Publicado por: royer11 en Diciembre 15, 2017, 11:34:31 PM
Hola que tal, ;D
(http://www.mediafire.com/convkey/93ad/1awhuw934pkz75rzg.jpg)
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
   
Título: Re:Como crear una maquina de estados en un juego de plataforma?
Publicado por: Frenzy en Diciembre 16, 2017, 04:41:44 PM
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
Título: Re:Como crear una maquina de estados en un juego de plataforma?
Publicado por: Zanget en Diciembre 16, 2017, 05:46:45 PM
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.
Título: Re:Como crear una maquina de estados en un juego de plataforma?
Publicado por: royer11 en Diciembre 16, 2017, 09:33:07 PM
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
Título: Re:Como crear una maquina de estados en un juego de plataforma?
Publicado por: Zanget en Diciembre 17, 2017, 03:46:25 PM
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.
Título: Re:Como crear una maquina de estados en un juego de plataforma?
Publicado por: royer11 en Diciembre 17, 2017, 09:06:57 PM
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