Introducción al Desarrollo de Videojuegos con GameMaker · Module 12: Debugging, Optimization, Exporting, and Publishing

Build Options and Platform Settings

Lesson 58 of 60 · 55 min

Also available in: ES

Introduction to Technical Project Configuration

Throughout previous modules, you programmed jumping mechanics, precise collision systems, basic artificial intelligence, graphical user interfaces using the Draw GUI event, and a complete playable loop for our retro 2D platformer. However, a video game does not consist solely of its internal logic; for a project to be perceived as a polished, professional, and release-ready product, it requires impeccable technical configuration. Up to this point in your learning journey, clicking the 'Play' button compiles a temporary test build that runs inside a standard window with generic parameters, often displaying the engine's default icon, a basic window title, and display settings that may not do justice to your game's pixel art aesthetic.

The pre-release preparation phase requires carefully configuring Game Options. In this lesson, you will learn how to define your game's formal identity through metadata (official name, version, author info, copyright notices), establish strict control over visual scaling to prevent pixels from distorting or blurring, embed custom multi-resolution icons across standard OS sizes, and design a clean startup experience using splash screens and intro rooms. Furthermore, we will break down the two main build targets provided by GameMaker: the Virtual Machine (VM) and the YoYo Compiler (YYC), understanding when to use each and how the Configuration Manager allows you to seamlessly toggle between development and production builds without manually modifying your source code.

The Game Options Panel: Structure and Project Metadata

In GameMaker, the command center for build and packaging settings is the 'Game Options' window, accessible via the gear icon located in the top workspace toolbar or through the Asset Browser. When you open this window, you will notice a hierarchical division into two primary sections: 'Main' (shared global settings) and platform-specific options (Windows, macOS, Ubuntu, HTML5, Android, iOS, consoles, and others depending on your installed export modules and active subscription).

The 'Main' section establishes the project's foundation. This is where the game's unique identifier, data synchronization order, and universal memory parameters are defined. However, the platform-specific tabs—such as the 'Windows' tab for desktop projects—are where you configure the metadata that operating systems and digital storefronts (such as Steam or itch.io) use to catalog and display your executable application.

Metadata FieldTechnical PurposeFormat / Recommended ExampleEnd-User Impact
Display NamePublic name of the application displayed in the window title bar and task manager.Retro Adventure: The RescueThis is the primary visible text identifying the game when it runs or is minimized.
Product ID / GUIDGlobally unique identifier generated for registering the software with the operating system.Alphanumeric UUID/GUID format string (generated automatically).Prevents conflicts with other programs and allows installers to verify legitimate updates.
Version InfoFormal numbering indicating the program's lifecycle and release maturity (Major, Minor, Build, Revision).1.0.0.0 (Initial release) 1.0.1.0 (Bug-fix patch)Allows the operating system and distribution clients to check if a downloaded file is newer than the installed version.
Company & CopyrightLegal ownership and developer details embedded in the binary executable (.exe) file properties.Company: YourName Studios Copyright: © 2025 YourName StudiosProvides commercial authenticity and establishes intellectual property ownership in file explorer property sheets.
DescriptionFunctional summary of the executable recorded in the binary's resource table.2D platformer game developed with GameMaker.Appears in the executable's Details tab and in system process inspection tools.

Resolution, Scaling, and Graphical Fidelity Settings

One of the most common pitfalls for novice developers when exporting a 2D platformer is neglecting window graphics settings and scaling methods. If you designed your sprites with a pixel art aesthetic at a low native resolution—for instance, an internal resolution of 480x270 pixels scaled up to Full HD (1920x1080) monitors—improper graphics settings can distort the crisp edges of your characters or blur background tiles.

Inside the 'Graphics' tab of your target platform (such as Windows), GameMaker provides several switches and selectors that fundamentally alter the rendering pipeline:

1. Interpolate colours between pixels: This checkbox enables hardware bilinear filtering. For modern high-definition games featuring vector graphics or high-resolution 2D art, this option smooths jagged edges. However, for our retro pixel art platformer, this box MUST BE UNCHECKED. When disabled, GameMaker uses nearest-neighbor sampling, preserving razor-sharp edges and crisp pixel boundaries without unwanted blur.

2. Scaling: Here you can choose between 'Keep aspect ratio' and 'Full scale'. 'Keep aspect ratio' is the universally recommended option for almost all games. If a user's monitor aspect ratio differs from your game's native ratio (for example, an ultrawide 21:9 display or a 4:3 legacy screen compared to your 16:9 native canvas), GameMaker automatically adds uniform black bars (letterboxing or pillarboxing) along the margins, preventing your sprites from stretching horizontally or vertically.

