Hacer que el cursor del ratón sea un sprite personalizado en GameMaker parece trivial — y lo es, hay tres formas — pero cada una tiene implicaciones distintas en cómo se renderiza, cómo escala y cómo se integra con la UI del juego. Si no eliges bien, terminas con un cursor que sale por debajo de los menús o que se ve borroso al cambiar de resolución.
Método 1: objeto en la escena
El más directo. Creas un sprite (spr_cursor) y un objeto (obj_cursor) que lo tenga asignado. En el evento Create:
x = mouse_x;
y = mouse_y;
En el evento Step:
x = mouse_x;
y = mouse_y;
Asegúrate de colocar el objeto en la capa más alta de la room (o ajusta su depth a un valor muy bajo, p.ej. -10000) para que se pinte encima del resto. Finalmente, en Game Options → Windows, desmarca "Display Cursor" para esconder el del sistema.
Pro: simple, depura fácil. Contra: si tu juego usa GUI (menús, HUD), el cursor queda debajo de la GUI. No vale para inventarios o pantallas de pausa.
Método 2: Draw event sin objeto
Si no quieres crear un objeto entero, puedes pintar el sprite directamente desde el Draw event de cualquier objeto persistente (p.ej. el game controller):
draw_sprite(spr_cursor, 0, mouse_x, mouse_y);
Misma limitación del método 1 con la GUI, pero más ligero (no instancias un objeto entero solo para esto).
Método 3: GUI layer (el bueno)
El método "correcto" en GameMaker moderno. Esconde el cursor del sistema con un sprite del SO y deja que GameMaker pinte el tuyo en la capa GUI, que va siempre por encima de todo:
// En Create del game controller (objeto persistente):
window_set_cursor(cr_none);
cursor_sprite = spr_cursor;
Eso es todo. No necesitas Draw event ni Step ni nada. GameMaker se encarga.
Importante: el escalado
El cursor_sprite se renderiza en la resolución del view, no de la room. Si tu juego tiene un view pequeño escalado a pantalla completa (típico en pixel art), tu cursor se va a ver pixelado a tamaño real mientras el resto del juego está escalado. Para arreglarlo, configura la GUI al mismo tamaño que la room:
// En Room Creation Code:
display_set_gui_size(room_width, room_height);
¿Cuál usar?
| Método | Cuándo |
|---|---|
| 1 — Objeto en escena | Prototipos rápidos, juegos sin GUI. |
| 2 — Draw event | Igual que el 1, pero quieres ahorrar instancias. |
| 3 — GUI layer | Siempre que tengas UI. Es el correcto en 95% de los casos. |
Si vendes tu juego, ve al 3 desde el principio. Si lo cambias después, vas a tener que tocar todos los menús y popups que dependen del cursor.