Introducción al Desarrollo de Videojuegos con GameMaker · Módulo 2: Sprites, objetos, eventos, instancias y rooms.
Eventos principales: Create, Step y Destroy
Clase 8 de 60 · 60 min
También disponible en: EN
Introducción: La naturaleza reactiva de GameMaker
En las lecciones anteriores exploramos qué es un sprite y cómo asociarlo a un objeto para darle una representación gráfica dentro del entorno del juego. Sin embargo, una imagen fija o estática no constituye un videojuego por sí sola. Para que un elemento cobre vida, tome decisiones, responda a las acciones del jugador y desaparezca en el momento adecuado, necesita una lógica interna organizada en el tiempo.
GameMaker opera bajo una arquitectura orientada a eventos. Esto significa que el motor no ejecuta un único bloque masivo de código continuo de principio a fin, sino que divide el funcionamiento de cada elemento en situaciones específicas denominadas «Eventos». Los eventos son disparadores automáticos que le dicen al motor: «cuando ocurra esto en el mundo virtual, ejecuta de inmediato este bloque de instrucciones».
Dentro de la amplia lista de eventos disponibles, existen tres que forman la columna vertebral del ciclo de vida de cualquier entidad: Create (Creación), Step (Paso o Fotograma) y Destroy (Destrucción). Dominar el momento exacto y la frecuencia con la que se ejecutan estos tres eventos es el pilar fundamental sobre el que construirás mecánicas sólidas, desde el movimiento del personaje hasta la gestión de proyectiles y enemigos.
El ciclo de vida de una instancia
Cuando colocamos un objeto en un nivel o lo generamos dinámicamente mediante código, el motor no manipula la plantilla abstracta del objeto, sino una «instancia» viva y única de este en la memoria RAM. Toda instancia atraviesa un ciclo vital predecible compuesto por tres etapas: su nacimiento en el mundo del juego, su existencia activa fotograma tras fotograma, y finalmente su eliminación definitiva de la escena.

