Most of my prototypes die in the same place. The movement code works, the jump feels okay, and the player is still a white rectangle because nobody wants to draw a walk cycle at 1am.
Grey boxes are fine for testing collisions. They are less fine when you want to tell whether a game feels right, or show it to someone. Animation timing changes how movement reads, and you can't judge that with a rectangle.
So I built Spritix. You upload one full-body character image, and it generates Idle, Walk, Run, Jump and Attack animations and lays them out as sprite sheets. This post is less about the tool and more about the workflow I use to get from "one drawing" to "a character playing animations in the engine" quickly.
Start with a decent source image
The one input matters a lot. A few things that help with any sprite AI tool or image-to-animation step, not just this one:
- Full body, nothing cropped. If the feet are cut off, the walk cycle has to guess.
- Limbs visible. A character with arms tucked behind a cape gives the model less to work with.
- A plain background.
A front or three-quarter view of the character standing in a neutral pose is the easiest case.
Pick the actions and clean up the loops
Choose which of the five actions you want the sprite generator to produce. For a platformer prototype that's usually all of them; for a top-down thing you might skip Jump.
After generation there's a loop editor where you can trim frames, change speed (0.5x to 2x) and adjust frame count and frame size. That editing is free, so it's worth spending a minute here instead of fixing timing later in the engine. Version history means you can go back if you overdo it.
The thing I'd check most carefully is frame size. Keep it uniform across every action you plan to use. Mismatched cell sizes are the most common reason a character "jumps" a few pixels when switching from idle to run.
Export
You get four formats:
- sprite sheet PNG
- animated GIF (handy for checking the loop or posting progress)
- Atlas JSON
- frames ZIP
For Godot I usually take the PNG sheet. Phaser and PixiJS are happy with the sheet plus Atlas JSON. If your engine or Aseprite workflow prefers individual images, use the ZIP.
Into Godot 4
Create an AnimatedSprite2D under your player, make a new SpriteFrames resource, and use "Add frames from sprite sheet" to slice the PNG by grid. Name the animations to match your states: idle, walk, run, jump, attack.
If you're doing pixel art, set the texture filter to Nearest on the node or project-wide, or everything goes blurry.
Then a small state picker in the player script:
extends CharacterBody2D
@onready var sprite: AnimatedSprite2D = $AnimatedSprite2D
const RUN_THRESHOLD := 180.0
func _physics_process(delta: float) -> void:
# ... your movement code that sets velocity ...
move_and_slide()
_update_animation()
func _update_animation() -> void:
if Input.is_action_just_pressed("attack"):
sprite.play("attack")
return
if sprite.animation == "attack" and sprite.is_playing():
return # let the attack finish
if not is_on_floor():
sprite.play("jump")
elif abs(velocity.x) > RUN_THRESHOLD:
sprite.play("run")
elif abs(velocity.x) > 5.0:
sprite.play("walk")
else:
sprite.play("idle")
if velocity.x != 0:
sprite.flip_h = velocity.x < 0
Turn looping off for attack in the SpriteFrames panel, otherwise is_playing() never goes false.
A note on flip_h: if your character art has an obvious light source on one side, flipping makes it visible. For a placeholder nobody cares. For final art you may want separate left-facing frames.
Unity, briefly
Import the PNG, set Sprite Mode to Multiple, slice by cell size in the Sprite Editor, then drag the slices for each action into an Animation clip. Set Filter Mode to Point for pixel art. Same idea as Godot, different buttons.
Where it falls short
No AI sprite sheet generator, mine included, is going to replace an animator. Odd poses or partially hidden limbs in the source image produce odd results. Attack animations in particular are generic; they won't know your character is supposed to swing a specific weapon in a specific way. I think of the output as a usable first pass: good enough to tune game feel and show a build, and something a real artist can replace or paint over later.
There's a free tier of 20 credits a month, which is enough to try it on a character or two.
If you have a different pipeline for getting temporary animated characters into a prototype, I'd like to hear it. Especially anyone doing this in GameMaker or Phaser.
Top comments (1)
"You can't judge animation timing with a rectangle" is so true for game feel. A placeholder that moves like a character lets you tune jump arcs and acceleration much earlier. Do the generated sheets keep the same frame size and pivot across actions? That's usually where swapping animations in Godot starts to jitter.