For GameMaker developers

GameMaker to Godot, a GML to GDScript map for your port

Objects become scenes with scripts, rooms become scenes, events become callbacks. The mapping is close enough to move fast, and different enough in timing to bite. Here is the map, the traps, and when staying in GameMaker is the better call.

The short answer

No converter turns a GameMaker project into a working Godot game, but the concepts map closely. Objects become scenes with an attached GDScript, rooms become scenes, and the Create, Step and Draw events become _ready, _process and _draw. Alarms become Timer nodes, instance_create_layer becomes instantiate() plus add_child, and sprite strips become SpriteFrames played by an AnimatedSprite2D. Watch the timing, because alarms count steps while Timers count seconds, and a Godot _draw runs once until you ask for a redraw. Summer is a desktop engine compatible with Godot 4, so the same map applies, and its agent can rebuild each object from your GML as the spec.

GameMaker developers usually move for one of three reasons. They want a node and scene system that scales to bigger projects, they want an open engine with no license tiers, or they want 3D later. Whatever the reason, the good news is that GameMaker and Godot think about 2D games in similar shapes. Both have instances that own their behavior, both have a per-frame loop, and both draw in a y-down 2D space.

The differences are in the details. Where GameMaker gives an object a fixed list of events, Godot gives a node a handful of callbacks and expects you to compose behavior from child nodes. Where GameMaker counts time in steps, Godot counts it in seconds. Where GameMaker redraws every step, Godot caches custom drawing. This guide maps each concept, flags the traps, and gives an order of work that keeps the port playable at every stage.

What it does

Objects become scenes with scripts

A GameMaker object is a sprite, a collision mask and a set of events. In Godot that is a small scene, for example a CharacterBody2D with an AnimatedSprite2D and a CollisionShape2D as children, and one GDScript attached to the root.

Rooms become scenes

A room is a scene that instances your object scenes. Tile layers become TileMapLayer nodes, and the GUI layer becomes a CanvasLayer holding Control nodes.

Events become callbacks and signals

Create maps to _ready, Step to _process or _physics_process, Draw to _draw. Collision events become body_entered and area_entered signals on Area2D, and input events become input actions checked in code or in _unhandled_input.

Global state becomes autoloads

Variables you kept under global and controller objects you placed in every room become autoload singletons, scripts or scenes that Godot loads once and keeps alive between scenes.

Parent objects become inheritance

An object parent becomes a script that other scripts extend, or an inherited scene. event_inherited() becomes a call to super() in the overriding function.

An agent that reads your GML

Summer's in-app agent, or a coding agent connected through the Summer MCP, can take one object's GML as the spec, build the matching scene and script, run the game and check the result. You review each object instead of typing it.

How it works

  1. 1

    Step 1: Freeze the GameMaker version and write down the numbers

    Before touching Godot, list every tuning value in your objects, such as speeds, gravity, jump strength, alarm lengths and your game speed. These numbers are the spec. Convert anything measured in steps into seconds by dividing by the game speed.

  2. 2

    Step 2: Import the art

    Copy sprite strips and backgrounds into the project folder. For each animated sprite, create a SpriteFrames resource, use Add frames from a Sprite Sheet, set the horizontal and vertical frame counts, and set the animation speed in frames per second. If the GameMaker sprite's speed is set in frames per second, use that value times image_speed. If it is set in frames per game frame, multiply it by your game speed as well.

  3. 3

    Step 3: Rebuild the player object first

    Make a scene with a CharacterBody2D root, an AnimatedSprite2D and a CollisionShape2D. Port the Create event into _ready and the Step event into _physics_process(delta), and multiply per-step speeds by the game speed to get pixels per second, then by delta when you move.

  4. 4

    Step 4: Rebuild one room

    Make a level scene, paint the tiles into a TileMapLayer, and instance the player and a few enemies. Get this one room playing like the original before you port the rest.

  5. 5

    Step 5: Port the core loop, then UI, then content

    Move scoring, death, checkpoints and saving next. Rebuild the Draw GUI layer as Control nodes on a CanvasLayer. Only then port the remaining objects and rooms, reusing the scenes you built.

  6. 6

    Step 6: Playtest against the original side by side

    Run both versions and compare jump arcs, enemy timing and menu flow. Differences almost always trace back to a step-to-second conversion or to code that ran in a different event order.

Two ways to run it

In Studio, or from the agent you already use

In Summer Studio

Summer Studio runs in the browser and generates 2D art. Use it to make replacement sprites, backgrounds, tiles and UI pieces, and sound effects and music, then download the files into your Godot 4 or Summer project. Studio can also slice a generated asset sheet into separate images.

Make sprite sheets in Studio

From Claude, Cursor or Codex via MCP

From Claude Code, Cursor or Codex, the Summer MCP can read your GML files as the spec and rebuild objects in the Summer desktop app, then run the game with summer_play and check it with summer_game_probe. For a sheet of separate items generated by Summer, summer_slice_asset_sheet detects and crops each item on Summer's servers. Animation strips are better imported as SpriteFrames with a frame grid.

