Tuve un error por una variable "right" que no estaba definida Me di cuenta que en el Evento Create la línea
state = scr_state_idle();
en realidad debe estar sin los paréntesis
state = scr_state_idle;
¿Cómo organizar el flujo de estados de un personaje en Game Maker Studio? La respuesta empieza con un diagrama de estados que conecta idle, move y ataque antes de tocar una sola línea de código. Esta guía es para quien ya tiene un personaje funcionando y quiere darle estructura clara a sus scripts.
Cuando agregas más comportamientos a tu videojuego, el código se vuelve confuso. Por eso, antes de programar, conviene dibujar qué debería pasar y cuándo. Abrir una herramienta tan simple como Paint y crear tres círculos (uno por cada estado) te ayuda a entender tu propia lógica, no solo a explicársela a otras personas [01:00].
¿Qué estados tiene el personaje y cómo se conectan entre sí?
El personaje maneja tres estados: idle (quieto), move (movimiento) y ataque. El juego arranca siempre en idle, y desde ahí se abren los caminos [00:30].
Las conexiones del diagrama de flujo funcionan así:
Un detalle importante del diseño: move y ataque no se conectan entre sí. Para atacar, el personaje debe estar primero en idle [02:00].
¿Por qué hacer un diagrama de flujo antes de programar? Porque traduce ideas abstractas en círculos y flechas concretas. Así sabes exactamente qué estado va a cuál y bajo qué condición, antes de escribir el código.
¿Cómo paso el diagrama de flujo a código en el obj player?
El primer paso es abrir el obj player y comentar el código viejo que mezclaba todo con ifs dentro del mismo step. Comentas con una diagonal y un asterisco al inicio, y un asterisco y diagonal al final. El código se pone en color rosa y el programa lo ignora al dar play, pero queda como referencia reutilizable [03:30].
La lógica se reparte así:
Este reparto ordena los scripts según el flujo que dibujaste, y hace el código mucho más limpio.
¿Cómo regreso a idle cuando termina la animación de ataque?
El regreso automático desde el ataque usa un evento nuevo. Vas a agregar evento, luego other y seleccionas animation end [06:30].
El evento animation end se ejecuta cada vez que el sprite actual del objeto termina su ciclo. Pero como solo quieres que el regreso ocurra durante el ataque, agregas una condición: if state == script_attack, y dentro, state = idle.
Aquí aparece una duda común de programación: la diferencia entre == y =.
¿Cuál es la diferencia entre
==y=en programación? El doble igual==compara dos valores dentro de una condición, como en un if. El igual sencillo=asigna contenido a una variable. Enstate = idleno comparas, le das valor a la variable.
¿Por qué reiniciar el imageIndex al atacar?
Hay un detalle que puede arruinar la consistencia del ataque: la variable imageIndex [08:00].
El imageIndex indica la posición actual del sprite dentro de sus frames. El sprite de ataque tiene 10 frames, y cada uno es una posición numerada desde cero. Si pides el imageIndex, te regresa el número del frame donde está la animación justo en ese instante [08:30].
El problema es que ese índice corre indefinidamente. Imagina que la animación de idle tiene cinco frames y estás en el frame cuatro cuando presionas ataque. La animación de ataque no arrancaría desde el principio, sino desde ese frame cuatro. El resultado: a veces el ataque se ve más corto, a veces más largo, siempre inconsistente [09:30].
La solución es directa: cuando presionas ataque, reinicias el imageIndex a cero. Así la animación siempre se ve completa y mantiene la misma duración.
¿Cómo compruebo que el flujo funciona?
Para probar todo, usas F5. El personaje arranca en idle, se mueve en cualquier dirección, y al soltar las teclas regresa a idle. Al presionar J ataca y vuelve solo a idle cuando la animación termina [11:00].
Ese comportamiento es exactamente el que dibujaste en el diagrama. La fuerza de este método está en que el código corre tal como lo planeaste gráficamente, sin sorpresas.
Con esta estructura de estados lista, el siguiente reto es crear el primer enemigo y aplicar la misma lógica de diagramas y estados a algo que interactúe con el personaje. ¿Qué otro estado agregarías a tu personaje? Déjalo en los comentarios.
¿Cómo organizar el flujo de estados de un personaje en Game Maker Studio? La respuesta empieza con un diagrama de estados que conecta idle, move y ataque antes de tocar una sola línea de código. Esta guía es para quien ya tiene un personaje funcionando y quiere darle estructura clara a sus scripts.
Cuando agregas más comportamientos a tu videojuego, el código se vuelve confuso. Por eso, antes de programar, conviene dibujar qué debería pasar y cuándo. Abrir una herramienta tan simple como Paint y crear tres círculos (uno por cada estado) te ayuda a entender tu propia lógica, no solo a explicársela a otras personas [01:00].
El personaje maneja tres estados: idle (quieto), move (movimiento) y ataque. El juego arranca siempre en idle, y desde ahí se abren los caminos [00:30].
Las conexiones del diagrama de flujo funcionan así:
Un detalle importante del diseño: move y ataque no se conectan entre sí. Para atacar, el personaje debe estar primero en idle [02:00].
¿Por qué hacer un diagrama de flujo antes de programar? Porque traduce ideas abstractas en círculos y flechas concretas. Así sabes exactamente qué estado va a cuál y bajo qué condición, antes de escribir el código.
El primer paso es abrir el obj player y comentar el código viejo que mezclaba todo con ifs dentro del mismo step. Comentas con una diagonal y un asterisco al inicio, y un asterisco y diagonal al final. El código se pone en color rosa y el programa lo ignora al dar play, pero queda como referencia reutilizable [03:30].
La lógica se reparte así:
Este reparto ordena los scripts según el flujo que dibujaste, y hace el código mucho más limpio.
El regreso automático desde el ataque usa un evento nuevo. Vas a agregar evento, luego other y seleccionas animation end [06:30].
El evento animation end se ejecuta cada vez que el sprite actual del objeto termina su ciclo. Pero como solo quieres que el regreso ocurra durante el ataque, agregas una condición: if state == script_attack, y dentro, state = idle.
Aquí aparece una duda común de programación: la diferencia entre == y =.
¿Cuál es la diferencia entre
==y=en programación? El doble igual==compara dos valores dentro de una condición, como en un if. El igual sencillo=asigna contenido a una variable. Enstate = idleno comparas, le das valor a la variable.
Hay un detalle que puede arruinar la consistencia del ataque: la variable imageIndex [08:00].
El imageIndex indica la posición actual del sprite dentro de sus frames. El sprite de ataque tiene 10 frames, y cada uno es una posición numerada desde cero. Si pides el imageIndex, te regresa el número del frame donde está la animación justo en ese instante [08:30].
El problema es que ese índice corre indefinidamente. Imagina que la animación de idle tiene cinco frames y estás en el frame cuatro cuando presionas ataque. La animación de ataque no arrancaría desde el principio, sino desde ese frame cuatro. El resultado: a veces el ataque se ve más corto, a veces más largo, siempre inconsistente [09:30].
La solución es directa: cuando presionas ataque, reinicias el imageIndex a cero. Así la animación siempre se ve completa y mantiene la misma duración.
Para probar todo, usas F5. El personaje arranca en idle, se mueve en cualquier dirección, y al soltar las teclas regresa a idle. Al presionar J ataca y vuelve solo a idle cuando la animación termina [11:00].
Ese comportamiento es exactamente el que dibujaste en el diagrama. La fuerza de este método está en que el código corre tal como lo planeaste gráficamente, sin sorpresas.
Con esta estructura de estados lista, el siguiente reto es crear el primer enemigo y aplicar la misma lógica de diagramas y estados a algo que interactúe con el personaje. ¿Qué otro estado agregarías a tu personaje? Déjalo en los comentarios.
Tuve un error por una variable "right" que no estaba definida Me di cuenta que en el Evento Create la línea
state = scr_state_idle();
en realidad debe estar sin los paréntesis
state = scr_state_idle;
Si tienen curiosidad por saber el número de frame por el que va la animación, solo deben agregar esta línea al Evento Draw GUI de Player
draw_text(10,25,string(image_index));
Con eso se vería algo así

