Introducción al Desarrollo de Videojuegos con GameMaker · Module 12: Debugging, Optimization, Exporting, and Publishing
Exporting the Executable for Windows and Other Platforms
Lesson 59 of 60 · 50 min
Also available in: ES
Introduction to Game Exporting in GameMaker
Throughout the previous modules, you built a complete two-dimensional platformer: you programmed character movement and physics, created enemies with basic artificial intelligence, structured levels using tilemaps and dynamic cameras, assembled user interfaces with the Draw GUI event, and polished the experience with sound effects and particles. Up to this point, however, your project has only run inside the GameMaker development environment by pressing the Run button (F5). That workflow launches the game in an ephemeral test session that relies entirely on the engine and its debugging tools.
The final step in any game developer's pipeline is transforming that collection of scripts, sprites, audio files, and rooms into a standalone commercial product: an executable file that any player can download, install, and run on their computer without having GameMaker installed. In this lesson, you will learn how to navigate the Game Options system, prepare and optimize visual assets such as icons and splash screens, choose the right compilation targets for Windows (both portable packages and setup installers), and understand the technical requirements for exporting to other ecosystems such as macOS, Linux, and GX.games.
GameMaker Licensing and Available Platforms
Before starting the build process, you must understand GameMaker's licensing and export model. Over the years, GameMaker has operated under various licensing structures; modern versions follow a clear tiered model. With the free version of GameMaker, developers can learn, build games without asset limits, and export directly to GX.games, publishing web builds playable by millions of users through the Opera GX browser at no cost.
To produce native desktop executables for Windows, macOS, or Linux for sale or distribution on stores like Steam, itch.io, or GOG, GameMaker requires a commercial license (available either as a one-time purchase for desktop creators or through subscription tiers, depending on current YoYo Games/Opera terms). If you attempt to click the Create Executable button on an account restricted to the free tier, the IDE will prompt you to upgrade or restrict your target to GX.games. Knowing what your target requires avoids confusion during the final release phase.
| Export Target | Output Format | Licensing Requirements | Recommended Use |
|---|---|---|---|
| GX.games | WebAssembly / Opera GX Web | Free Tier | Game jams, web portfolios, rapid prototyping, and community feedback. |
| Windows (VM / YYC) | NSIS Installer (.exe) / Compressed archive (.zip) | Commercial / Desktop License | Commercial distribution on Steam, itch.io, direct sales, and local tournaments. |
| macOS | Application Bundle (.app) / Disk Image (.dmg) | Commercial / Desktop License (Mac required) | Releasing to Apple Mac users and the Mac App Store. |
| Ubuntu Linux | Compressed package (.tar.gz / AppImage) | Commercial / Desktop License | Open-source distributions and native compatibility with SteamOS / Steam Deck. |
| Mobile and Consoles | APK/AAB (Android), IPA (iOS), platform-specific packages | Enterprise / Console Subscriptions | Mobile storefronts (Google Play, App Store) and consoles (Switch, PlayStation, Xbox). |
💡 Important Note on Licensing: GameMaker's licensing policies have evolved over time. For commercial versus non-commercial desktop releases, always verify current terms inside your user dashboard at opera.com / gamemaker.io. Regardless of your active account tier, all concepts covered here—asset optimization, icon setup, folder structure, and build settings—are identical and fundamental.
Configuring Game Options for Windows
The technical setup of any game centers on the Game Options window, accessible by double-clicking the 'Game Options' asset in the Asset Browser or through the main menu. This window features dedicated tabs for every supported target platform. The Windows tab houses the core parameters Windows Explorer and the operating system use to identify your game.
In the Windows > General sub-tab, define your project's metadata accurately. 'Display Name' sets the visible title shown in the window's title bar and in the Windows Task Manager. The version fields (Major, Minor, Release, Build) allow you to enforce strict semantic versioning (for example, starting at 1.0.0.0 for the initial launch and incrementing to 1.0.1.0 for a minor patch). Filling in 'Company', 'Product', and 'Copyright' ensures the properties dialog of the compiled .exe reflects your studio identity rather than default placeholders.
The graphics settings under Windows are critical when working with retro aesthetics and pixel art. Under the 'Graphics' section, two settings stand out: 'Display cursor' (which toggles the standard system mouse pointer over your game window) and 'Interpolate colors between pixels'. If your game relies on pixel art and this interpolation checkbox is enabled, the engine applies bilinear filtering that blurs the crisp edges of your sprites. For a clean retro platformer, you must uncheck 'Interpolate colors between pixels' to preserve sharp, pristine pixel edges.
Similarly, the 'Scaling' policy dictates how the viewport behaves when the player resizes the window or toggles fullscreen: choosing 'Keep aspect ratio' maintains your native aspect ratio by letterboxing or pillarboxing the display whenever a monitor does not match your internal resolution, preventing characters and environments from stretching or distorting.

