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étodoCuándo
1 — Objeto en escenaPrototipos rápidos, juegos sin GUI.
2 — Draw eventIgual que el 1, pero quieres ahorrar instancias.
3 — GUI layerSiempre 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.