Al momento de presionar el ataque va todo bien, pero se corta mostrando 1 sprite cuando el personaje esta quieto. Es raro por que no dejo de presionar ataque y me sale eso. :c Alguna ayuda?
no se si estoy creando un cuaderno o un libro que tiene la info de video juegos, paginas, java, etc... falta el catalogo de búsqueda en el libro cuaderno :)
ahora que abro el juego, me da un error y tengo ni idea porque...
___________________________________________
############################################################################################
ERROR in action number 1
of Step Event0 for object obj_player:
Trying to execute non-existing script.
at gml_Object_obj_player_Step_0 (line 2) - script_execute(state);
############################################################################################
gml_Object_obj_player_Step_0 (line 2)
yo para cuando puse que acabase la animacion en el evento puse la linea de codigo state = ScrStand ( el equivalente a state idle) y funciono, es necesario poner la linea que indicas o si funciona asi no hay mas problemas?
Buenas! cuando creo los movimientos para mi personaje y lo ejecuto se ve un poco tildado. Mi personaje tiene diferencias en todas las partes del cuerpo, por lo que hice una animacion para cada direccion. Puede ser que sea por eso? porque esta mas cargado que mi tarjeta de credito? jeje
Yo lo hice en la clase anterior lo de resetear el indice de imagen de la animacion, me di cuenta probando el juego que arrancaba en donde terminaba la animacion anterior y lo quise arreglar jaja. Por eso me quedo distinto, puse el reinicio del image index en el script del ataque directamente:
function scr_state_mc_attacking(){ if(sprite_index != spr_batman_attacking){ image_index = 0; sprite_index = spr_batman_attacking; } else {sprite_index = spr_batman_attacking;} }
Para abrir las ventanas en la forma de flujo que muestra el profesor, solo debes seleccionar la función y presionar “F1”