Noticias

Se ha publicado un nuevo servicio, el Portal de Juegos Online

Comunidad Game Maker

Bienvenid@ a la comunidad hispana de Game Maker. Nuestro objetivo es crear videojuegos y dar soporte en castellano de GM. Para mejorar nuestro servicio hemos implantado, como adicion al reglamento general, algunas normas especificas en los subforos más comunes. ¡No olvides informarte antes de participar!.

Autor Tema: Maquina de Estados en un Plataformero  (Leído 250 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado T789

  • Habitual
  • *
  • Puntos: 163
  • Mensajes: 93
  • Agradecido: 3 veces
  • Sexo: Masculino
  • Solo quiero aprender para ser Mejor
    • Ver Perfil
en: Febrero 07, 2020, 11:54:06 pm
Hola a todos, vengo por que necesito hacer una maquina de estados para un plataformero, pues ya me canse de aplicar las animaciones con los keyboard_check, se volvio tedioso

He usado maquinas de estados en juegos Rpg pero no es lo mismo en otro tipo de juego por eso quisiera saber como implementarlas, ya pense en usar scripts para las animaciones y variables para los estados

El problema es que no se como llamarlas digo usarlas, pues como ya dije usar el mismo metodo de un Rpg no funciona para nada

Como me sugeririan llamar los estados del resto me encargo usando

script_execute( estado ) al final del step

 


No Tienes Permisos Para Dar Puntos
point 0 Puntos

Este tema no recibió puntos.


Desconectado Silver_light

Respuesta #1 en: Febrero 08, 2020, 04:03:47 am
A saber, una máquina de estados es una máquina de estados en un rpg, en un plataformas y en pacman o cualquier juego que desees implementarlo. Tiene varias maneras de hacerse, pero todos desembocan en lo mismo, ejecutar instrucciones dada una condición satisfecha.

La programación de una máquina de estados usualmente se maneja mediante la lógica del switch. Se tiene una estructura o una enumeración que contiene los estados posibles y el árbol de decisiones, ya sea con ifs o lo más práctico utilizando switch.

Primero deberías usar una enumeracion, con los estados posibles:
enum states{ //estados posibles para la variable de estado
idle,
running,
jumping
}
state= states.idle; //mi personaje comienza parado sin hacer absolutamente nada
Y en el evento step, debería correr la lógica, con el switch:
switch(state){
case states.idle:
    scr_idle_player(arg0, arg1, arg2):
break;

case states.running:
   scr_running_player(arg0);
break;

// . . .
}

La diferencia, es que ejecutar los script así de manera independiente antes que utilizar una sola instruccion con script_execute, es que puedes pasarle parametros variables.

P/D: en gm8 no hay enums, pero aun puedes definir constantes en el motor. Simplemente crealas allí, el valor no importa siempre que sean diferentes entre sí.

 


Desconectado T789

  • Habitual
  • *
  • Puntos: 163
  • Mensajes: 93
  • Agradecido: 3 veces
  • Sexo: Masculino
  • Solo quiero aprender para ser Mejor
    • Ver Perfil
Respuesta #2 en: Febrero 08, 2020, 05:56:30 am
Bueno me parecia mejor usar el script_execute, igual ya se como hacer para usar los scripts
El problema es como hago para llamar al estado que quiero

En un rpg los llamaba verficando la vspeed y el hspeed
If (vh == 0 & vv == 0) estado = parado

Pero como ya dije no es igual, no es el mismo funcionamiento y lo que buscaba es como llamar los estados

 


Desconectado FernandoNavarro

Respuesta #3 en: Febrero 08, 2020, 01:27:39 pm
En un rpg los llamaba verficando la vspeed y el hspeed
If (vh == 0 & vv == 0) estado = parado

[quote_author=T789]
link=topic=31763.msg139091#msg139091
date=1581137790]
Pero como ya dije no es igual, no es el mismo funcionamiento y lo que buscaba es como llamar los estados
[/quote]