3. Synchronize with vertical blank (VSync): Checking this option locks the game's refresh rate to the monitor's refresh rate (typically 60 Hz, 144 Hz, etc.). This completely eliminates horizontal screen tearing, which occurs when the GPU frame buffer swaps frames midway through a monitor scan. In a side-scrolling platformer with continuous camera motion, enabling VSync or managing it via code is crucial to ensuring silky-smooth background panning.

4. Window options: You can choose whether the game launches in fullscreen mode ('Start Fullscreen') or windowed mode ('Allow the player to resize the game window'). If you allow players to resize the window freely, enabling 'Keep aspect ratio' is essential so the viewport scales proportionally without breaking your visual composition.

💡 Golden rule for pixel art games: Always keep 'Interpolate colours between pixels' disabled. If you need smooth rendering for UI elements while keeping the game world pixel-crisp, you can control filtering dynamically in GML using gpu_set_tex_filter(false) for world rendering and toggling it on selectively when drawing high-res UI elements.

Schematic diagram comparing aspect ratio preservation with black bars against forced full scaling that distorts pixels.
Figure 1: Comparison between maintaining the original aspect ratio (top) and forced scaling that stretches the image (bottom). · AI-generated image

Managing Resolution and Windows via GML

While Game Options configure the application's initial startup state, a polished game should allow players to adjust resolution and switch between windowed and fullscreen modes during gameplay—either via a settings menu (like the one built in Module 8) or through keyboard shortcuts. To manage these behaviors cleanly through GML, we will build a dedicated display controller object.

Create a new object in your project and name it `obj_display_manager`. Be sure to flag it as 'Persistent' so its logic persists across all rooms, and place it in the game's very first startup room (such as the title screen or a bootstrap initialization room).

// ====================================================================
// OBJECT: obj_display_manager
// EVENT: Create
// ====================================================================
// Define the base art design resolution (native to our game)
resolucion_ancho = 480;
resolucion_alto  = 270;
escala_ventana   = 3; // Initial 3x scale -> Resulting 1440x810 window
es_pantalla_completa = false;

// Set the physical operating system window size
window_set_size(resolucion_ancho * escala_ventana, resolucion_alto * escala_ventana);

// Resize the application's internal rendering surface
surface_resize(application_surface, resolucion_ancho, resolucion_alto);

// Center the window on the desktop after resizing
alarm[0] = 1;

// Set the official window title at runtime
window_set_caption("Retro Adventure - Version 1.0.0");
// ====================================================================
// OBJECT: obj_display_manager
// EVENT: Alarm 0
// ====================================================================
// A one-frame alarm gives the OS time to process
// the resize before centering the window on screen.
window_center();
// ====================================================================
// OBJECT: obj_display_manager
// EVENT: Step
// ====================================================================
// Toggle fullscreen with F11 or Alt + Enter
var presiono_f11 = keyboard_check_pressed(vk_f11);
var presiono_alt_enter = (keyboard_check(vk_alt) && keyboard_check_pressed(vk_enter));

if (presiono_f11 || presiono_alt_enter) {
    es_pantalla_completa = !es_pantalla_completa;
    window_set_fullscreen(es_pantalla_completa);
    
    // When returning to windowed mode, restore size and centering
    if (!es_pantalla_completa) {
        window_set_size(resolucion_ancho * escala_ventana, resolucion_alto * escala_ventana);
        alarm[0] = 1;
    }
}

With this code in place, your game maintains strict mathematical control over its rendering surface (`application_surface`). Regardless of how large the monitor is on which the build is launched, internal pixel proportions will never distort or produce unexpected visual artifacts.

Visual Identity: Icons and Splash Screens

A video game's visual identity begins long before the player sees the first frame of gameplay. Whether browsing the installation folder, pinning a shortcut to the Windows taskbar, or waiting for audio and texture archives to decompress into RAM, these visual presentation elements draw the line between a hobby experiment and a commercial release.

Icon Configuration and Requirements (.ico)

Under the 'Images' tab of Windows options in GameMaker, you will find the slot to assign your application icon. On Windows systems, this file cannot simply be a raw PNG or JPEG file; it must be a valid `.ico` container file containing multiple square resolutions with alpha transparency embedded inside. If you only provide a single tiny image (such as 16x16 pixels), Windows File Explorer will stretch it to 256x256 in Large Icon view, producing an unrecognizable, blurry mess.

Required ResolutionOperating System Display ContextDesign Recommendation
16 x 16 pxWindow title bar and small Task Manager listing.Extremely simplified silhouette, high contrast, no fine detail or text.
24 x 24 / 32 x 32 pxStart menu shortcuts and standard Windows taskbar.Protagonist face or key game icon with crisp, well-defined contours.
48 x 48 / 64 x 64 pxMedium icon grid view in Windows File Explorer.Intermediate color details and shading to provide depth.
128 x 128 / 256 x 256 pxExtra large icon views and control panel displays.Full illustration logo quality, subtle shading, and refined highlights.