Comprender este flujo evita los errores más comunes de los programadores principiantes, como intentar declarar variables dentro de eventos repetitivos o esperar que un código de inicialización se ejecute de nuevo sin haber recreado la instancia.
El Evento Create: El nacimiento y la preparación
El evento Create se dispara una única vez en toda la vida útil de una instancia, en el instante exacto en que dicha instancia aparece en el mundo del juego. Esto sucede en dos circunstancias: al arrancar un nivel (Room) si la instancia fue colocada previamente de forma visual en el editor de niveles, o de manera dinámica durante la partida mediante funciones de creación en código como `instance_create_layer()`.
La función primordial del evento Create es la inicialización del estado: aquí declaramos todas las variables que la instancia necesitará utilizar a lo largo de su existencia, establecemos valores de inicio (salud, velocidad, estado inicial, contadores) y realizamos cualquier cálculo preliminar que no deba repetirse constantemente.
💡 Regla de oro: Nunca utilices una variable en un evento Step o Draw sin haberla definido antes en el evento Create. Si intentas leer una variable no inicializada, GameMaker detendrá la ejecución del juego con un error crítico por lectura de variable desconocida.
Veamos cómo estructuramos el evento Create para nuestro personaje protagonista en el juego de plataformas retro que desarrollaremos a lo largo del curso. En el panel de recursos (Asset Browser), seleccionamos nuestro objeto `obj_jugador`, hacemos clic en «Add Event» (Añadir Evento), seleccionamos «Create» y elegimos «GML Code» como método de edición.
// ========================================================
// OBJETO: obj_jugador
// EVENTO: Create
// PROPÓSITO: Declarar variables de control y movimiento
// ========================================================
// Velocidad y física de movimiento
velocidad_horizontal = 0;
velocidad_vertical = 0;
velocidad_caminar = 4;
gravedad_fuerza = 0.3;
fuerza_salto = -7;
// Estadísticas y estado del personaje
puntos_vida = 3;
estado_actual = "quieto";
puede_moverse = true;
// Mensaje de diagnóstico en la consola para confirmar el nacimiento
show_debug_message("Instancia de obj_jugador creada exitosamente.");En este fragmento, establecemos las propiedades base de nuestro jugador. Las variables como `velocidad_caminar` almacenan números que determinarán qué tan rápido se traslada la entidad, mientras que `puntos_vida` define la resistencia antes de ser derrotado. Observa que el evento Create no realiza ningún desplazamiento; simplemente prepara el tablero para que el resto del motor pueda operar con datos coherentes.
El Evento Step: El corazón latente del bucle de juego
A diferencia del evento Create, el evento Step se ejecuta continuamente en cada fotograma del juego. Si la velocidad de fotogramas del proyecto está configurada en 60 fotogramas por segundo (FPS, valor predeterminado estándar en GameMaker), el código alojado dentro del evento Step se procesará exactamente 60 veces por segundo durante todo el tiempo que la instancia exista.
El evento Step representa el bucle de actualización principal de la entidad. Aquí se sitúa la lógica que debe evaluarse en tiempo real de manera constante: la comprobación de si el usuario ha pulsado una tecla del teclado o del mando, la aplicación de la gravedad sobre la posición vertical, la verificación continua de proximidad con otros objetos y el cambio de estados lógicos.
Dentro de GameMaker, el evento Step se subdivide en tres subeventos específicos que se ejecutan en un orden estricto dentro de cada ciclo de fotograma:
| Subevento | Orden de ejecución | Uso recomendado |
|---|---|---|
| Begin Step | 1. Al inicio del fotograma | Preparación previa, reinicio de banderas booleanas temporales, lectura de sensores externos antes de procesar lógica principal. |
| Step (Principal) | 2. En la mitad del fotograma | Manejo de entradas de usuario (inputs), cálculo de físicas, toma de decisiones de inteligencia artificial y control de mecánicas principales. |
| End Step | 3. Al final del fotograma | Ajustes de cámara para seguir al jugador una vez que este ya se movió, corrección final de posiciones y actualización de orientación de sprites. |
Para la gran mayoría de tus necesidades de programación al comenzar, el evento Step estándar (el del medio) será el lugar idóneo donde colocarás casi la totalidad de tus mecánicas de control.
Observemos un ejemplo concreto. En el mismo objeto `obj_jugador`, añadimos el evento Step (estándar) con el siguiente código. Observa cómo este script hace uso de las variables previamente definidas en el evento Create:
// ========================================================
// OBJETO: obj_jugador
// EVENTO: Step
// PROPÓSITO: Leer controles y actualizar la posición x/y
// ========================================================
// Verificamos si la instancia tiene autorización para procesar movimiento
if (puede_moverse == true)
{
// Lectura de teclas del teclado (flechas o A/D)
var tecla_derecha = keyboard_check(vk_right) || keyboard_check(ord("D"));
var tecla_izquierda = keyboard_check(vk_left) || keyboard_check(ord("A"));
// Calculamos el sentido horizontal: 1 (derecha), -1 (izquierda) o 0 (quieto)
var direccion_horizontal = tecla_derecha - tecla_izquierda;
// Calculamos la velocidad horizontal en píxeles para este fotograma
velocidad_horizontal = direccion_horizontal * velocidad_caminar;
// Aplicamos el movimiento a la coordenada intrínseca X de GameMaker
x = x + velocidad_horizontal;
}
// Detección de pérdida de vidas: si la salud llega a cero, iniciamos la eliminación
if (puntos_vida <= 0)
{
instance_destroy();
}Este código ilustra la sinergia entre Create y Step. En el Create definimos `velocidad_caminar = 4` una sola vez. En el Step, esa cifra se multiplica 60 veces por segundo según las teclas presionadas por el usuario, actualizando la posición `x` de la instancia de forma fluida.
💡 Alerta de rendimiento: Evita crear o declarar estructuras pesadas o inicializar variables simples dentro del evento Step con la intención de fijar un valor fijo. Si escribes «velocidad = 5;» en el Step, estarás sobreescribiendo esa memoria 60 veces por segundo innecesariamente, impidiendo además que otros eventos puedan alterar temporalmente dicho valor.
El Evento Destroy: La despedida y el orden en memoria
El evento Destroy se activa en el momento preciso en que una instancia es retirada del mundo del juego mediante la llamada a la función nativa `instance_destroy()`. Al igual que Create, se ejecuta exactamente una única vez por instancia, justo antes de que GameMaker libere los recursos de dicha entidad de la memoria.
Es fundamental distinguir entre dos eventos que GameMaker ofrece para la finalización: el evento «Destroy» y el evento «Clean Up». Mientras que Destroy se invoca específicamente cuando eliminamos la instancia como parte de las mecánicas del juego (por ejemplo, cuando un enemigo muere o una moneda es recogida), el evento Clean Up se dispara siempre que la instancia sale de la memoria por cualquier motivo, incluyendo el cierre del juego o el cambio de una Room a otra.
El evento Destroy es el sitio perfecto para desencadenar consecuencias lógicas que deben suceder como resultado directo de la desaparición de la entidad: generar una explosión cosmética, soltar un ítem coleccionable tras la derrota de un enemigo, otorgar puntos al marcador global o reproducir una animación de fragmentación.
Escribamos la implementación completa de este proyectil para ver cómo encajan los tres eventos de manera ordenada.
// ========================================================
// OBJETO: obj_disparo
// EVENTO: Create
// ========================================================
velocidad_bala = 8;
direccion_x = 1; // 1 = hacia la derecha, -1 = hacia la izquierda
tiempo_de_vida = 120; // A 60 FPS, 120 fotogramas equivalen a 2 segundos exactos// ========================================================
// OBJETO: obj_disparo
// EVENTO: Step
// ========================================================
// 1. Desplazamos la bala continuamente hacia la dirección establecida
x = x + (velocidad_bala * direccion_x);
// 2. Reducimos el contador de vida útil en 1 unidad en cada fotograma
tiempo_de_vida = tiempo_de_vida - 1;
// 3. Evaluamos si el tiempo ha expirado
if (tiempo_de_vida <= 0)
{
// Esta instrucción invoca de inmediato el evento Destroy y remueve la bala
instance_destroy();
}// ========================================================
// OBJETO: obj_disparo
// EVENTO: Destroy
// ========================================================
// Mostramos un mensaje de diagnóstico que simula la generación de partículas de impacto
show_debug_message("El disparo ha impactado o expirado en X: " + string(x) + ", Y: " + string(y));
// Aquí se instanciarían efectos secundarios, como un sonido de impacto o un sprite de humoComparativa de eventos clave
Para afianzar cuándo debes elegir un evento u otro durante el diseño de tus objetos, utiliza esta tabla comparativa rápida como guía de referencia mental durante tus sesiones de programación:
| Evento | Frecuencia de disparo | Responsabilidad primordial | Lo que NUNCA debes hacer aquí |
|---|---|---|---|
| Create | Una sola vez, en el momento del nacimiento de la instancia. | Definir variables, fijar parámetros iniciales y configurar temporizadores. | Intentar leer entradas del teclado (el jugador no tendrá tiempo de presionar nada en el milisegundo de creación). |
| Step | Repetitivo, cada fotograma (habitualmente 60 veces por segundo). | Verificar controles de entrada, calcular colisiones, modificar coordenadas x/y y actualizar inteligencia artificial. | Declarar variables nuevas que deban conservar su valor acumulado de un fotograma a otro. |
| Destroy | Una sola vez, inmediatamente antes de ser borrado de la memoria. | Entregar recompensas (puntos, monedas), dejar escombros o crear instancias de explosión. | Intentar mover la propia instancia o asignarle nuevas órdenes continuas de navegación. |
GML Code versus GML Visual en el ciclo de vida
Aunque en este curso utilizamos GML Code como estándar profesional debido a su velocidad, claridad y portabilidad, GameMaker ofrece también GML Visual (anteriormente conocido como Drag and Drop). En GML Visual, estos tres eventos funcionan con idéntica lógica temporal. La única diferencia radica en la representación: en lugar de escribir sentencias como `x = x + velocidad`, el desarrollador arrastra bloques gráficos como «Assign Variable» dentro de la lista de acciones del evento Create o Step.
Los eventos no dependen del lenguaje que elijas; son el mecanismo interno del motor para sincronizar la simulación. Comprender el orden de Create, Step y Destroy te permitirá programar con soltura en código escrito o comprender cualquier tutorial visual que encuentres en la comunidad de desarrollo.
Actividades prácticas
Lleva a cabo las siguientes tres actividades prácticas en tu proyecto de GameMaker para consolidar la sincronización de eventos y experimentar de primera mano su comportamiento en tiempo de ejecución.
Resumen
- El ciclo de vida de una instancia en GameMaker se gestiona mediante eventos predefinidos que reaccionan a etapas clave de la simulación.
- El evento Create se ejecuta una única vez al nacer la instancia; su rol fundamental es declarar e inicializar variables con valores iniciales seguros.
- El evento Step corre de forma ininterrumpida una vez por fotograma (normalmente a 60 FPS) y contiene la lógica de movimiento, controles de usuario y detección continua.
- El evento Step cuenta con fases complementarias: Begin Step (preparación preliminar) y End Step (actualización final y cámaras).
- El evento Destroy se activa inmediatamente antes de que una llamada a instance_destroy() retire la entidad de la memoria, siendo ideal para efectos de impacto, recompensas o sonidos de muerte.
Practica lo aprendido
Ejercicio 1 · 1 punto
Relaciona cada evento fundamental de GameMaker con su propósito y frecuencia dentro del ciclo de vida de una instancia:
- Evento Create
- Evento Step
- Evento Destroy
Ejercicio 2 · 1 punto
¿Qué consecuencia tiene en GameMaker intentar leer o utilizar una variable en el evento Step sin haberla definido previamente en el evento Create?
Ejercicio 3 · 1 punto
Completa los enunciados sobre el funcionamiento interno de GameMaker: 1. El evento actúa como el bucle de actualización principal y se ejecuta continuamente en cada fotograma de la partida. 2. Para eliminar una entidad del mundo del juego y activar su evento de despedida, se utiliza la función nativa ().
Ingresa para guardar tu progreso — Ingresar