¿Cómo optimizar el código de un videojuego en Game Maker Studio?
El desarrollo de videojuegos es un arte que balancea creatividad y eficiencia. En Game Maker Studio, uno de los motores de juegos más populares, optimizar y mejorar nuestro código es una práctica esencial. En esta guía, te mostramos cómo aplicar scripts para organizar el código dentro de un objeto de personaje, haciendo que la interpretación y el mantenimiento sean más eficientes.
¿Qué son los estados del personaje en Game Maker Studio?
Los estados del personaje son condiciones que determinan las acciones del mismo. En nuestro proyecto, tenemos dos estados esenciales:
Idle: cuando el personaje solo respira sin moverse.
Move: cuando el personaje está caminando.
Estos estados no solo simplifican la lógica del juego, sino que también facilitan el manejo del código al dividirlo en partes claras y concisas.
¿Cómo crear scripts y variables de estado?
Para comenzar, necesitamos definir una variable llamada state, que almacenará el estado actual del personaje. Veamos cómo se hace:
create:
state = "";
O también podemos inicializarla con no one, indicando que no hay nada definido en un inicio. Luego, creamos los scripts que gestionarán cada estado:
Crear scripts para los estados: En la sección de scripts, creamos una subcarpeta llamada player states y dos scripts: scr_state_idle y scr_state_move.
Definir lógica para mover y estar parado: En el script del estado move, colocamos la lógica que maneja el movimiento del personaje. Mientras que en el script del estado idle, simplemente dejamos la animación de estar quieto.
¿Cómo controlar cambios de estado en el step code?
Dentro del método step, manejamos los cambios de estados dependiendo de las teclas que presionemos. Aquí te mostramos cómo:
step:
if (keyboard_check(ord("RIGHT")) || keyboard_check(ord("LEFT")) || keyboard_check(ord("UP")) || keyboard_check(ord("DOWN"))) {
state = scr_state_move;
} else {
state = scr_state_idle;
}
script_execute(state);
La función script_execute es clave, ya que se encarga de ejecutar el script que está apuntado en la variable state.
¿Por qué es útil la organización con scripts?
Claridad y mantenimiento: Al organizar el código en scripts separados, el código principal se vuelve mucho más legible y fácil de mantener.
Reutilización: Scripts específicos pueden ser utilizados en múltiples objetos o situaciones dentro del juego.
Escalabilidad: Con una estructura clara, añadir nuevos estados o funcionalidades se vuelve más sencillo sin comprometer la eficiencia.
¿Qué sigue en el desarrollo de nuestro videojuego?
Con el código optimizado y organizado, nuestro videojuego no solo se ejecutará mejor, sino que será más fácil de expandir. En la próxima etapa, introduciremos un nuevo estado de ataque, dotando a nuestro personaje de más acciones. Siempre recuerda, cada progreso en el desarrollo es una oportunidad para aprender y mejorar. ¡Sigue adelante y mantén la curiosidad encendida en tu camino como desarrollador de videojuegos!
¿Cómo optimizar el código de un videojuego en Game Maker Studio?
El desarrollo de videojuegos es un arte que balancea creatividad y eficiencia. En Game Maker Studio, uno de los motores de juegos más populares, optimizar y mejorar nuestro código es una práctica esencial. En esta guía, te mostramos cómo aplicar scripts para organizar el código dentro de un objeto de personaje, haciendo que la interpretación y el mantenimiento sean más eficientes.
¿Qué son los estados del personaje en Game Maker Studio?
Los estados del personaje son condiciones que determinan las acciones del mismo. En nuestro proyecto, tenemos dos estados esenciales:
Idle: cuando el personaje solo respira sin moverse.
Move: cuando el personaje está caminando.
Estos estados no solo simplifican la lógica del juego, sino que también facilitan el manejo del código al dividirlo en partes claras y concisas.
¿Cómo crear scripts y variables de estado?
Para comenzar, necesitamos definir una variable llamada state, que almacenará el estado actual del personaje. Veamos cómo se hace:
create:
state = "";
O también podemos inicializarla con no one, indicando que no hay nada definido en un inicio. Luego, creamos los scripts que gestionarán cada estado:
Crear scripts para los estados: En la sección de scripts, creamos una subcarpeta llamada player states y dos scripts: scr_state_idle y scr_state_move.
Definir lógica para mover y estar parado: En el script del estado move, colocamos la lógica que maneja el movimiento del personaje. Mientras que en el script del estado idle, simplemente dejamos la animación de estar quieto.
¿Cómo controlar cambios de estado en el step code?
Dentro del método step, manejamos los cambios de estados dependiendo de las teclas que presionemos. Aquí te mostramos cómo:
step:
if (keyboard_check(ord("RIGHT")) || keyboard_check(ord("LEFT")) || keyboard_check(ord("UP")) || keyboard_check(ord("DOWN"))) {
state = scr_state_move;
} else {
state = scr_state_idle;
}
script_execute(state);
La función script_execute es clave, ya que se encarga de ejecutar el script que está apuntado en la variable state.
¿Por qué es útil la organización con scripts?
Claridad y mantenimiento: Al organizar el código en scripts separados, el código principal se vuelve mucho más legible y fácil de mantener.
Reutilización: Scripts específicos pueden ser utilizados en múltiples objetos o situaciones dentro del juego.
Escalabilidad: Con una estructura clara, añadir nuevos estados o funcionalidades se vuelve más sencillo sin comprometer la eficiencia.
¿Qué sigue en el desarrollo de nuestro videojuego?
Con el código optimizado y organizado, nuestro videojuego no solo se ejecutará mejor, sino que será más fácil de expandir. En la próxima etapa, introduciremos un nuevo estado de ataque, dotando a nuestro personaje de más acciones. Siempre recuerda, cada progreso en el desarrollo es una oportunidad para aprender y mejorar. ¡Sigue adelante y mantén la curiosidad encendida en tu camino como desarrollador de videojuegos!
Solo voy a dejar este comentario por si alguien sin mucha experiencia en programación se pierde
.
Una función (script) es básicamente código de muchas líneas para reutilizarlo en otra sección sin que ocupe tantas líneas.
.
Por ejemplo: en una calculadora para multiplicar ++3x2++, la calculadora generalmente tiene funciones de multiplicación integradas que, en lo básico son sumas repetitivas y en donde sus argumentos de entrada son el 3 (arg1) y el 2 (arg2)
.
En simpleza el código de la función se ve más o menos así.
funcion_multiplicar (arg1 aka el '3' ,arg2 aka el '2') {
mientras arg2 > 1 entonces {
resultado = arg1 + arg1
arg2 = arg2 - 1
}
retornar -resultado-
}
Las funciones siempre deben retornar un resultado o modificar una variable que luego usarás en tu código más adelante
.
Con esto escrito, puedes ir a la ventana de código original y hacer llamado a la función_multiplicar(arg1,arg2) sin tener que volver a escribir todo el código interno para hacer una suma entre 2 números
.
Sé que muchos ya tienen experiencia, pero quizás alguien encuentre esto útil o complementario.
Saludos
¿Cómo es que el scr_state_move puede ver las variables creadas en el script scr_get_input (left, down...), si en ningún momento hacemos referencia a él?
Ahí me perdí con el Scope.
Siguiendo la esencia de el uso de scripts, pasaremos los codigos mas importantes que teniamos en el step de nuestro personaje principal , con el que nos moviamos hacia los diferentes lados, y consigo los sprites que contenian estos movimientos. Para esto seguiremos los sig. pasos.
Primero modificaremos y crearemos un Grupo de scripts el cual llamaremos Player States y dentro de este grupo colocaremos todos los estados de movimiento de nuestro personaje: El estatico, el movimiento normal, y el movimiento de running de nuestro personaje y quedara de la sig forma.
Crearemos los distintos movimientos de nuestro personaje en este caso seran 3, idle, move y run, segun los nombramos en el paso anterior, y cada uno contendra lo siguiente que se explicara a continuación.
scr_state_idle
Este script contendra simplemente el sprite estatico de nuestro personaje y el codigo quedara de la sig. forma.
b. scr_state_move
En esta parte del codigo colocaremos el movimiento, para lo cual simplemente cortaremos el codigo que tenemos en nuestro step code de el obj_first_player, donde tenemos los condicionales if hasta antes del else y lo pegamos dentro del script y quedaria de la sig manera.
c. scr_state_running
En esta parte simplemente cortaremos el codigo que teniamos de la animación de correr al presionar la tecla shift y lo colocaremos dentro de nuestro script de correr, y quedaria de la sig forma
Ahora crearemos un condicional if dentro de el step code de nuestro personaje principal en el cual la condicion seran las variables que declaramos en la lección anterior, las cuales serian right, left, up y down, (las cuales contendran la asignación y el chequeo del presionado de las teclas), si detecta alguno de esto, asignaremos el script de movimiento llamado anteriormente scr_state_move, y si no se esta moviendo hacer llamado del script de idle llamado: scr_state_idle, y quedaria de la sig forma.
Para casi finalizar colocaremos el nombre scr_state_running, donde asignaremos para que se active el script de correr donde tambien tendra lugar el sprite de movimiento de correr.
Me esta encantando tu curso esta genial, pero una duda, cuando he ido a tirar el juego me daba un error dejando el script_execute (state), y luego al quitarlo el error se iba y el juego funcionaba, aqui lo dejo muchas gracias
############################################################################################
ERROR in
action number 1
of Step Event0
for object ControlMob1:
script_execute argument 1 incorrect type (undefined) expecting a Number (YYGI32)
at gml_Object_ControlMob1_Step_0 (line 9) - script_execute (state);
############################################################################################
gml_Object_ControlMob1_Step_0 (line 9)
Solo voy a dejar este comentario por si alguien sin mucha experiencia en programación se pierde
.
Una función (script) es básicamente código de muchas líneas para reutilizarlo en otra sección sin que ocupe tantas líneas.
.
Por ejemplo: en una calculadora para multiplicar ++3x2++, la calculadora generalmente tiene funciones de multiplicación integradas que, en lo básico son sumas repetitivas y en donde sus argumentos de entrada son el 3 (arg1) y el 2 (arg2)
.
En simpleza el código de la función se ve más o menos así.
funcion_multiplicar(arg1 aka el '3',arg2 aka el '2'){mientras arg2 >1 entonces {resultado = arg1 + arg1
arg2 = arg2 -1}retornar -resultado-}
Las funciones siempre deben retornar un resultado o modificar una variable que luego usarás en tu código más adelante
.
Con esto escrito, puedes ir a la ventana de código original y hacer llamado a la función_multiplicar(arg1,arg2) sin tener que volver a escribir todo el código interno para hacer una suma entre 2 números
.
Sé que muchos ya tienen experiencia, pero quizás alguien encuentre esto útil o complementario.
Saludos
¿Cómo es que el scr_state_move puede ver las variables creadas en el script scr_get_input (left, down...), si en ningún momento hacemos referencia a él?
Ahí me perdí con el Scope.
Hola Esteban. Al utilizar scr_get_input en el evento step, al no existir esas variables en el objeto, las crea. scr_state_move se ejecuta también en cada step justo después de haberse ejecutado scr_get_input, por lo que todas esas variables ya se encuentran disponibles en el scope. Espero esto te haya ayudado a aclarar.
3 Estados de un personaje
Siguiendo la esencia de el uso de scripts, pasaremos los codigos mas importantes que teniamos en el step de nuestro personaje principal , con el que nos moviamos hacia los diferentes lados, y consigo los sprites que contenian estos movimientos. Para esto seguiremos los sig. pasos.
Primero modificaremos y crearemos un Grupo de scripts el cual llamaremos Player States y dentro de este grupo colocaremos todos los estados de movimiento de nuestro personaje: El estatico, el movimiento normal, y el movimiento de running de nuestro personaje y quedara de la sig forma.
Crearemos los distintos movimientos de nuestro personaje en este caso seran 3, idle, move y run, segun los nombramos en el paso anterior, y cada uno contendra lo siguiente que se explicara a continuación.
scr_state_idle
Este script contendra simplemente el sprite estatico de nuestro personaje y el codigo quedara de la sig. forma.
b.scr_state_moveEn esta parte del codigo colocaremos el movimiento, para lo cual simplemente cortaremos el codigo que tenemos en nuestro step code de el obj_first_player, donde tenemos los condicionales if hasta antes del else y lo pegamos dentro del script y quedaria de la sig manera.
c.scr_state_runningEn esta parte simplemente cortaremos el codigo que teniamos de la animación de correr al presionar la tecla shift y lo colocaremos dentro de nuestro script de correr, y quedaria de la sig forma
Ahora crearemos un condicional if dentro de el step code de nuestro personaje principal en el cual la condicion seran las variables que declaramos en la lección anterior, las cuales serian right, left, up y down, (las cuales contendran la asignación y el chequeo del presionado de las teclas), si detecta alguno de esto, asignaremos el script de movimiento llamado anteriormente scr_state_move, y si no se esta moviendo hacer llamado del script de idle llamado: scr_state_idle, y quedaria de la sig forma.
Para casi finalizar colocaremos el nombre scr_state_running, donde asignaremos para que se active el script de correr donde tambien tendra lugar el sprite de movimiento de correr.
Excelente, este método se lleva muy bien con el enumerador y te facilita las cosas
muchas gracias. Todo me funciono sin problemas :D
me sale un error y no me corre el juego :(
alguien sabe que puedo tener mal?
ya supe por que tenia
state = src_state_move();
En lugar de
state = src_state_move;
GRACIASSSS
Excelente clase e implementación de los Scripts en nuestro código.
Me esta encantando tu curso esta genial, pero una duda, cuando he ido a tirar el juego me daba un error dejando el script_execute (state), y luego al quitarlo el error se iba y el juego funcionaba, aqui lo dejo muchas gracias
############################################################################################
ERROR in
action number 1
of Step Event0
for object ControlMob1:
script_execute argument 1 incorrect type (undefined) expecting a Number (YYGI32)
at gml_Object_ControlMob1_Step_0 (line 9) - script_execute (state);
############################################################################################
gml_Object_ControlMob1_Step_0 (line 9)
¡Hola! Al parecer tu variable state está mal apuntada, porque no le estás enviando un script como tal, sino probablemente una cadena de texto. Mi sugerencia es que revises bien en donde la estás asignando.
descubrí el error, estaba poniéndole paréntesis cuando guardaba la función en la variable.
Buenas, no me quedó claro cual es la utilidad de script_execute. ¿Alguien puede echarme una mano con eso? Gracias.