To generate this file, design your master icon on a 256x256 pixel canvas in your preferred graphics software. Export the artwork as a transparent PNG and use an icon generator or dedicated software (such as GIMP or Aseprite) to pack the required resolutions into a single `.ico` file. When you load it into GameMaker, the engine automatically embeds the resource table directly into the binary executable header during the build process.

Splash Screens and Loading Sequences

The Splash Screen is the static image displayed immediately while the operating system boots the GameMaker runtime and streams audio banks and textures from storage into system memory. Under the target platform's 'Images' tab, you can assign a splash image (typically 1920x1080 pixels).

For lightweight 2D desktop projects built with GameMaker, initial loading often completes in fractions of a second, making the splash screen barely visible. To deliver a polished cinematic intro sequence—displaying your studio logo followed by legal notices before transitioning to the title screen—the industry standard practice is to build a dedicated introductory room (`rm_splash_intro`) set as the very first room in the Asset Browser. This room executes an automated sequence via a timeline or simple alarm that smoothly transitions into `rm_menu_principal` once playback finishes.

Build Targets: Virtual Machine (VM) vs YoYo Compiler (YYC)

In the top-right corner of the GameMaker workspace, opening the Target Platform panel reveals a critical setting labeled 'Output', which lets you choose between two entirely distinct compilation pipelines: VM (Virtual Machine) and YYC (YoYo Compiler). Understanding the architectural differences between them is vital for optimizing daily workflows and maximizing release performance.

Evaluation CriterionVirtual Machine (VM)YoYo Compiler (YYC)
Execution MechanismTranslates GML into intermediate bytecode interpreted by a shared runtime engine.Translates all GML directly into C++ source code, which is then compiled into native machine binary.
Build TimeUltra-fast (typically 3 to 15 seconds). Allows instant iteration and testing.Significantly slower (ranging from 1 minute to over 10 minutes depending on project size and CPU).
Processing PerformanceExcellent for most 2D games, but introduces overhead in heavy mathematical loops.Blazing fast. Can boost logic execution and AI processing speeds by 2x to 5x.
Installation RequirementsNo external toolchains required. Works immediately after installing GameMaker.Requires installing official external development tools (such as Microsoft Visual Studio Community and C++ SDKs on Windows).
Recommended UseDay-to-day development, interactive debugging, rapid playtesting sessions.Final commercial release builds (Steam, consoles, mobile builds with intensive physics or AI).

For our retro 2D platformer, the VM output is more than capable of sustaining a rock-solid 60 FPS with minimal system overhead. However, if your game scales up to feature procedural dungeon generation algorithms, real-time shadow casting, or hundreds of simultaneous entities running computationally heavy loops, YYC provides a major performance upgrade by completely stripping away the interpretation layer.

Managing Environments with the Configuration Manager

Throughout game development, you will frequently write diagnostic helper code that must never reach the end player: debug overlays that print internal variables, keyboard shortcuts to warp between rooms, god-mode invulnerability, or verbose FPS counters. Manually deleting or commenting out these lines prior to building for release is an error-prone workflow that invites accidental regressions.

GameMaker addresses this through the Configuration Manager, accessible via the document icon next to the target platform selector or by right-clicking 'Configurations' at the top of the Asset Browser. By default, every project has a configuration called 'Default'. Through this manager, you can define custom profiles, such as 'Debug' (internal testing) and 'Release' (commercial distribution).

By pairing conditional macros with configurations, you can assign different values to the same identifier depending on which profile is currently selected in the IDE, without modifying a single line of object code.

// ====================================================================
// SCRIPT: scr_configuracion_macros
// ====================================================================
// This script runs automatically on startup to define compilation macros.

// Default values for unspecified build configurations
#macro MODO_DEPURACION_ACTIVO false
#macro MOSTRAR_HITBOXES        false

// Macro overrides for the specific "Debug" configuration
// (Only applied when the 'Debug' profile is selected in the IDE)
#macro Debug:MODO_DEPURACION_ACTIVO true
#macro Debug:MOSTRAR_HITBOXES        true

// Macro overrides for the "Release" configuration
#macro Release:MODO_DEPURACION_ACTIVO false
#macro Release:MOSTRAR_HITBOXES        false

Then, in the `Draw` or `Draw GUI` event of any key object (such as the player character or the UI controller built in Module 8), you gate debug displays behind this macro. When you switch the Configuration Manager from 'Debug' to 'Release', GameMaker strips out or bypasses the debug branch entirely when compiling your final release build:

