Introducción al Desarrollo de Videojuegos con GameMaker · Module 1: Introduction to GameMaker, Installation, and First Project

Creating Your First Blank Project

Lesson 4 of 60 · 45 min

Also available in: ES

Introduction: The Importance of a Solid Foundation

When starting game development, the most common beginner pitfall is opening the engine, dumping visual assets haphazardly into any temporary folder, and writing lines of code without a recovery plan. This rushed approach almost always leads to corrupted files, broken dependencies, namespace collisions, and hours of wasted effort. In professional development, setting up your environment and file architecture is just as crucial as writing the gameplay logic itself.

GameMaker manages projects through a modular system powered by human-readable JSON metadata files and cross-referenced resources. Understanding how the engine reads, stores, and compiles these files allows you to prevent catastrophic failures long before writing the first line of gameplay code for your platformer. In this lesson, you will learn how to initialize an entirely clean project, eliminate unnecessary dependencies, configure safe local file paths on your OS, and set up a scalable folder hierarchy that will carry you through all twelve modules of the course.

Starter Templates vs. Blank Projects

When launching GameMaker and creating a new file via the 'New' button, the interface presents two primary routes: using a pre-built template or starting from a clean slate with a Blank Project. The official templates provided by YoYo Games—such as space shooter prototypes, basic platformers, or top-down adventures—are useful for hobbyists exploring pre-programmed mechanics or previewing genre-specific setups. However, for structured learning and serious commercial or educational production, starting from a template is often counterproductive.

Templates import pre-existing scripts, complex camera setups, collision routines that may not fit your architectural goals, and numerous temporary sprites that clutter the resource tree. Modifying unfamiliar code without mastering the basics turns even minor bugs into a maze of hidden dependencies. By contrast, starting with a 'Blank Project' guarantees granular control over every byte of memory, every game object, and every event you create.

Evaluation CriterionBlank ProjectPre-built Templates
Learning CurveGradual and deliberate; every line of code is written and understood by the developer.Confusing; conceals advanced logic and complex scripts that overwhelm beginners.
Asset CleanlinessAsset Browser begins completely empty and fully customizable.Dozens of pre-installed sprites, sounds, and fonts that may never be utilized.
Architectural FlexibilityAllows physics and movement systems tailored specifically to your game design.Forces the programmer into conventions and design choices established by third parties.
Risk of Phantom BugsNearly zero; issues arise solely from the developer's own additions.High; altering a default script can silently break obscure downstream events.

For these reasons, our retro 2D platformer will be built strictly on a blank foundation. When clicking 'New', GameMaker will also prompt you to choose between GML Code and GML Visual. While the engine allows switching or combining both paradigms across project phases, this course strictly uses 'GML Code'. Text-based programming through source code provides far higher workflow velocity once you master syntax, and it imparts universal computer science concepts applicable across the entire video game industry.

Step-by-Step Project Creation

To set up the project cleanly, follow this procedure carefully. First, launch GameMaker and ensure you are logged into your active Opera / YoYo Games account. On the Start Screen, click the prominent 'New' button located on the left-hand navigation sidebar or top-center panel. A dialog window will appear displaying the available project types. Select the card labeled 'Blank'.

Next, the environment will prompt you to select the default project language. Select 'GML Code'. Your operating system's file browser dialog will then open to define two critical parameters: the project name ('Project Name') and its physical storage location on your drive ('Location').

Naming your project is not merely cosmetic. The name you enter defines the primary identifier of the root project file, the container directory name, and the default window caption for executable builds. For cross-platform stability and to avoid unexpected bugs in GameMaker's underlying C++ and JavaScript toolchains, adhere strictly to universal project naming rules: avoid special characters, diacritics, and punctuation (such as accents, umlauts, or symbols like !, @, #, $, ?), avoid whitespace, and use alphanumeric characters formatted in Snake Case (lowercase words separated by underscores) or Pascal Case (words conjoined with capitalized initials). For our course, name the project: Retro_2D_Platformer.

💡 Cloud Storage Sync Hazard: Never store an active, open GameMaker project inside real-time cloud-synchronized folders such as OneDrive, Google Drive, Dropbox, or iCloud. These background services lock files on disk while syncing changes to the cloud. If GameMaker tries to compile or autosave a locked .yy file, the file can be truncated to 0 bytes, irreversibly corrupting your project.

On-Disk Project Anatomy: Files and Extensions

When you click 'Save' or initialize a project, GameMaker does not generate a single monolithic binary file. Instead, it generates a hierarchical directory structure housing dozens of plain-text files organized under distinct extensions. Understanding the role of each file type eliminates the anxiety of managing directories, simplifies manual backups, and makes version control tools like Git straightforward to implement.

Schematic diagram illustrating on-disk project folder structure with .yyp, .yy, and .gml extensions alongside the logical Asset Browser tree.
Relationship between the OS filesystem structure (.yyp and internal subdirectories) and the logical Asset Browser view in GameMaker. · AI-generated image

Let us examine the foundational components that GameMaker writes to disk upon project initialization:

