Sprite Slicer Open the tool →

How to Import a Sprite Sheet into GameMaker

An original bomb-cart enemy sprite for a 2D defense game, ready for GameMaker.
Import a strip of frames like this into GameMaker and it becomes a playable, animated sprite.

GameMaker has imported sprite sheets the same way for so long that I half expect a museum plaque next to the Image menu. It works, it's quick once you know the dance, and it trips up every single person on their first try because the strip importer asks for numbers in a specific order and silently does the wrong thing if you fudge one. I've brought hundreds of animations into GameMaker projects, and the pattern is always the same: ten seconds of typing, then a confused minute of "why is half my character missing." Here are the real menu names and the actual gotchas.

I'll assume you've got a sheet that's a clean horizontal (or grid) strip of equal-size frames. If yours is a packed atlas with uneven frames, slice it into a tidy strip first with the Sprite Slicer, then come back. GameMaker's importer wants a regular grid; feed it one and the rest is easy.

Step 1: Create a sprite asset

In the Asset Browser, find the Sprites folder, right-click it, and choose Create → Sprite. That opens the Sprite Editor with a fresh, empty asset. Give it a sensible name right away — I prefix mine with spr_, so spr_player_run, because in three weeks you will not remember which of forty sprites is the walk and which is the run. Naming is free and future-you is grateful.

Don't reach for the big "Import" button on the sprite panel just yet. That button imports a single image as one frame, which is what you want for individual PNGs but not for a strip. For a sheet, we go through the image editor.

Step 2: Split the strip into frames with Import Strip Image

With the sprite open, click Edit Image. This opens the Image Editor, the pixel-canvas view with the frame timeline along the bottom. Now open the Image menu at the top and choose Import Strip Image — sometimes labeled Convert to Frames depending on your version. This is the actual sheet-cutter. Pick your PNG and a dialog appears asking you to describe the grid.

The fields are exactly what you'd expect once you've sliced a sheet before:

  • Number of Frames — total frames in the animation, the full count across the whole sheet.
  • Frames Per Row — how many sit in one horizontal row. For a single long strip this equals the frame count; for a grid sheet it's the columns.
  • Frame Width and Frame Height — the pixel size of one cell, not the whole sheet. This is the number people get wrong most.
  • Horizontal/Vertical Offset — padding before the first frame, the margin at the top-left.
  • Horizontal/Vertical Separation — the gap between cells, if the sheet was exported with gutters to prevent bleeding.

Fill those in, confirm, and GameMaker chops the strip into individual frames that show up in the timeline at the bottom of the Image Editor. The math it runs is simple: it walks the sheet in steps of offset + n × (frame_size + separation), which is worth knowing because it tells you which field to blame when a slice is off. If you'd rather skip this dialog entirely, importing a folder of individual PNG frames also works — GameMaker drops them in as consecutive frames in file order, so name them run_00, run_01, and so on to keep the sequence right.

Step 3: Set the origin

The Origin is the sprite's pivot and draw anchor — the point that lands exactly on the instance's x and y in the room, and the point everything rotates and scales around. The default is the top-left corner (0, 0), which is almost never what you want.

In the Sprite Editor there's an Origin dropdown with presets. For most things, Middle Centre is the sane default. For a character that stands on the ground, set Bottom Centre — then the sprite's feet sit on its y coordinate, which makes floor collisions, jumping, and depth-sorting behave the way your brain expects. You can also type exact origin pixel values if you need a precise pivot, like a gun muzzle or a thrown weapon's grip.

Set this once and set it deliberately. A wrong or inconsistent origin is the source of the classic "my sprite jitters when it animates" bug, and it's maddening to debug from the gameplay side when the real fix lives in the sprite asset.

Step 4: Set the playback speed

Back in the Sprite Editor, find the Speed field. This is your animation frame rate, and GameMaker gives you two modes that behave very differently:

  • Frames Per Second — the sprite plays at the literal fps you type, independent of the game's room speed. Set 12 and it cycles twelve sprite-frames every real second. This is the mode I default to, because it decouples your animation timing from the game's tick rate.
  • Frames Per Game Frame — the sprite advances by that many sprite-frames every game step. Set 0.25 and it moves a quarter-frame per step, so the speed is tied to your room speed. Useful when you want animation locked to the simulation, but a footgun if you later change the room speed and every animation silently speeds up.

Pick FPS unless you have a specific reason not to, and remember you can always override an instance's speed in code with image_speed at runtime regardless of the asset setting.

Step 5: Keep the pixels crisp

People skip this step and then wonder why their crisp pixel art looks smudged in-game. By default GameMaker bilinearly filters textures, which is great for smooth high-res art and a disaster for pixels.