// ====================================================================
// OBJECT: obj_jugador
// EVENT: Draw GUI
// ====================================================================
// If the debug macro is active, print diagnostic telemetry on screen
if (MODO_DEPURACION_ACTIVO) {
    draw_set_font(-1);
    draw_set_color(c_yellow);
    
    var texto_info = "Real FPS: " + string(fps_real) + 
                     "\nPlayer State: " + string(estado_actual) + 
                     "\nPosition X/Y: [" + string(x) + ", " + string(y) + "]";
                     
    draw_text(10, 10, texto_info);
    
    // Draw physical collision mask (hitbox) in translucent red if enabled
    if (MOSTRAR_HITBOXES) {
        draw_set_color(c_red);
        draw_set_alpha(0.4);
        draw_rectangle(bbox_left, bbox_top, bbox_right, bbox_bottom, false);
        draw_set_alpha(1.0);
    }
}

Practical Exercises

Put these concepts into practice by configuring your project for a polished, professional release through the following three guided exercises.

Exercise 1: Comprehensive Desktop Metadata and Visual Identity Setup

Open the Game Options panel in your retro platformer project and configure the Windows tab: enter a commercial 'Display Name' for your game (for example, 'Super Retro Platformer'), set the formal version number to '1.0.0.0', and fill in the 'Company' and 'Copyright' fields with your studio details. Under 'Graphics', verify that bilinear interpolation is unchecked and scaling is set to 'Keep aspect ratio'. Finally, design or obtain a square transparent icon, compile it into a multi-resolution `.ico` file (embedding 16x16, 32x32, and 256x256 resolutions), and import it into the icon slot.

Validation criteria: Build and launch the game in standard test mode; confirm that the window frame displays your custom icon in the upper-left corner, the title bar matches your configured Display Name exactly, and in-game pixel art remains crisp without edge blurring.

Exercise 2: Dynamic Resolution Controller and Window Handling

Create or update the `obj_display_manager` object following the architecture outlined in this lesson. In its `Step` event, add the ability to switch between three predefined window scale presets when the user presses number keys '1', '2', and '3' (corresponding to 1x [480x270], 2x [960x540], and 3x [1440x810] scales), ensuring automatic re-centering via `window_center()` on a delayed alarm. Retain the F11 fullscreen toggle.

Validation criteria: Run the game in windowed mode; press keys 1, 2, and 3 to verify that the window resizes instantly without distorting the aspect ratio and centers cleanly on your desktop. Press F11 to enter and exit fullscreen without losing pixel sharpness on the application surface.

Exercise 3: Environment Segmentation Using Build Configurations

Open GameMaker's Configuration Manager and create a new configuration profile named 'Release', leaving 'Default' as your day-to-day development profile ('Debug'). In a global script, declare a conditional macro `#macro MODO_INVENCIBLE` that evaluates to `true` under the default configuration and `false` under 'Release'. In the player-enemy collision logic (implemented in Module 7), make health reduction conditional so that damage is ignored when `MODO_INVENCIBLE` is active.

Validation criteria: Launch the game with the 'Default' configuration selected and verify that the player is immune to enemy damage while testing the stage. Switch the active profile in the top bar to 'Release', relaunch the game without touching any code, and confirm that the player now takes damage and loses lives normally.

Summary

  • The Game Options panel centralizes both global project settings and target platform-specific technical configurations.
  • Project metadata (Display Name, Version, GUID, Copyright) provides the binary executable with formal identity and ensures proper cataloging by digital storefronts and operating systems.
  • For 2D pixel art games, disabling bilinear interpolation ('Interpolate colours between pixels') and setting scaling to 'Keep aspect ratio' is essential to eliminate distortion and blur.
  • The .ico format requires multiple embedded square resolutions (16x16 up to 256x256) to ensure sharp display across all OS shell contexts.
  • Virtual Machine (VM) compilation enables ultra-fast iteration during daily development, while YoYo Compiler (YYC) produces high-performance native machine code for final distribution.
  • The Configuration Manager allows you to bind macros and constants to specific build targets, enabling clean separation between development debug tools and commercial release builds without modifying source code.

Practise what you learned

Exercise 1 · 1 point

Match each component of GameMaker's version numbering scheme with its corresponding technical description:

  • Major (First number)
  • Minor (Second number)
  • Build (Third number)
  • Revision (Fourth number)
You are practising without an account: nothing is saved. Sign up to keep your progress.

Exercise 2 · 1 point

Why should 'Interpolate colours between pixels' remain disabled in the graphics settings of a pixel art project?

You are practising without an account: nothing is saved. Sign up to keep your progress.

Exercise 3 · 2 points

In the Create event of the controller object 'obj_display_manager', write the line of code needed to resize the internal drawing canvas ('application_surface') to the native base dimensions ('resolucion_ancho' and 'resolucion_alto').

Your code is not executed: specific requirements are checked on the text.

You are practising without an account: nothing is saved. Sign up to keep your progress.

Sign in to save your progress — Sign in