Persistencia de objetos entre rooms en GameMaker

Resumen

Cuando tu personaje cambia de room en GameMaker Studio y pierde toda su información, no es un bug: es el comportamiento por defecto del motor. Aquí aprenderás a usar objetos persistentes y variables globales para conservar datos como la vida del jugador entre cuartos, una técnica clave para cualquier desarrollador que esté construyendo su primer videojuego.

¿Qué tipos de variables existen en GameMaker Studio?

Antes de entrar en persistencia, conviene repasar el scope de las variables, porque define desde dónde puedes leerlas y modificarlas.

  • Variables de instancia: aparecen en azul en el editor. Solo son accesibles desde la instancia que las creó. Si quieres leerlas desde otro objeto, necesitas anteponer el nombre, por ejemplo objEnemyNew.state.
  • Variables locales: aparecen en amarillo. Son volátiles, se autodestruyen tras usarse y son ideales para funciones pequeñas, scripts o procesos recursivos donde no quieres ocupar memoria.
  • Variables globales: aparecen en rosado. Se definen con la sintaxis global.hp = 100 y quedan disponibles desde cualquier objeto, sin importar dónde las hayas declarado [02:00].

¿Qué es una variable global en GameMaker? Es una variable accesible desde cualquier objeto del proyecto. Se declara con la palabra global seguida de un punto y el nombre, por ejemplo global.hp.

¿Qué es la persistencia de objetos y para qué sirve?

La persistencia es una opción que activas en un objeto para que sus instancias no se eliminen al finalizar un room. Por defecto, cuando cambias de cuarto, GameMaker destruye todas las instancias y crea unas nuevas, aunque parezcan el mismo personaje [03:30].

Eso explica por qué tu jugador entra al room dos con vida llena aunque venga golpeado del room uno: técnicamente es otra instancia del mismo objeto.

¿Por qué se resetea la vida al cambiar de room? Porque el personaje del nuevo cuarto es una instancia distinta. GameMaker destruye la anterior y crea una nueva con los valores iniciales del evento Create.

¿Por qué los objetos persistentes pueden ser peligrosos?

Aunque suenan como la solución mágica, los objetos persistentes requieren cuidado. Si no los instancias o eliminas correctamente, pueden:

  • Acumularse y consumir memoria de video.
  • Generar múltiples instancias duplicadas que confundan tu lógica.
  • Mantener datos viejos que rompan el comportamiento esperado.

La regla práctica: antes de instanciar un persistente, verifica si ya existe uno en el juego.

¿Cómo crear un GameController persistente paso a paso?

La solución para conservar la vida del jugador entre rooms es construir un controlador que actúe como save state. Este patrón es escalable: hoy guarda el HP, mañana puede guardar estados de enemigos, items o progreso.

¿Cómo configurar el objeto controlador?

Crea un objeto llamado objGameController sin sprite, ya que solo cumplirá funciones lógicas. Activa la opción Persistent en sus propiedades; GameMaker te confirma con el mensaje "Instances of this object will persist across rooms" [05:30].

En su evento Create, declara la variable que almacenará la vida:

gml player_hp = 100;

La nomenclatura player_hp (en lugar de solo hp) sirve para diferenciar variables cuando agregues más datos, como enemy_hp u otros estados.

¿Cómo conectar al jugador con el controlador?

En objPlayer, modifica el evento Create para que tome la vida del controlador en lugar de un valor fijo:

gml hp = objGameController.player_hp;

Luego añade el evento Room End, que se dispara justo antes de cambiar de cuarto. Ahí guardas el estado actual:

gml objGameController.player_hp = hp;

Con esto cierras el ciclo: al salir de un room guardas la vida, al entrar al siguiente la recuperas.

¿Cómo evitar el error de variable no definida?

Al correr el juego por primera vez, es probable que recibas un error tipo "variable not set before reading it" apuntando a objGameController.player_hp. Esto ocurre por el orden de creación de instancias dentro del room.

GameMaker instancia los objetos en el orden en que los arrastraste al cuarto. Si el objPlayer se crea antes que el objGameController, su evento Create intenta leer una variable que aún no existe [10:00].

La solución está en el panel Instance Creation Order dentro del room: arrastra el objGameController al primer lugar para que se instancie antes que el jugador.

¿Cómo cambio el orden de creación de instancias en un room? Abre el room, ve al panel Instance Creation Order y reordena los objetos arrastrándolos. El primero de la lista se crea primero.

¿Por qué probar y guardar tu proyecto constantemente?

En el ejemplo del curso aparecieron dos errores casi idénticos: escribir hp en vez de player_hp en el evento Create y otra vez en el Room End. Ambos eran simples errores de dedo, pero rompían toda la lógica de persistencia.

La lección es directa: prueba tu videojuego cada vez que cambies algo significativo. Así identificas qué modificación introdujo el error y lo corriges sin tener que rastrear cientos de líneas. GameMaker guarda automáticamente el proyecto cada vez que corres el juego, así que tienes una red de seguridad básica.

Al final, cuando todo encaja, el jugador entra al room dos conservando los 52 de vida con los que salió del room uno. Esa continuidad es la ilusión que vale la pena construir.

¿Qué otros datos te gustaría guardar en tu GameController? Comparte tu idea en los comentarios y construyamos juntos mejores soluciones.