Hola T789.

Si entendí bien quieres ""ejecutar"" los estados. Pues para eso sólo necesitas tener en cuenta que condiciones son necesarias para cada estado, por ejemplo:

Para que el personaje se mueva necesitas presionar una tecla puedes manejarlo con usando variables que manejen hacia que lado quieres que se mueva como:

Spoiler
///Create
intMove = 0;

///Step
var keyLeft, keyRight;
keyLeft = -keyboard_check(vk_left); || -keyboard_check(ord("A"));
keyRight = -keyboard_check(vk_right); || -keyboard_check(ord("D"));

Pero bueno, al grano. Decidí usar eso para explicar mejor. Como bien dijiste, al ser un juego de plataformas necesitas manejar distintos estados, como "parado" o "idle, "corriendo" o "running", etcétera. Como decía antes, sólo necesitas concentrarte en que debe suceder para usar cada estado, yo uso algo así:

Spoiler
if (vhspeed == 0) //Verifico si no está en el aire, puedes cambiar la condición según tu caso
{
    if (intMove == 0)
    {
        staPlayer =statePlayer.idle; //statePlayer es el nombre de mi enumerador, y staPlayer una variable que uso para llamarlo
    } //Aquí ejecuto todo lo que debería suceder en caso de no estar quieto ni en el aire
    else staPlayer = statePlayer.walk;
} //Aquí lo que pasa estando en al aire
else staPlayer = statePlayer.falling;
sprite_execute(staPlayer);

 


Desconectado elviskelley

Respuesta #4 en: Febrero 10, 2020, 01:43:26 pm
El hecho es que no se comprende mucho lo que quieres, por que no dices bajo que condiciones vas a llamarlos estados, cual es la lista de estados que posees, y sobre todo dices algo de las animaciones, asi que no se si se trata solo del cambio de sprite según estado.
llamar en un plataformas claro que es distinto por la diferencia que en un cenital, izometrico, básicamente tienes las direcciones por grados sus 360. mientras que en el plataformas solo tienes 2 direcciones derecha e izquierda, para verificar hacia arriba, debes tomar en cuenta 2 situaciones, 1 si sube sobre una plataforma, 2 si sube por que ha saltado. Esto sin agregar que existen otras opciones como usar jet pack, u otrasituacion para subir que se te ocurra, lo cual la animacion seria distinta para cada caso, y el cambio de sprite, velocidad de sub imagenes, y hasta la sub imagen actual, serian cosas a tomar en cuenta.
el movimiento hacia abajo, va tambien con verificaciones, como si estas sobre una plataforma bajando, y es caida controlada con jet pack, o si cae por gravedad. para lo cual debes establecer condiciones.
Yo prefiero los cambios de sprite se llamen en el event End step y en unas cuantas lineas de codigos definir todos los cambios de sprite.
algo igual podrias hacer con los estados, realizar un solo script que compare cada situacion y active un estado u otro y desactive los no necesarios.

Atentamente.-
Elvis Kelley
Mi Manual.
 


Desconectado T789

  • Habitual
  • *
  • Puntos: 163
  • Mensajes: 93
  • Agradecido: 3 veces
  • Sexo: Masculino
  • Solo quiero aprender para ser Mejor
    • Ver Perfil
Respuesta #5 en: Febrero 10, 2020, 11:38:41 pm
Es verdad .Elviskelley" olvide tomar en cuenta todo eso, en un rpg solo habria calculado algunas cosas pero esto no es un Rpg

Solo poseo 4 Estados
-parado
-caminando
-saltando
-en_escalera

Bueno solo necesito esos 4 estados, lo demas lo arreglo en los scripts de las animaciones usando "switch" con una variable "dir"

la verdad no pense mucho en todos lo detalles, que en el "Event Step" no funcionaba mejor e igual podrias aclararme con un ejemplo