FNF sprite sheet and XML maker

Drop in your character's poses, name the animation, and download a PNG with a Sparrow XML that Psych Engine reads. It also works the other way: pull every frame out of a mod's existing sheet.

<TextureAtlas imagePath="spritesheet.png">
  <SubTexture name="singLEFT0000" x="0" y="0" width="150" height="150"/>
  <SubTexture name="singLEFT0001" x="150" y="0" width="150" height="150"/>
  <SubTexture name="singLEFT0002" x="300" y="0" width="150" height="150"/>
  <SubTexture name="singLEFT0003" x="450" y="0" width="150" height="150"/>
</TextureAtlas>

This is what the export writes. Casing is kept, and the four digit index is added for you.

New character, or one you already have

Most people show up with one of two jobs. Both happen in the same editor, and a sheet you extract can go straight back out as a new XML.

Make a sheet from poses

  1. 1Drop your pose PNGs on the editor, in the order they should play.
  2. 2Rename the layer to the animation name, for example singLEFT. The export reads it from there.
  3. 3Click Format, pick Sparrow / Starling XML and download the ZIP.
  4. 4Rename spritesheet.png and spritesheet.xml to the character name and update imagePath inside the XML to match.

Extract frames from a mod

  1. 1Drop the PNG from the mod on the editor. The Import image dialog opens.
  2. 2Choose Atlas and pick the .xml that shipped with it.
  3. 3Each SubTexture comes in as its own frame, in the order the XML lists them.
  4. 4Fix a pose, recolor the set, or export every frame as a separate PNG with ZIP.

Ask before reusing another mod's art in a release. Pulling frames apart to learn how a sheet is built is a different thing from shipping them.

When the mod loads but the animation doesn't

Almost every broken FNF sheet comes down to the frame names. Sparrow has no animation list. A frame belongs to an animation because its name starts with that animation's prefix.

The mod says an animation was not found.
Prefixes are case sensitive. singLEFT and singleft are two different animations, so copy the name from the character file exactly.
singLEFT plays the miss frames too.
Flixel matches from the start of the name, so singLEFT also collects singLEFTmiss0000. Give the two animations names where neither is the start of the other, or keep them in separate sheets.
The name lost its spaces.
Only letters, digits, underscores and hyphens survive the export. Write the name without spaces in both the layer and the character file.
A pose sits a few pixels too high.
Leave the sheet alone and change that animation's offsets in the character file. Moving pixels in one frame shifts it against every other frame.

Questions modders ask

Build the sheet for your next week

Free, no account, and your art stays on your machine.

Open the editor