Extension / DirectoryData TypeArchitectural Function in GameMaker
.yyp (YoYo Project)Master JSON FileThe project manifest. Stores the list of all registered assets, their logical hierarchy, global configuration settings, target platforms, and folder mappings.
.yy (Resource file)Individual JSON MetadataEvery sprite, object, sound, and room receives its own .yy file defining physics properties, layer setups, collision bounds, and component links.
.gml (GameMaker Language)Plain Text Source CodeStores the script logic and event code you write in GML. Can be opened and inspected with any standard text editor, such as VS Code or Notepad++.
folders/ (Directories)On-Disk Directory StructurePhysical folders segregating resources: sprites/, objects/, rooms/, scripts/, sounds/, etc.
.resource_orderConfiguration FileStores the custom visual ordering applied manually within the Asset Browser interface.

The .yyp file is the master hub of the entire project. Double-clicking this file in Windows File Explorer or macOS Finder launches GameMaker and loads the project. If this file is deleted or corrupted during an abrupt system shutdown, GameMaker will no longer recognize existing assets or how they assemble, even if the raw sprites and scripts remain intact on your drive. Maintaining disciplined saving and backup habits is therefore essential.

Professional Asset Browser Organization

When opening your newly created project, you will find the 'Asset Browser' docked on the right side of the screen. By default, GameMaker may display a generic set of groups or present an almost empty tree containing only a default room named 'Room1'. The Asset Browser is a logical hierarchy, not a one-to-one mirror of your hard drive: you can reorganize items into folders within the Asset Browser without breaking physical file paths, as the engine tracks assets internally using Universally Unique Identifiers (UUIDs).

To prevent organization from breaking down once your project expands past fifty or one hundred assets, establish a standardized prefix system and a numbered folder layout. Numbered folders ensure that categories remain grouped in a logical workflow sequence regardless of alphabetical sorting.

Create the following folder structure (or groups) in your Asset Browser. To create a folder, right-click an empty area within the Asset Browser and select 'Create Group' (or press F2 to rename an existing item):

Folder NameRequired PrefixScope and Technical Function
01_Spritesspr_Static graphics, animation strips, and textures for characters, enemies, hazards, and interactables.
02_Tilesetsts_Tile sheets and modular art grids used for efficient world-building and terrain construction.
03_Objectsobj_Interactive entities containing gameplay logic, collision handling, input reading, and GML events.
04_Roomsrm_Game levels, title screens, UI menus, game over screens, and debug testbeds.
05_Scriptsscr_Global functions, reusable math libraries, helper routines, and cross-entity logic.
06_Soundssnd_Short sound effects (SFX) for jumps, impacts, and pickups, as well as background music tracks (BGM).
07_Fontsfnt_Typography assets rasterized into texture sheets to render scores, lives, and HUD readouts.

Why are prefixes like 'spr_', 'obj_', or 'rm_' mandatory? In GameMaker Language (GML), asset identifiers declared in the Asset Browser resolve as global numeric constants in the compiler. If you name your player sprite 'player' and your interactive game object 'player' as well, GameMaker encounters a critical namespace collision. When calling a function like instance_create_layer, the engine cannot resolve whether you mean the 2D visual asset or the logical entity, triggering a runtime crash or compiler error. Strict prefixes completely eliminate this ambiguity: 'spr_player' will never collide with 'obj_player'.

Save Routines, Backups, and Compressed Archive Exports

A reliable GameMaker workflow involves three layers of data preservation: standard incremental saves, IDE autosave behavior, and packaged .yyz archive exports.

Standard incremental saves are triggered via Ctrl + S (Windows) or Cmd + S (macOS). Every time you invoke this shortcut, GameMaker updates modified .yy files and writes changes to the root .yyp manifest. Additionally, the top toolbar features a dual-floppy disk icon labeled 'Save All', which forces an immediate write of every asset currently open across your workspace tabs. Make it an automatic habit to press Ctrl + S after every meaningful change in a script or sprite.

However, saving locally on a single physical drive does not protect against drive failure, accidental deletions, or power surges. For reliable archival backups or cross-machine transfers, GameMaker provides a built-in packaging format: the .yyz archive export (an internal zip container with integrity checks).

Essential Game Options for a Retro 2D Aesthetic

Before creating sprites or coding entities, you must adjust the engine's default rendering settings. Out of the box, GameMaker is configured to filter high-resolution 2D and 3D textures. This means it applies bilinear texture interpolation, blending adjacent pixel colors when the camera zooms, rotates, or scales the output window.

In a retro pixel art platformer, linear interpolation ruins the visual style: it turns clean, sharp pixel clusters into blurry, smeared edges lacking contrast. This post-processing pass must be disabled before building visual assets.

To configure this setting, locate the system settings section in the Asset Browser or click the gear icon labeled 'Game Options' in the primary top toolbar. In the preferences window that appears, carry out the following adjustments:

1. Select the 'Main' tab from the category list on the left. Locate the 'Game Speed' field. Ensure this value is set to 60 Frames Per Second (FPS). This ensures our game's Step Events execute precisely 60 times per second, yielding smooth motion and consistent input polling.

