04/06/2009
Los sprites son el alma visual de cualquier juego. Son las imágenes que representan a tus personajes, enemigos, objetos y elementos del escenario. En GameMaker, dominar cómo se muestran y manipulan los sprites es un paso fundamental para pasar de una idea a un proyecto jugable y atractivo. En este artículo exhaustivo, te guiaremos a través de todo lo que necesitas saber, desde la forma más simple de dibujar un sprite en pantalla hasta técnicas avanzadas de transformación y el uso de la capa GUI para interfaces de usuario perfectas.

¿Qué es un Sprite en GameMaker?
Antes de sumergirnos en el código, aclaremos el concepto. Un sprite no es solo una imagen estática. En GameMaker, un recurso de sprite puede contener una o varias imágenes (llamadas sub-imágenes o frames) que, al mostrarse en secuencia, crean una animación. Piensa en el clásico sprite de un personaje caminando: cada frame es una pose ligeramente diferente que, al reproducirse rápidamente, crea la ilusión de movimiento. Un requisito crucial es que todas las sub-imágenes dentro de un mismo sprite deben tener exactamente el mismo tamaño para que GameMaker pueda manejarlas correctamente.
La Forma Más Sencilla de Mostrar un Sprite
La manera más directa de hacer que un sprite aparezca en tu juego es asignándolo a un objeto. Simplemente crea un objeto nuevo, asígnale el sprite que deseas desde el menú desplegable y luego arrastra una instancia de ese objeto a tu room. ¡Listo! Cuando ejecutes el juego, verás tu sprite en la posición donde colocaste la instancia. Este método es perfecto para elementos estáticos o para personajes principales cuyo sprite no cambiará drásticamente, pero pronto descubrirás que necesitas más control.
Control Total: Dibujando Sprites con Código
Para tener un control dinámico y flexible, necesitarás usar código. Esto se hace principalmente en el evento Draw de un objeto. Sin embargo, hay una regla de oro que debes recordar: en el momento en que añades un evento Draw a un objeto, GameMaker deja de dibujar el sprite asignado automáticamente. ¡No te asustes si tu personaje desaparece! Es un comportamiento esperado.

La Importancia de `draw_self()`
Para solucionar la desaparición de tu sprite, la primera línea en tu evento Draw casi siempre debería ser la función draw_self(). Esta función le dice a GameMaker: "Oye, antes de hacer cualquier otra cosa que te pida, por favor, dibuja el sprite que este objeto tiene asignado por defecto". Una vez hecho esto, puedes añadir más código para dibujar otros sprites encima o debajo.
El Orden de Dibujado es Crucial
Imagina que GameMaker es un pintor. Cada función de dibujo que llamas es una pincelada sobre el lienzo. Lo que se dibuja primero queda debajo de lo que se dibuja después. Si dibujas un icono y luego llamas a `draw_self()`, el sprite del objeto tapará el icono. Si lo haces al revés, el icono se dibujará encima del sprite del objeto. Mantén siempre presente este orden para evitar errores visuales.
// Ejemplo de orden de dibujado correcto
draw_self(); // Dibuja primero el sprite del objeto (el cofre)
draw_sprite(spr_icono, 0, x, y); // Luego dibuja el icono encima
Manipulando tu Sprite: Transformaciones en Tiempo Real
Aquí es donde la magia realmente comienza. GameMaker te ofrece un conjunto de variables y funciones para modificar la apariencia de tus sprites en tiempo real. Esto es esencial para crear efectos, animaciones y respuestas interactivas.

Cambiar el Tamaño (Escalado)
Puedes cambiar el tamaño de un sprite de dos maneras principales:
- Variables de Instancia (`image_xscale`, `image_yscale`): Cada instancia tiene estas variables. Por defecto, su valor es 1. Si estableces `image_xscale = 2;`, el sprite se dibujará al doble de su ancho. Si `image_yscale = 0.5;`, se dibujará a la mitad de su alto. Importante: Modificar estas variables también escala la máscara de colisión del objeto. Esto es útil si quieres que el "hitbox" crezca o se encoja con el sprite, pero puede ser problemático si solo buscas un efecto visual.
- Función `draw_sprite_ext()`: Esta es la navaja suiza del dibujado de sprites. Te permite especificar la escala en el momento del dibujo, sin afectar a la instancia original ni a su máscara de colisión.
// Usando draw_sprite_ext para escalar un icono
var _escala = 0.5;
if (distance_to_object(obj_jugador) < 100) {
_escala = 1;
}
draw_sprite_ext(spr_icono, 0, x, y, _escala, _escala, 0, c_white, 1);
Rotar el Sprite
La rotación se mide en grados, de 0 a 360, en sentido antihorario.
- Variable de Instancia (`image_angle`): Cambiar el valor de
image_anglerotará tanto el sprite como su máscara de colisión. Puedes incrementarlo en cada paso para crear una rotación constante: `image_angle += 2;`. - Función `draw_sprite_ext()`: El séptimo argumento de esta función es la rotación. Al igual que con la escala, esto te permite dibujar una versión rotada del sprite sin alterar la máscara de colisión de la instancia.
Cambiar el Color (Tinte)
Puedes aplicar un tinte de color a tus sprites para indicar estados (dañado, envenenado, seleccionado, etc.).
- Variable de Instancia (`image_blend`): Esta variable toma una constante de color (como `c_red`, `c_yellow`) o un color personalizado. El color que elijas se mezclará con los colores originales del sprite. Para volver a la normalidad, simplemente establece `image_blend = c_white;`.
- Función `draw_sprite_ext()`: El octavo argumento es el color de mezcla. Funciona exactamente igual que `image_blend`, dándote control sobre sprites dibujados individualmente.
Ajustar la Transparencia (Alpha)
La transparencia se controla con un valor entre 0 (completamente invisible) y 1 (completamente opaco).

