Quick answer: Three checks fix 95% of cases. Set visible = true in the Create event. If you wrote your own Draw event, call draw_self() explicitly. And confirm the instance is inside the current view — for HUD elements, use the Draw GUI event instead.

You add a Draw event to a controller object so it can render a custom HUD overlay, an aiming reticle, or a debug grid. You hit Run, and the screen shows nothing. Other objects draw fine. The Draw event seems to be wired up. Add a show_debug_message in the same event and the message fires — so the event is firing. The visual just is not happening. There are five reasons this can happen and they are all fixable in under a minute once you know the list.

The Symptom

The Draw event of an object exists, but no graphics show up:

What Causes This

Cause 1: visible is false. If visible on an instance is false, GameMaker skips its Draw event entirely. This is sometimes set by parent objects, room creation code, or accidentally toggled in the IDE.

Cause 2: Adding a Draw event removes the default draw_self. Every object has an implicit Draw event that calls draw_self(). The moment you add a custom Draw event, you replace the default. If your custom event does not call draw_self(), the sprite disappears.

Cause 3: The instance is outside the camera view. GameMaker culls instances whose bounding boxes are outside the active view. If your controller object is at (0, 0) and your camera is following the player at (5000, 5000), the controller’s Draw event still fires — but anything you draw in “world coordinates” near (0, 0) is off-screen.

Cause 4: You drew on the wrong layer. Layers are sorted by depth. A negative-depth layer draws above a higher-depth layer. If your draw layer is at depth 1000 and your background is at depth 100, the background covers your drawing.

Cause 5: image_alpha or color is wrong. A previous draw call may have left draw_set_alpha(0) or draw_set_color(c_black) active. Subsequent draws inherit those settings.

The Fix

Step 1: Make the controller visible and reset draw state.

// obj_hud: Create event
visible = true;
depth = -1000;  // draw on top of everything else

// obj_hud: Draw GUI event (use this for HUDs!)
draw_set_alpha(1);
draw_set_color(c_white);
draw_set_font(fnt_hud);
draw_set_halign(fa_left);
draw_set_valign(fa_top);

draw_text(16, 16, "Score: " + string(global.score));
draw_text(16, 40, "Lives: " + string(global.lives));

Always reset draw_set_alpha, draw_set_color, and font alignment at the top of any Draw event you write. Other objects’ Draw events run before yours and may have left global draw state in a hostile configuration.

Step 2: For HUD elements, use Draw GUI, not Draw.

The Draw event runs in world coordinates with the camera applied. If your camera is following the player at (5000, 5000), drawing at (16, 16) in the Draw event paints something at world position (16, 16) — far off the visible screen.

The Draw GUI event runs in screen coordinates, ignores the camera, and is the right place for HUDs, score, health bars, dialogue boxes, and pause menus.

Step 3: If you must use the Draw event, call draw_self() to keep the sprite.

// obj_player: Draw event (override that keeps the sprite visible)
draw_self();
// custom drawing on top of the sprite
draw_set_color(c_red);
draw_rectangle(bbox_left, bbox_top, bbox_right, bbox_bottom, true);

This is the most-forgotten line in GameMaker. The default Draw event is just draw_self(). The moment you write a Draw event, you have to put it back yourself or the sprite vanishes.

Verifying the Fix

Move your code into a Draw GUI event temporarily. If it suddenly appears, your problem was world-coordinate culling or camera offset. Add a brightly colored full-screen rectangle as the first thing in the event:

draw_set_color(c_red);
draw_set_alpha(0.3);
draw_rectangle(0, 0, display_get_gui_width(), display_get_gui_height(), false);
draw_set_alpha(1);

If the red tint appears, your event is firing and your draw state is fine — the bug is in the specific draw call that follows. If the red tint does not appear, the event itself is being skipped and the problem is upstream (visible is false, the instance is destroyed, or the layer is invisible).

“The Draw event in GameMaker has more footguns than any other event. Half of them are solved by using Draw GUI instead. The other half are solved by remembering to call draw_self.”

Related Issues

If your sprite is invisible without a custom Draw event, see GameMaker instance variables resetting on room change for related lifecycle issues. For audio that fails on some platforms, see GameMaker audio not playing on Android export. For room initialization timing problems, check GameMaker room creation code not running.

If you forget Draw GUI exists, you will rebuild your camera math three times trying to figure out why your HUD moves with the player. Learn it once and use it forever.