Example prompt for your agent

Read objects/obj_player/Step_0.gml and Create_0.gml from my GameMaker project as the spec. My game speed is 60. In the open Summer project, build a player scene with a CharacterBody2D, convert every per-step value to per-second, run the game and show me a screenshot.
Set up the Summer MCP
GameMaker concepts and their Godot 4 equivalents
GameMakerGodot 4 and SummerWhat to watch
ObjectA scene with a root node and an attached scriptBehavior is composed from child nodes, such as a sprite, a collision shape and a Timer.
InstanceAn instanced scene in the treeEach instance is a node you can find by path, group or signal.
RoomA sceneThe main scene is set in Project Settings. Change scenes with change_scene_to_file or change_scene_to_packed.
Room layers and tile layersNode order, CanvasLayer and TileMapLayerDraw order follows the tree and z_index instead of layer depth.
Create event_ready()Exported variables are set before _ready runs, similar to how GameMaker sets instance variables before Create.
Step event_process(delta) or _physics_process(delta)Per-step values need converting to per-second and multiplying by delta.
Begin Step and End Stepprocess_priority on _processSet a lower process_priority on nodes that must run first. Keep _physics_process for movement and collision, not for ordering.
Draw event_draw()Runs once and is cached. Call queue_redraw() when something changes, or from _process to redraw every frame.
Draw GUI eventControl nodes on a CanvasLayerUI is built from nodes, not drawn by hand each frame.
Alarm[0] to Alarm[11]Timer nodesAlarms count steps and Timers count seconds. Divide by your game speed.
instance_create_layer(x, y, layer, obj)scene.instantiate(), then add_child(node)Set the position before or right after adding the node.
instance_destroy()queue_free()The node is removed at the end of the frame.
with (obj) { }A loop over get_tree().get_nodes_in_group(name)Add instances to a group in the editor or with add_to_group.
global.variableAn autoload singletonAutoloads persist between scenes, like a persistent controller object.
Object parent and event_inherited()extends and super()Inherited scenes also let child scenes override visuals.
Sprite strip and image_speedSpriteFrames played by AnimatedSprite2DSpeed in frames per second. Carry over the Sprite Editor speed times image_speed, and convert frames per game frame by multiplying by game speed.
Collision mask and collision eventsCollisionShape2D, CharacterBody2D and Area2D signalsCollisions report through move_and_slide and signals instead of events.
ds_list and ds_mapArray and DictionaryBuilt into GDScript, with no manual destroy.

Sources: GameMaker manual, Object Events

Examples

Prompts that work, and what comes back

Prompts and checks for the first objects you port. Each one targets a place where GameMaker and Godot differ.

Alarms to Timers

Prompt

obj_spawner sets alarm[0] = room_speed * 3 in Create and respawns an enemy in Alarm 0. Rebuild it with a Timer node, wait_time 3.0, not one-shot, and connect timeout to the spawn function.

What you get

A spawner scene that fires every 3 seconds regardless of frame rate, with the Timer visible and editable in the inspector.

Draw event that updates every frame

Prompt

My Draw event draws a health bar above the enemy every step. Port it to _draw and make sure it redraws when health changes.

What you get

A _draw function plus a queue_redraw() call when health changes, since Godot caches custom drawing until asked to redraw.

Creating instances

Prompt

Replace instance_create_layer(x, y, "Bullets", obj_bullet) with the Godot equivalent, adding bullets under a Bullets node in the level.

What you get

A preloaded bullet scene, instantiate(), a position set from the gun, and add_child on the Bullets node, which mirrors the layer.

with statements

Prompt

with (obj_enemy) { hp -= 10 } runs when the bomb explodes. Rebuild it in GDScript.

What you get

Enemies added to an enemies group, and a loop over get_tree().get_nodes_in_group("enemies") that applies the damage.

Globals

Prompt

Move global.score, global.lives and global.level into a Godot autoload called Game and update every script that reads them.

What you get

A Game autoload script registered in Project Settings, with the old globals as its variables.

The timing traps

GameMaker splits time into steps, with the game speed setting how many steps run per second, and its manual describes a step as another word for a frame. Alarms count down in steps. The manual's own example sets an alarm to the game speed times three to wait three seconds. A Godot Timer takes its wait_time in seconds, so that alarm becomes a Timer with a wait_time of 3.0. If you copy the raw number across, a 90-step alarm at a game speed of 30 turns into a 90-second wait.

Movement has the same issue. GameMaker code often moves an instance by a fixed amount per step. In Godot, work in pixels per second and multiply by delta, the time in seconds since the last call. Put movement and collision in _physics_process, which runs 60 times per second by default, and keep visual updates in _process.

Drawing works differently

In GameMaker the Draw event runs every step for every visible instance, so drawing code that depends on changing values just works. Godot's docs say the _draw function is only called once and then the draw commands are cached. When a value that affects the drawing changes, call queue_redraw on that node, or call it from _process when you really need a redraw every frame.

