Getting it into your project
Using the sheet and the atlas
There are two ways an engine reads a sheet, and the words for them get muddled constantly — which is the usual reason a sheet loads but nothing appears on screen.
A sprite sheet has fixed-size cells and you ask for frames by number: the engine slices the grid itself from three values, so no data file is involved at all. A texture atlas is packed to save space, holds frames of assorted sizes, and you ask for them by name — which only works because a data file lists where each one is.
This maker produces the first kind: a uniform, untrimmed grid. That is deliberate, and it is the reason the output drops into any engine without a plugin. The JSON is a convenience on top, for loaders that would rather work by name.
| Route | What you hand over | Notes |
Grid slicing works everywhere | The PNG, plus cell size, padding and margin from under the preview | Every 2D engine can do this and none of them need a plugin for it. Phaser's load.spritesheet takes a frameConfig whose frameWidth/frameHeight are the cell, whose spacing is the padding and whose margin is the margin — the maker reports all three separately for exactly this reason. Godot slices a uniform sheet with the hframes and vframes on a Sprite2D, or via Add frames from sprite sheet on a SpriteFrames resource. Unity does it in the Sprite Editor's grid slice. |
Texture atlas by name | The PNG and the .json together | Loaders built around the TexturePacker-style atlas read this directly — Phaser's load.atlas accepts both the Hash and Array shapes and works out which it was given. Godot and Unity do not read this JSON out of the box; they want a plugin or a short script. If they are your target, take the grid route above instead — it costs you nothing here. |
| Your own loader | The Plain coordinates JSON | A flat list of { name, x, y, w, h } and nothing else. The least there is to parse if you are writing the loading code yourself, or driving CSS background-position for an icon sprite. |
The Hash and Array variants carry identical information and differ only in shape: Hash keys the frames by filename, Array keeps them in order with the filename as a field. If your loader does not say which it wants, try Hash — it is the more common of the two.
// Plain coordinates — the whole format, nothing hidden
{
"frames": [
{ "name": "run_01.png", "x": 0, "y": 0, "w": 64, "h": 64 },
{ "name": "run_02.png", "x": 66, "y": 0, "w": 64, "h": 64 }
],
"meta": {
"image": "run-sheet.png",
"size": { "w": 256, "h": 128 },
"cell": { "w": 64, "h": 64 },
"columns": 4, "rows": 2,
"padding": 2, "margin": 0
}
}
Note the x of the second frame: 66, not 64. That is the 64-pixel cell plus the 2 pixels of padding — the arithmetic your engine has to do too, and the reason the padding value has to travel with the sheet rather than living in your head.