Go to Game Options, open your target platform (Windows, HTML5, whatever you're shipping), find the Graphics section, and turn OFF the option Interpolate colours between pixels. Now hard edges stay hard. A few more habits that keep things sharp:

  • Watch for texture bleeding — if you see faint slivers of a neighboring frame's color along an edge, the frame is sitting too close to others on its texture page. Add a little padding, or keep the sprite tidy with a clean transparent border before importing.
  • Avoid non-integer scaling. Draw your pixel sprites at 1x, 2x, 3x, never 1.5x or 2.7x. Fractional scale forces the GPU to invent in-between pixels and your clean art turns to mush even with interpolation off.
  • Match your camera and viewport so the in-game pixel maps to a whole number of screen pixels. A mismatched view size reintroduces the exact blur you just turned off.

The three gotchas that get everyone

If your import looks wrong, it's almost always one of these, in roughly this order of likelihood:

  1. Frames are clipped or shifted. Your strip parameters are off. The usual culprit is putting the sheet width into Frame Width instead of the cell width, or forgetting the separation on a sheet that has gutters. Re-check Frame Width, Frame Height, and Separation against one cell, not the whole image.
  2. Everything's blurry. Interpolation is still on. Either you missed the Game Options toggle, or you've got non-integer scaling somewhere in your draw or your view. It's never the sprite asset itself — it's downstream.
  3. The sprite drifts or wobbles between frames. The origin is wrong or the frames aren't aligned to each other. Set a consistent origin (Bottom Centre for grounded characters), and make sure each frame was trimmed and positioned the same way before import. This is the foot-slide problem, and it's worth reading up on origins and pivots if it keeps biting you.

Where the frames come from

GameMaker imports cleanest from a regular strip, so the prep matters as much as the import. If you've got a packed or uneven sheet, run it through the Sprite Slicer first to get equal-size frames you can hand straight to Import Strip Image — and there's a fuller walkthrough of grids, gaps, and offsets in the guide to slicing a sprite sheet. If your animation started life as a video clip, an AI-generated one or a screen capture, pull stills out of it first with the Frame Extractor, then treat those frames as your source. Everything runs in the browser, so unreleased art never leaves your machine.

Bringing the same animation into another engine? The workflow rhymes but the menus differ — see the Unity import guide and the Godot 4 import guide for those.

None of this is hard. It's a sequence of specific clicks where one wrong number costs you a confused minute. Get the strip parameters right, set a deliberate origin, kill interpolation, and the sprite plays clean the first time.

FAQ

Q. How do I split a sprite sheet into frames in GameMaker?

Create a sprite (right-click the Sprites folder → Create Sprite), click Edit Image to open the Image Editor, then use the Image menu → Import Strip Image (sometimes called Convert to Frames). In the dialog you give the Number of Frames, Frames Per Row, the cell Frame Width and Height, and any offset and separation, and GameMaker cuts the strip into individual frames in the timeline.

Q. Why is my imported sprite blurry in GameMaker?

Interpolation is still on. Go to Game Options → your platform → Graphics and turn off "Interpolate colours between pixels" so pixel edges stay hard. If it's still soft, you have non-integer scaling somewhere — draw and scale your pixel sprites at whole-number multiples (1x, 2x, 3x), never fractional, and match your view size to a whole-pixel mapping.

Q. What should I set the sprite origin to?

The origin is the sprite's pivot and draw anchor — the point that lands on the instance's x and y. Use Middle Centre as a general default, and Bottom Centre for characters that stand on the ground, so their feet sit on the y coordinate and floor collisions behave. A wrong or inconsistent origin is the usual cause of a sprite that drifts or jitters between frames.

Q. What's the difference between Frames Per Second and Frames Per Game Frame?

Frames Per Second plays the animation at the literal fps you type, independent of room speed, so 12 means twelve sprite-frames per real second. Frames Per Game Frame advances the sprite by that many frames every game step, tying animation speed to your room speed. FPS is the safer default because changing room speed later won't silently alter your animation timing.

Q. My imported frames are clipped or cut off — what went wrong?

Your strip parameters are off. The most common mistake is entering the whole sheet's width as the Frame Width instead of one cell's width, or ignoring the separation on a sheet that has gaps between cells. Re-check Frame Width, Frame Height, and Separation against a single frame, not the full image, and confirm the Frames Per Row matches the actual column count.

Q. Can I import individual PNG frames instead of a strip?

Yes. Importing a folder of single PNGs drops them in as consecutive frames in file order, which is handy if your animation was exported as separate images. Name them with zero-padded numbers like run_00, run_01, run_02 so they load in the right sequence, since GameMaker orders them by filename.

Open Sprite Slicer — cut & align your frames →