Most Draw code does not need porting at all. Sprites, text, bars and menus are nodes in Godot, such as Sprite2D, Label, TextureProgressBar and the Control family, so reserve _draw for procedural shapes and debug overlays.

Sprites, strips and sheets

A GameMaker sprite strip becomes a SpriteFrames resource. In the SpriteFrames panel, choose Add frames from a Sprite Sheet, set the number of horizontal and vertical images, select the frames and name the animation. AnimatedSprite2D plays it. Use an AnimationPlayer instead when an animation also needs to move, scale or trigger other properties.

Sheets of separate items are a different job. If you generate a sheet of props, icons or UI pieces with Summer, summer_slice_asset_sheet removes the background, detects each item and returns them as separate images, so you do not cut them by hand.

GameMaker vs Godot, licensing and when to stay

GameMaker's Free tier carries a non-commercial licence. Selling a game needs a commercial licence, either Professional, a one-time purchase, or Enterprise, a subscription that adds console exports and source code access. Every tier includes desktop, mobile, web and GX Games exports. Godot has no license tiers, and Summer's engine needs no commercial licence to sell a game. The creator owns the project with no royalties.

Staying is a reasonable choice. If the game is nearly finished, if you rely on GameMaker's console exports through Enterprise, or if the browser is your main market, GameMaker does things Summer does not. Summer is a desktop app for macOS and Windows that builds Windows and macOS versions of your game. Web export is not available in Summer yet, and Summer has no console export of its own.

Why there is no reliable converter

Tools that promise to convert GameMaker projects can move assets and some structure, but GML and GDScript run on different engine models, with different event order, timing units, collision systems and drawing rules. A converted project that compiles still plays differently. Treat the GameMaker project as the spec, port one object at a time, and test each against the original. With Summer, the agent does the typing from your GML and you do the judging.

Where to take your GameMaker game next

Port it to make money

Steam is where most GameMaker and Godot games are sold. It needs a desktop build, a store page visible as Coming Soon for at least two weeks, and a Steam Direct fee of 100 US dollars per game, paid back after the game earns 1,000 US dollars in adjusted gross revenue. If you stay in GameMaker, selling requires a commercial licence.

How to publish a game on Steam

Release it on Summer Games

Summer Games is a new store for games made with Summer. It is launching soon. A GameMaker build will not qualify as it is. A version rebuilt in Summer, reviewed, and working as a single-player game first is the kind that will be ready.

See Summer Games (launching soon)

Grow it

A port is a chance to relaunch. Refresh the capsule art, cut a new trailer that shows play in the first seconds, open the store page early so wishlists build, and tell the people who played the original. Creators who covered it once may cover it again.

Market your indie game

Remake it in Summer

Start from a 2D template near your genre, copy your sprites in, and have the agent rebuild each object from its GML as the spec. Playtest each object against the GameMaker build before you move to the next.

Remake your game in Summer

Frequently asked questions

Is there a GameMaker to Godot converter?

No converter produces a Godot game that plays like the original. Assets move directly, and the logic is ported object by object. Summer's agent can use each object's GML as the spec and build the matching scene and script, which you then playtest against the GameMaker version.

Is GDScript hard to learn after GML?

Usually not. Both are dynamically typed scripting languages built for their engine. GDScript uses indentation like Python instead of braces, and adds optional static types, classes and signals. The larger change is thinking in nodes and scenes rather than objects with event lists.

What replaces alarms in Godot?

Timer nodes. Set wait_time in seconds, choose one-shot or repeating, and connect the timeout signal. Convert alarm lengths from steps to seconds by dividing by your game speed, and use await get_tree().create_timer(1.5).timeout for one-off waits in code.

Can I sell a game made with GameMaker's free version?

No. GameMaker's Free tier is licensed for non-commercial use. Selling a game needs the Professional licence, a one-time purchase, or the Enterprise subscription, which also adds console exports. Godot has no license tiers, and neither Godot nor Summer charges a royalty.

Does Godot draw every frame like GameMaker?

Nodes such as sprites and labels draw every frame automatically. Custom _draw() code is different. It runs once and is cached, so call queue_redraw() when something it depends on changes.

Is Godot better than GameMaker?

It depends on the game. GameMaker has a focused 2D workflow and exports to desktop, mobile and the web on every tier, with consoles on Enterprise. Godot is free under the MIT license, handles 2D and 3D, and organizes larger projects with nodes and scenes. If the game is 2D, nearly done and aimed at the browser, staying in GameMaker is often right. If you want 3D later, an open engine or no licence tiers, Godot is usually the better fit.

Where do my GameMaker sprites go?

Copy the image files into the project and build a SpriteFrames resource for each animated sprite with Add frames from a Sprite Sheet. Set the animation speed in frames per second, which is the sprite's Sprite Editor speed times image_speed, converted from frames per game frame if the sprite uses that setting.

Make your game. Grow your game.

Even if it is built in another engine.

Free to download for macOS (Apple silicon) and Windows.