Introducción al Desarrollo de Videojuegos con GameMaker · Módulo 2: Sprites, objetos, eventos, instancias y rooms.
Creación de objetos y su relación con los sprites
Clase 7 de 60 · 50 min
También disponible en: EN
Introducción: La dualidad visual y lógica en GameMaker
Uno de los obstáculos conceptuales más comunes al iniciarse en el desarrollo de videojuegos es asumir que las imágenes que vemos en pantalla son elementos independientes que actúan por sí mismos. En GameMaker, una imagen estática o animada no posee la capacidad intrínseca de moverse, procesar colisiones, tomar decisiones ni recordar información como la salud o la puntuación. Para dotar de vida a un proyecto, el motor establece una frontera nítida entre dos conceptos: el recurso gráfico (Sprite) y la entidad lógica (Objeto).
Un sprite es un recurso pasivo compuesto por píxeles estructurados en uno o varios fotogramas (subimágenes), junto con datos de origen y máscaras de colisión. Por el contrario, un objeto es una plantilla abstracta de comportamiento que alberga variables, responde a eventos y ejecuta lógica en cada ciclo del juego (frame o step). En esta lección aprenderás cómo se crea un objeto, de qué manera se le asigna una representación gráfica y cómo el motor sincroniza ambas capas.

Diferencias técnicas fundamentales: Sprites frente a Objetos
Para evitar confusiones a la hora de estructurar un videojuego, conviene analizar en detalle las responsabilidades técnicas de cada elemento dentro de la memoria y la ejecución de GameMaker.
| Característica | Sprite (Recurso gráfico) | Objeto (Entidad lógica) |
|---|---|---|
| Naturaleza | Dato gráfico y máscara de colisión. | Contenedor de lógica, eventos y variables. |
| Identificador por defecto | Prefijo spr_ (ejemplo: spr_jugador_quieto). | Prefijo obj_ (ejemplo: obj_jugador). |
| Presencia en memoria | Textura almacenada en la memoria de vídeo (VRAM). | Estructura de datos gestionada por la CPU en la RAM. |
| Capacidad de cómputo | Ninguna. No contiene código ni eventos. | Total. Ejecuta scripts, calcula físicas e interacciones. |
| Colocación directa en niveles | Solo como decoración gráfica en capas de assets. | Como instancias interactivas en capas de instancias. |
| Multiplicidad | Un sprite puede asociarse a cientos de objetos distintos. | Un objeto puede alternar dinámicamente entre múltiples sprites. |
La metáfora clásica del teatro resulta muy útil: el sprite es el disfraz o la máscara visual, mientras que el objeto es el actor interior. El actor puede cambiarse de ropa (cambiar de sprite al saltar, correr o recibir daño), actuar sin disfraz alguno (un objeto invisible que controle el audio del nivel o el sistema de oleadas) o compartir el mismo disfraz idéntico con otros actores sin que sus mentes o estados individuales interfieran.
Paso a paso: Creación y configuración de un objeto
En la lección anterior importamos el sprite básico de nuestro personaje de plataformas retro denominado spr_jugador_quieto. Ahora convertiremos ese recurso visual en una entidad viva mediante los siguientes pasos dentro del entorno de GameMaker:
1. Localiza el panel Asset Browser (Explorador de recursos) situado habitualmente en el lateral derecho de la pantalla. 2. Haz clic derecho sobre la carpeta Objects (o pulsa Alt + O) y selecciona Create -> Object. 3. En el campo Name (Nombre), escribe de forma estricta obj_jugador. Mantener la consistencia con el prefijo obj_ es una norma de la industria que evita errores graves de colisión de nombres en el código. 4. En la ventana del Object Editor (Editor de objetos), ubica la casilla Sprite en el sector izquierdo. Haz clic sobre el recuadro que actualmente muestra 'No Sprite'. 5. Se abrirá una ventana emergente de selección de recursos. Selecciona el recurso spr_jugador_quieto que preparamos en la clase pasada.
💡 Importante: Jamás nombres un objeto con el mismo identificador que un sprite. Si llamas 'jugador' tanto al sprite como al objeto, GameMaker arrojará errores de referencia o asignará variables de forma imprevista durante la compilación, puesto que ambos nombres se registran en una tabla global de índices enteros.
Propiedades estructurales del Object Editor
Dentro del Editor de Objetos existen casillas de verificación que alteran radicalmente el comportamiento del objeto antes de escribir una sola línea de código GML:
- Visible: Si está marcado (valor por defecto), el motor dibuja automáticamente el sprite asignado en cada fotograma. Si se desmarca, el objeto seguirá ejecutando toda su lógica interna y colisiones, pero será totalmente invisible para el jugador. - Solid: Es una función heredada clásica de colisión estática. En el desarrollo moderno con GML Code se recomienda mantenerla desactivada, ya que gestionaremos el contacto con el terreno mediante programación precisa en módulos posteriores. - Persistent: Determina si el objeto se destruye al cambiar de sala (Room) o si sobrevive intacto a través de los diferentes niveles. Debe permanecer desactivado para entidades convencionales como enemigos o el jugador base de este nivel. - Uses Physics: Activa el motor de físicas Box2D integrado. Para nuestro juego de plataformas retro utilizaremos física basada en código aritmético manual, por lo que esta opción debe permanecer desmarcada.
Variables nativas de sprites en GML Code
Al vincular un sprite a un objeto, GameMaker inicializa automáticamente un conjunto de variables internas reservadas. Dichas variables pertenecen al ámbito propio de la instancia y permiten modificar la apariencia gráfica en tiempo real desde cualquier evento con código GML.
| Variable nativa | Tipo de dato | Función principal |
|---|---|---|
| sprite_index | Asset de sprite (ID) | Define qué recurso gráfico está usando la instancia en el fotograma actual. |
| image_index | Real (Decimal) | Subimagen o fotograma específico de la animación que se está dibujando. |
| image_speed | Real (Multiplicador) | Factor de escala para la velocidad de animación (1.0 = velocidad normal, 0 = pausa). |
| image_xscale | Real (Factor) | Escala horizontal del sprite. El valor 1.0 es el tamaño original; -1.0 produce un volteo en espejo. |
| image_yscale | Real (Factor) | Escala vertical del sprite. El valor 1.0 representa escala natural. |
| image_alpha | Real (0.0 a 1.0) | Transparencia de la instancia. 1.0 es opacidad total y 0.0 es invisible. |
| image_blend | Color (Hexadecimal/Constante) | Tinte de color aplicado sobre los píxeles (c_white dibuja los colores originales). |
| mask_index | Asset de sprite (ID) | Sprite cuya máscara de colisión se utilizará en lugar de la del sprite activo. |
Implementación práctica: Modificando la apariencia desde código
Para consolidar cómo el objeto manipula al sprite, vamos a configurar nuestro primer bloque de inicialización en obj_jugador usando GML Code. Aunque profundizaremos en el evento Create en la siguiente clase, realizaremos esta primera toma de contacto indispensable.
Dentro del Editor de Objetos de obj_jugador, haz clic en el botón Add Event (Añadir evento), selecciona el evento Create y asegúrate de elegir GML Code si la ventana te ofrece alternar entre GML Code y GML Visual. Escribe las siguientes instrucciones:
// Inicialización de propiedades gráficas de obj_jugador
// Evento: Create
// Garantizamos que el sprite activo sea el asignado inicialmente
sprite_index = spr_jugador_quieto;
// Configuramos que la animación comience estrictamente en su primer fotograma
image_index = 0;
// Detenemos temporalmente el ciclo de animación hasta que el jugador se desplace
image_speed = 0;
// Aseguramos una orientación horizontal hacia la derecha y escala regular 1:1
image_xscale = 1;
image_yscale = 1;
// Opacidad completa y tinte natural sin alteración cromática
image_alpha = 1.0;
image_blend = c_white;Si ejecutas la prueba rápida con F5, la instancia de obj_jugador se representará en pantalla exactamente con su fotograma inicial detenido, demostrando que la lógica del objeto tiene autoridad total sobre los parámetros de reproducción del recurso visual.
Objetos invisibles (Gestores y controladores)
No todos los objetos requieren un sprite. Una de las técnicas arquitectónicas más relevantes en GameMaker es la creación de controladores lógicos, a menudo llamados 'Game Managers'. Estos son objetos creados sin ningún sprite asignado ('No Sprite').
Un objeto sin sprite sigue poseyendo posición en la sala y ejecuta todos sus eventos con absoluta normalidad. Se utiliza habitualmente para reproducir música de fondo, controlar el reloj de la partida, contabilizar las monedas obtenidas o verificar si el jugador ha completado los objetivos del nivel. Separar la lógica global de las entidades visuales garantiza que el código de juego permanezca modular y limpio.
GML Visual frente a GML Code en la gestión gráfica
GameMaker permite gestionar estas propiedades tanto mediante bloques visuales de nodos (GML Visual) como con líneas de código directo (GML Code). En GML Visual, alterar un sprite requiere arrastrar el bloque 'Set Instance Sprite' e indicar el recurso y la subimagen mediante campos de texto interactivos. Sin embargo, en la industria profesional y a lo largo de este curso utilizaremos GML Code, ya que escribir sentencias directas como 'sprite_index = spr_salto;' resulta significativamente más rápido, fácil de depurar, escalable y preciso para coordinar mecánicas complejas.
Ejercicios prácticos
Lleva a cabo las siguientes tres actividades para fijar el dominio sobre la relación entre objetos y sprites en tu proyecto actual:
Ejercicio 1 (Configuración de entidad base): Crea un nuevo objeto en tu proyecto con el nombre obj_bloque_suelo. Asígnale un sprite estático de 32x32 píxeles representativo de una losa de piedra o tierra (por ejemplo, spr_bloque_tierra). Asegúrate de que las opciones Visible permanezca activa y Solid desactivada. Comprobación: Al abrir las propiedades del objeto, la miniatura gráfica del bloque debe ser visible a la izquierda y el identificador no debe contener espacios ni caracteres especiales.
Ejercicio 2 (Manipulación visual mediante código): Abre el objeto obj_jugador que creamos durante la clase. En su evento Create, modifica intencionadamente las variables nativas para que el personaje comience con una escala horizontal y vertical aumentada al doble (image_xscale = 2; image_yscale = 2;) y con un nivel de semitransparencia del 50% (image_alpha = 0.5;). Comprobación: Al arrastrar una instancia de obj_jugador a la sala de prueba y presionar F5, el personaje debe aparecer renderizado al doble de su tamaño normal y parcialmente translúcido en pantalla.
Ejercicio 3 (Creación de un controlador abstracto): Crea en el Asset Browser un objeto denominado obj_control_juego. No le asignes ningún sprite (debe conservar el recuadro 'No Sprite'). Añade el evento Create e inserta un comentario explicativo en GML Code indicando que este objeto administrará la música y la puntuación general. Comprobación: En el Asset Browser, el objeto debe figurar con el icono transparente o con signo de interrogación por defecto que denota la ausencia de un recurso gráfico, confirmando la existencia de una entidad puramente lógica.
Resumen
- Un sprite es un recurso de textura pasivo; un objeto es la estructura lógica activa que ejecuta eventos y código.
- El ciclo visual de un objeto se gobierna a través de variables nativas integradas: sprite_index, image_index, image_speed, image_xscale, image_yscale, image_alpha e image_blend.
- Los nombres de sprites y objetos nunca deben duplicarse; se emplean convenciones estándar con prefijos (spr_ y obj_) para diferenciarlos inequívocamente.
- Un objeto puede existir y operar sin un sprite vinculado, lo cual constituye el estándar de diseño para controladores de sistemas, música y datos globales.
Practica lo aprendido
Ejercicio 1 · 1 punto
Relaciona cada variable nativa de GML con la propiedad visual que controla en la instancia según el texto de la lección:
- sprite_index
- image_speed
- image_xscale
- image_alpha
Ejercicio 2 · 2 puntos
Escribe en GML Code las asignaciones necesarias para el evento Create que permitan: detener el ciclo de animación (velocidad 0), voltear horizontalmente la orientación del personaje (escala horizontal -1) y ajustar su opacidad al 50% (0.5).
Tu código no se ejecuta: se comprueban requisitos concretos sobre el texto.
Ejercicio 3 · 1 punto
¿Qué ocurre con un objeto en GameMaker si se desmarca la casilla 'Visible' en el Object Editor?
Ingresa para guardar tu progreso — Ingresar