Quick answer: Room Properties → Viewports → enable Viewport 0 with view_visible and assign a camera. Then camera_set_view_pos affects what’s rendered.

A camera follow script calls camera_set_view_pos every frame. In windowed mode it works. In fullscreen the camera doesn’t move — same view of the room start. The viewport configuration differs between modes somehow.

Viewport vs Camera vs Window

Three layers in GameMaker rendering:

camera_set_view_pos moves the camera. If no viewport renders that camera, the change is invisible.

The Fix

Open the Room asset. Room Properties → Viewports and Cameras:

  1. Enable Viewport 0.
  2. Assign a Camera to it (the default Camera0 is fine).
  3. Check “View Visible” for the viewport.
  4. Check “Enable Viewport Settings” for the room.

Save. camera_set_view_pos now affects the rendered view.

Programmatic Check

/// Debug
if (!view_enabled) show_debug_message("View not enabled");
if (!view_visible[0]) show_debug_message("Viewport 0 not visible");
show_debug_message("Camera 0 pos: (" + string(camera_get_view_x(view_camera[0])) + ", " + string(camera_get_view_y(view_camera[0])) + ")");

Print state. Identifies which layer is missing.

Fullscreen Display Scaling

If the viewport is small but the window is large (e.g., 640×360 camera with 1920×1080 window), the camera renders to a smaller area and the rest is letterboxed. Application surface scaling handles this:

surface_resize(application_surface, 1920, 1080);
display_set_gui_size(1920, 1080);

Application surface defines the render target size; window stretches that to fill.

Verifying

Move the player in fullscreen. Camera should follow. Print camera position to confirm changes are taking effect. Without viewport enabled, the print updates but the visual doesn’t.

“Cameras are virtual; viewports are the real connection to display. Both must be configured for camera moves to be visible.”

Set up Viewport 0 with a camera as your project default room template — every new room inherits the working configuration.