Icon and Splash Screen Configuration
A custom program icon (.ico) immediately distinguishes a finished product from a raw prototype. By default, GameMaker embeds its standard 3D logo. To replace it, navigate to Game Options > Windows > Images. The engine requires a single .ico file containing multiple square resolutions (typically 16x16, 32x32, 48x48, 64x64, and 256x256 pixels). If you supply an icon with only a small resolution, Windows will stretch it when players switch folder views to 'Extra large icons', resulting in a blurry presentation.
To produce a proper .ico file from your game assets (such as your hero's head or an iconic item), export the graphic as a 256x256 square PNG from your image editor or GameMaker's sprite editor, then use an icon generation tool to pack all standard sub-resolutions into a single .ico container. You can also configure the Splash Screen here—a static image displayed briefly while the engine initializes memory on slower mechanical drives.
Project Preparation: Cleaning and Verification
Before starting your final build, it is best practice to purge GameMaker's build cache. Over long hours of development, GameMaker caches processed texture pages, compiled code segments, and metadata in temporary local directories. This cache can occasionally retain stale versions of sprites or outdated configurations, causing unpredictable bugs in the export.
Locate the broom icon ('Clean Cache') on GameMaker's top toolbar, or press Ctrl + F7 (Cmd + F7 on macOS). This purges all intermediate build artifacts, forcing the compiler to rebuild the entire project from scratch on the next run. You should also ensure that no development shortcuts remain active in your production build, preventing players from accidentally enabling god mode, skipping levels, or generating console spam.
// ======================================================================
// Script: scr_debug_config.gml or Create Event of obj_game_manager
// ======================================================================
// It is essential to structure debug shortcuts through a
// centralized macro or boolean variable to disable them in the final build.
#macro MODO_DESARROLLO false
// In the Step event of your game manager (obj_game_manager):
if (MODO_DESARROLLO)
{
// Shortcut to skip to the next level during testing
if (keyboard_check_pressed(vk_f2))
{
if (room_exists(room_next(room)))
{
room_goto_next();
}
}
// Shortcut to restore health to full
if (keyboard_check_pressed(vk_f3))
{
if (instance_exists(obj_player))
{
obj_player.hp = obj_player.hp_max;
show_debug_message("Health restored by debug command.");
}
}
}Setting the 'MODO_DESARROLLO' macro constant to 'false' enables dead-code elimination during compilation. This strips out the conditional block entirely, ensuring end players cannot trigger internal testing functions in the final release.
Packaging Options for Windows: Installer vs. Portable Archive
When building for Windows, clicking 'Create Executable' presents two distinct packaging options: an NSIS-based installer (Nullsoft Scriptable Install System) and a compressed (.zip) archive. Your choice depends directly on your distribution platform and how you expect players to launch the game.
The installer generates a single setup executable (typically named 'MyGame_Installer.exe') that guides players through a standard setup wizard: it prompts for an installation path (defaulting to Program Files), creates Start Menu and Desktop shortcuts, and registers an uninstaller in Windows Settings. This format is ideal when distributing your game from a personal website or sending builds to less technical users who expect standard desktop installation behavior.
Conversely, the compressed (.zip) option produces an archive containing the game executable (e.g., 'RetroPlatformer.exe'), its compiled binary asset bundle ('data.win'), and the necessary dynamic link libraries (.dll) for audio playback and DirectX communication. This portable, self-contained package is the industry standard for independent platforms like itch.io and Game Jolt, as well as game jams. Players simply extract the archive anywhere—including a USB drive—and launch the .exe directly without needing administrative rights or system modifications.
Step-by-Step Guide: Creating the Windows Executable
Follow this operational sequence to compile your finished retro platformer for Windows:
1. Verify the target in the Target Manager: In the upper-right corner of the GameMaker workspace, click the crosshair icon (Target Manager). Verify that 'Windows' is selected under Platform. Under Output, choose either 'VM' (Virtual Machine) or 'YYC' (YoYo Compiler, which requires a configured C++ toolchain on your machine). For most 2D indie titles, VM provides fast compilation, solid stability, and great performance.
2. Clean the project: Click the broom icon ('Clean') on the top toolbar to clear any leftover temporary files from the build cache.
3. Create the executable: Click the package/box icon ('Create Executable') on the top toolbar or press Ctrl + F8.
4. Select the package format: A system dialog will ask whether you want to 'Package as Installer' (NSIS Installer) or 'Package as Zip' (portable archive). Choose the option suited to your release pipeline.
5. Set the output destination: Select a clear destination folder on your drive (keeping builds outside your project source directory in a dedicated folder such as 'Release_Builds' is recommended). Give the file a clean name without accents or problematic characters (e.g., 'Retro_Platformer_v1_0.zip').
6. Monitor the compile log: Watch the 'Compile' output panel at the bottom of the IDE. GameMaker compiles your GML scripts, generates texture pages, compresses sound effects and music, and bundles the package. Once the log displays 'BUILD SUCCESSFUL', your file manager will open to the generated package.
Exporting to Other Platforms: macOS, Linux, and GX.games
GameMaker's cross-platform architecture allows you to export the same codebase to other operating systems, though each target brings specific technical requirements:
Exporting to GX.games: This is the fastest, most accessible target and is available on the free tier. Selecting GX.games in the Target Manager and clicking 'Create Executable' compiles the project into optimized WebAssembly and HTML5, uploading it directly to your Opera GX developer dashboard. You can set builds to private (unlisted share link) or public. It provides an effortless way for playtesters to try your game in their browser with no installation required.
Exporting to macOS: Because of Apple's security requirements, generating a working macOS build (.app or .dmg) requires an actual Mac on your local network configured as a remote build worker (or running GameMaker directly on macOS). You also need an Apple Developer certificate to notarize the app and prevent Gatekeeper warnings on end-user machines.
Exporting to Ubuntu Linux: GameMaker can generate binaries compatible with Debian/Ubuntu-based distributions. When compiling from Windows, you set up an SSH connection to a physical or virtual machine running Ubuntu, where GameMaker transfers files and builds the package. This pipeline has become increasingly relevant with the Steam Deck, whose Arch-based SteamOS benefits directly from native builds and streamlined Proton compatibility.
| Platform | Output Format | Hardware/Network Setup | Primary Advantage |
|---|---|---|---|
| Windows | .exe / .zip | Standard PC running Windows 10/11 | Largest overall share of the desktop gaming market. |
| GX.games | WebAssembly / Cloud link | Internet connection and Opera account | Instant universal access without local file downloads. |
| macOS | .dmg / .pkg | Apple Mac computer + Xcode | Access to Mac users with native OS performance. |
| Ubuntu / Linux | .tar.gz / AppImage | Physical or virtual Ubuntu machine | Native support for open-source systems and Steam Deck hardware. |
Handling Save Paths and File Systems Post-Export
A common trap for new developers when testing their first exported game involves game saves. During development, GameMaker allows reading and writing files within the project working directory with considerable freedom. However, once an installer places your game inside 'C:\Program Files\MyGame\', Windows strictly forbids unprivileged processes from writing or creating files in that directory.
To prevent save operations from failing silently (which causes lost progress and high scores), GameMaker isolates file operations using an automatic sandbox. All write calls targeting text or INI files are automatically routed to the user's local application data folder (AppData\Local\YourGameName on Windows).
// ======================================================================
// Script: scr_guardar_progreso.gml
// ======================================================================
// Safe saving demonstration compatible with Windows Sandboxing.
// The file 'salvado_plataformas.ini' will be safely located at:
// %LOCALAPPDATA%\YourGameName\
function scr_guardar_progreso(_monedas, _nivel_maximo)
{
// Open (or create if missing) the configuration file
ini_open("salvado_plataformas.ini");
// Write numeric data to the [Progreso] section
ini_write_real("Progreso", "MonedasTotales", _monedas);
ini_write_real("Progreso", "NivelDesbloqueado", _nivel_maximo);
// Always close the file to flush the buffer to physical disk
ini_close();
show_debug_message("Game saved successfully to the local sandbox.");
}
// To inspect the absolute path where the Sandbox operates at runtime:
var _ruta_guardado = game_save_id;
show_debug_message("Save directory: " + string(_ruta_guardado));💡 Golden Rule of Sandboxing: Always use clean relative filenames (like 'save.ini' or 'progress.json'). Never hardcode absolute file paths such as 'C:\Saves\save.ini', as these will fail on any machine with standard security permissions or non-standard directory layouts.
Quality Assurance: Smoke Testing the Executable
A 'BUILD SUCCESSFUL' console notice does not mean testing is finished. Before sharing your download link with players, you must perform a smoke test on the packaged output. This quick validation step ensures the final build behaves correctly under real user conditions.
First, extract your portable ZIP into a completely separate folder outside your development workspace (or copy it via USB to a computer that has never had GameMaker installed). Testing on a clean system verifies that redistributable dependencies (such as DirectX or Visual C++ runtimes) are present, confirms audio works across various sound drivers, and proves the game is not referencing hardcoded assets on your dev machine.
Practical Exercises
Reinforce your publishing skills by completing these three practical exercises in your platformer project:
Summary
- A standalone executable transforms raw source assets into an independent binary package that runs without requiring GameMaker.
- GameMaker uses a tiered model separating free learning/GX.games builds from commercial desktop licenses needed for native exports (.exe, .app, Linux).
- In Game Options for Windows, unchecking 'Interpolate colors between pixels' preserves pixel art crispness, while 'Keep aspect ratio' prevents distortion on widescreen displays.
- Windows exports can be packaged either as an NSIS Installer (formal desktop setup) or a Portable ZIP archive (ideal for itch.io and game jams).
- GameMaker's sandbox automatically redirects save file operations to AppData\Local, avoiding permission errors in protected system folders.
- Before releasing any commercial build, running a smoke test on a clean machine is vital to confirm dependencies, resolution scaling, audio playback, and save integrity.
Practise what you learned
Exercise 1 · 1 point
When configuring a retro or pixel art game under Windows settings (Game Options > Windows > Graphics), which setting must be disabled to prevent sprite edges from being blurred by bilinear filtering?
Exercise 2 · 1 point
Pressing Ctrl + F7 (or Cmd + F7 on macOS), or clicking the broom icon ('Clean Cache'), deletes temporary compiled files and forces the engine to rebuild the project from scratch on the next compile.
Exercise 3 · 1 point
Match each GameMaker export concept or setting with its correct technical description:
- Display Name
- Keep aspect ratio
- GX.games
- .ico file
Sign in to save your progress — Sign in