2. Expand the section for your target desktop operating system. On Windows, expand 'Windows' under platform targets and click 'Graphics'. On macOS, navigate to 'macOS -> Graphics'.

3. Locate the checkbox labeled 'Interpolate colours between pixels'. It is typically enabled by default. Uncheck this box to turn it Off. GameMaker will now render textures using nearest-neighbor scaling, preserving the sharp edges and optical clarity of your pixel art.

4. In that same Graphics tab, confirm that 'Start Fullscreen' is left unchecked during development. Running in windowed mode simplifies debugging, keeps the Output log accessible, and lets you switch between GameMaker and the running build without desktop display hiccups.

Verifying the Project via Initialization Code

Every newly created GameMaker project includes an initial Room resource. This 2D space is where instances are placed and where GameMaker kicks off its main execution loop. Before concluding the foundation setup, rename this room to follow our naming conventions and insert a brief diagnostic script to verify that the build pipeline compiles cleanly and communicates with the debug console.

In the Asset Browser, locate the default room named 'Room1'. Right-click it, choose 'Rename' (or press F2), and rename it to 'rm_init'. Then, drag it into the '04_Rooms' group created earlier.

Double-click 'rm_init' to open the Room Editor in your workspace. Inside the Room Properties inspector panel (typically docked on the lower-left or integrated into the inspector sidebar), click the button labeled 'Creation Code'. This opens a dedicated code window whose instructions execute automatically once upon entering the room, before any object instances run their first frame events.

Enter the following GML code into the Creation Code editor for 'rm_init':

// ====================================================================
// INITIAL ROOM CREATION CODE (rm_init)
// Context: Room Creation Code for rm_init
// Purpose: Verify compilation, window caption, and debug output
// ====================================================================

// Update application window caption at runtime
window_set_caption("Retro 2D Platformer - Dev Build 0.1");

// Diagnostic logs printed to GameMaker Output console
show_debug_message("--------------------------------------------------");
show_debug_message("SYSTEM: Retro_2D_Platformer project initialized.");
show_debug_message("SYSTEM: Target refresh rate: " + string(game_get_speed(gamespeed_fps)) + " FPS.");
show_debug_message("SYSTEM: Initial room loaded successfully: rm_init");
show_debug_message("--------------------------------------------------");

Let us review what this code accomplishes. The built-in function window_set_caption accepts a string literal enclosed in double quotes and updates the operating system's title bar text for the game window while running. This confirms immediately that the build is running the expected version.

Next, the show_debug_message function outputs text to the development environment's 'Output' log rather than displaying it to the player. Combining this with game_get_speed(gamespeed_fps) polls the engine's active game speed setting, which is converted to a string with string() and concatenated with the plus operator to verify the target framerate.

To compile and test this initial script, press F5 or click the circular green 'Run' button in the main upper-left toolbar. GameMaker will invoke its internal asset compiler. After a brief compilation phase, a blank window will appear bearing your custom window caption, and the lower 'Output' panel in GameMaker will log your diagnostic confirmation messages, proving your development environment is fully operational for the next module.

Practical Tasks and Consolidation Exercises

To consolidate these foundational concepts and ensure your environment is fully prepared for upcoming systems, complete the following three practical exercises.

Summary

  • Blank projects provide granular technical control and avoid the clutter and hidden dependencies introduced by pre-packaged templates.
  • Local project directories should remain free of special symbols, diacritics, and spaces, and must never be placed inside real-time cloud sync folders (e.g., OneDrive, Dropbox) to avoid file lock corruption.
  • The .yyp file serves as the master JSON manifest of the project; if damaged or removed, GameMaker cannot resolve internal asset relationships.
  • Adhering to standardized asset prefixes (spr_, obj_, rm_, snd_, ts_) prevents namespace collisions within GML's global scope.
  • Pixel art games require unchecking 'Interpolate colours between pixels' in Game Options and locking the engine speed to 60 FPS to ensure crisp rendering and predictable physics.
  • Exporting to .yyz packages and compresses the entire project into a single archive, making it ideal for version milestones and safe transfers across systems.

Practise what you learned

Exercise 1 · 1 point

Why is it strongly discouraged to store an active GameMaker project directly inside cloud-synchronized folders such as OneDrive, Dropbox, or Google Drive?

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

Exercise 2 · 1 point

Match each GameMaker setup element or concept with its correct technical role or purpose:

  • .yyp file
  • Prefixes such as 'spr_' or 'obj_'
  • Blank Project template
  • GML Code
You are practising without an account: nothing is saved. Sign up to keep your progress.

Exercise 3 · 1 point

Arrange the steps to properly initialize a new project from the GameMaker Start Screen in the correct order:

  1. 1Select the project template card labeled 'Blank'.
  2. 2Specify the project name ('Retro_2D_Platformer') and set a local disk directory outside of any synced folders.
  3. 3Choose 'GML Code' as the primary language mode for the project.
  4. 4Click the 'New' button on the Start Screen after signing in.
You are practising without an account: nothing is saved. Sign up to keep your progress.

Sign in to save your progress — Sign in