- Variable de Instancia (`image_alpha`): Modificar esta variable hará que toda la instancia se desvanezca. Es genial para efectos de aparición/desaparición o para indicar que un objeto está inactivo.
- Función `draw_sprite_ext()`: El último argumento de la función es el valor alfa, permitiéndote dibujar sprites semitransparentes sin afectar la visibilidad de la instancia principal.
Tabla Comparativa: Variables de Instancia vs. `draw_sprite_ext()`
| Característica | Variables de Instancia (image_...) | Función `draw_sprite_ext()` |
|---|---|---|
| Afecta a | Toda la instancia (su dibujo por defecto) | Solo al sprite específico que se dibuja con la función |
| Máscara de Colisión | Se modifica (escala y rota con el sprite) | No se ve afectada |
| Uso Común | Cambios permanentes o de estado en el objeto | Efectos visuales, decoración, elementos secundarios |
Un Caso Especial: La Capa GUI
¿Qué pasa si quieres dibujar un contador de vidas, un puntaje o un botón de pausa? Si lo dibujas en el evento Draw normal, se moverá junto con la cámara del juego, lo cual no es deseable para una interfaz de usuario (UI). La solución es la Capa GUI (Graphical User Interface).
GameMaker tiene un evento especial llamado Draw GUI. Todo lo que dibujes aquí se renderiza en una capa separada que no se ve afectada por la vista o cámara de la room. En esta capa, la coordenada (0, 0) es siempre la esquina superior izquierda de la pantalla, y la esquina inferior derecha corresponde al ancho y alto de la GUI. Esto garantiza que tu UI permanezca fija en su sitio, sin importar si la cámara se mueve, hace zoom o rota.
Para crear un botón o cualquier elemento de UI, simplemente coloca tu código de dibujo en el evento Draw GUI en lugar del evento Draw normal.
Un Vistazo a Spine: Animación Esquelética
Para animaciones mucho más complejas y fluidas, existe una técnica llamada animación esquelética. Herramientas como Spine te permiten crear un "esqueleto" para tu personaje y luego animar los huesos en lugar de dibujar cada frame a mano. El resultado son movimientos increíblemente naturales y eficientes en memoria.
GameMaker tiene soporte nativo para importar animaciones de Spine (en formato JSON). Esto te abre un mundo de posibilidades, permitiéndote cambiar animaciones (caminar, correr, saltar), intercambiar "skins" (diferentes apariencias para el mismo esqueleto) e incluso adjuntar otros sprites a los huesos (como armas o sombreros) directamente desde el código. Si bien es un tema avanzado, es bueno saber que esta poderosa herramienta está a tu disposición para cuando tus proyectos la necesiten.
Preguntas Frecuentes (FAQ)
- ¿Por qué mi sprite desapareció al añadir el evento Draw?
- Porque al añadir un evento Draw, GameMaker te cede el control total del dibujado. Debes añadir la función
draw_self()para que vuelva a dibujar el sprite asignado por defecto al objeto. - ¿Cambiar el tamaño con `image_xscale` afecta las colisiones?
- Sí. La máscara de colisión se escala junto con el sprite. Si solo quieres un cambio visual sin alterar el hitbox, usa la función
draw_sprite_ext(). - ¿Puedo usar sprites de diferentes tamaños en una misma animación?
- No. Todas las sub-imágenes (frames) dentro de un único recurso de sprite en GameMaker deben tener las mismas dimensiones. Para animaciones con tamaños variables, deberás usar diferentes recursos de sprite o técnicas avanzadas como la animación esquelética.
- ¿Cómo creo un elemento de UI que no se mueva con la cámara?
- Coloca todo el código de dibujo para ese elemento dentro del evento Draw GUI. Este evento dibuja en una capa fija relativa a la pantalla, no a la room del juego.
Conclusión
Los sprites son mucho más que simples imágenes. Son un lienzo dinámico sobre el que puedes aplicar una increíble variedad de transformaciones para dar vida, personalidad y feedback a tu juego. Desde una simple asignación a un objeto hasta el control granular que ofrece draw_sprite_ext() y la potencia de la capa GUI, ahora tienes las herramientas para controlar exactamente cómo y cuándo aparece cada elemento visual en tu pantalla. ¡No tengas miedo de experimentar! Combina rotaciones, cambios de color y escalas para crear efectos únicos y hacer que tu juego destaque.
Si quieres conocer otros artículos parecidos a Sprites en GameMaker: Tu Guía Definitiva puedes visitar la categoría Juegos.
