Aseprite to GameMaker — One Sprite Strip per Tag
GameMaker cuts an image whose name ends in _stripN into N frames on import and wants one sprite per animation. Drop the .aseprite file and export for GameMaker: each tag becomes its own strip with every cell aligned on the pivot, plus a gamemaker.json with origin, speed and milliseconds. UNVERIFIED in GameMaker: no headless GameMaker exists to load the files, so the strips were cut and compared with the source only.

- GameMakerUNVERIFIED
- Godot 4Verified· Godot 4.7.2
- Unity 6Verified· Unity 6000.5.3f1
- Phaser 3 / 4Verified· Phaser 3.90 + 4.2
- PixiJS 8Verified· PixiJS 8.21
- Aseprite JSONVerified· Phaser load.aseprite · PixiJS 8.21
- .asepriteVerified· Aseprite 1.3.18
- Spine / libGDXVerified· spine-canvas 4.2
- Starling / Sparrow XMLVerified· Phaser 4.2
- LÖVEVerified· LÖVE 11.5
- DefoldBuilt· Defold bob.jar 1.13.1
- CSS spritesVerified· Chromium
- GIF / APNGDecoded· Pillow
What it does
- One strip per tag named spr_<file>_<tag>_stripN.png, where N is the number of frames in playback order, reverse and ping-pong included.
- Every cell has the same size with the pivot on the same point, so the sprite origin is identical in every frame and nothing jumps.
- gamemaker.json per sprite: xorigin and yorigin, playbackSpeed in frames per second, loop, and durationsMs for every frame.
- Visible layers are composited into the strip; hidden layers stay out.
- A README with the import steps: Create Sprite › Import (or drag the PNG into the Asset Browser), then set Origin and Speed.
How to do it
- Drop the .aseprite file and check its tags on the Timeline.
- Set the pivot with P, or keep the pivot slice from the file; it becomes the origin.
- Open Pack & Export, choose GameMaker and export.
- In GameMaker, import each strip and enter the origin and speed from gamemaker.json or the README.
- For pixel art, turn off Interpolate colours between pixels in Game Options › Graphics.
From .aseprite to GameMaker files
| In the .aseprite | In the GameMaker export |
|---|---|
| Tag "run" with 8 frames | spr_hero_run_strip8.png |
| Frames with equal durations, e.g. 100 ms | playbackSpeed 10 frames per second |
| Frames with different durations | playbackSpeed = the tag's fps, exact ms in durationsMs, and a warning |
| Pivot slice or a pivot set with P | xorigin / yorigin, the same point in every cell |
| Repeat 0 (loop forever) | loop: true |
| Reverse or ping-pong direction | written out as the frame order of the strip |
| Hit and hurt slices | not written here (use the Generic JSON) |
| Verification | UNVERIFIED in GameMaker; strips decoded and compared with the source |
Engine exports and how each was checked
"Verified" means the exported files were loaded by the real engine or tool on real CC0 assets and the result was compared with the source. Anything that was not loaded is labelled as such.
| Target | Files | Check |
|---|---|---|
| Godot 4 | .tres SpriteFrames · .tscn AnimatedSprite2D · .png.import | Verified Godot 4.7.2Loaded by Godot; every animation frame drawn and compared with the source file. The scene uses Nearest filtering; rotation is never used. |
| Unity 6 | .unity.json · Editor/NerulioSpriteImporter.cs · AnimationClip | Verified Unity 6000.5.3f1Batch mode: sprite rects, pivots, pixels, clip keys and durations checked. |
| Phaser 3 / 4 | atlas JSON (multiatlas) · .anims.json | Verified Phaser 3.90 + 4.2Frames and animations drawn by both versions. |
| PixiJS 8 | spritesheet JSON · animations · anchor · meta.scale | Verified PixiJS 8.21Rotated and multi-page atlases included. |
| Aseprite JSON | hash / array · frameTags · slices | Verified Phaser load.aseprite · PixiJS 8.21Tags keep their direction and repeat count. |
| .aseprite | layers · tags · durations · slices | Verified Aseprite 1.3.18Opened and rendered by the Aseprite command line. |
| Spine / libGDX | .atlas | Verified spine-canvas 4.2Every region drawn by the Spine runtime, rotated and trimmed; libGDX itself was not run. |
| Starling / Sparrow XML | XML per page | Verified Phaser 4.2Phaser 3.90 draws trimmed XML frames wrongly (its own bug); the "Sparrow XML (Phaser 3)" preset turns trim off and passes in 3.90 and 4.2. |
| LÖVE | Lua quads · nerulio_atlas.lua · main.lua | Verified LÖVE 11.5Every frame drawn and every animation stepped through the shipped helper. |
| Defold | .atlas · .tilesource | Built Defold bob.jar 1.13.1Built by Defold's command-line builder; the built texture's UVs were read back. |
| GameMaker | spr_<name>_stripN.png · gamemaker.json | UNVERIFIEDNot loaded in GameMaker (no headless GameMaker). The strips are cut the way its strip importer cuts them. |
| CSS sprites | .css · preview .html | Verified ChromiumEvery class drawn from the shipped stylesheet. |
| GIF / APNG | one file per animation | Decoded PillowEvery frame and delay decoded again after export; APNG is exact. |
Evidence
Exports: 49 runs in the real engines on real CC0 assets, 47 pass — the 2 failures are Phaser 3.90's trimmed-XML bug, which the Phaser 3 preset avoids. Packer head-to-head on 5 real frame sets (CodeAndWeb free web packer, GAPTools, free-tex-packer): smallest sheet on all 5 with rotation allowed, 4 of 5 without; every frame restored pixel-exact.
Limits
- Polygon (mesh) packing is not offered: none of the verified engines draws a mesh atlas from exported data.
- GameMaker strips are UNVERIFIED in GameMaker itself.
- Scale variants (@0.5x–@4x) use nearest-neighbour only.
- Trimmed Starling XML is drawn wrongly by Phaser 3.90; use the "Sparrow XML (Phaser 3)" preset there.
Questions
Has anyone opened these strips in GameMaker?
Not in our checks. GameMaker has no headless mode we could run, so the target is labelled UNVERIFIED. What was checked: the strips decode (Pillow) and every cell matches its source frame; the naming follows the GameMaker manual's sprite strip rule.
My tag has frames of different lengths. What does GameMaker get?
A GameMaker sprite has one playback speed. When a tag's durations differ, the strip uses the tag's fps and the export warns you; the exact milliseconds stay in durationsMs if you want to time frames in code.
Do hitboxes come along?
Not in the GameMaker files, which hold the image, origin and timing only. Boxes and collision polygons are in the Generic JSON export.
Is it free, and do I need an account?
Everything on these pages is free and works without an account. There is no watermark and no export that is held back.
Are my sprites uploaded?
No. The Studio decodes, packs and exports in this browser tab. Projects are autosaved in the browser (IndexedDB) and can be saved as a .nerulio file.
Does it need Aseprite or an engine plugin installed?
No. .aseprite files are read and written in the browser, and each engine bundle carries what that engine needs (for Godot, the import settings and scene; for Unity and the Godot TileSet, a small editor script).