Skip to content
nkh.do
Go back

I Can't Draw, So I Built Another Tool

I needed new assets for Medieval Boom. There was one small problem with this plan.

I cannot draw.

I can write a multiplayer server. I can spend an unreasonable amount of time making a character move smoothly across a tile. Ask me to draw that character, though, and we have reached the edge of the service area.

So now I have SpriteSheetStudio, a personal tool for turning generated sprites into animations. It has already produced the mage, knight, and ranger skins for Boom. Actual assets. In the actual game. A side project with evidence of usefulness. I’m as surprised as you are.

SpriteSheetStudio logo

A fork, followed by requirements

SpriteSheetStudio started as a fork of acatovic/ai-game-studio. Credit where it’s due: that gave me a starting point for generating game art.

The original flow didn’t quite fit how I wanted to work. For Boom, a character needs multiple animations. Getting one movement out is useful. Keeping an idle, a run, and an attack together is how I actually need to work on a skin.

So I changed the project model. One project can now hold multiple named animations, each with its own selected frames and playback speed. Saved animations keep their own copies of the frames, so generating the next movement video doesn’t eat the previous work.

The knight is allowed to learn how to run without forgetting how to stand still. A modest educational standard.

SpriteSheetStudio showing a ladybug boss project with idle, run, attack, and guard animations, a frame selector, and a preview.

The ladybug boss is the example in this screenshot. The palette controls have evolved since it was taken.

Then the blue had to be the correct blue

Boom has another requirement: team colors come from runtime palette swaps. I ship reference art, and the game replaces specific team-color shades when it loads the character.

Specific is doing a lot of work in that sentence.

A pixel that looks almost like the expected blue can still miss an exact color lookup. The renderer does not appreciate artistic interpretation. It has a table.

That meant SpriteSheetStudio needed color palette support too. I added named palettes that can be shared across projects and used to constrain the generated reference sprite’s subject colors. There’s also a palette lock for extracted movement frames, using the reference sprite’s colors to keep the animation from wandering off into its own paint aisle.

The two tools have different jobs: SpriteSheetStudio helps prepare the source art; Boom performs the team-color swaps at runtime. Picking a palette doesn’t magically tell the generator which pixels should be armor, skin, or leather. I still need to inspect the result.

But now the asset tool can work with the color constraints of the game it’s making assets for. Apparently this is what happens when a side project acquires a customer and the customer is also me.

From sprite to sheet

The workflow is fairly straightforward:

  1. Generate a reference sprite, or upload one, with the expected green background.
  2. Generate a movement video from it.
  3. Extract transparent frames locally.
  4. Choose the frames, name the animation, and set its FPS.
  5. Save it and export a horizontal PNG spritesheet.

Then repeat for the next animation in the same project. Video generation and frame extraction are separate steps, so I can adjust extraction without paying for another generated video.

Image and video generation go through OpenRouter. The app runs locally, with ffmpeg and Sharp handling frame processing. If you want to run it, the repository README has the setup instructions.

There is still a human sitting in front of the frame picker. That’s me. Style guidance is best-effort, frames need choosing, and removing a green background can also remove green bits you wanted to keep. This has not made me an artist. It has given me a different set of things to fiddle with.

Three skins is a start

The mage, knight, and ranger skins are the useful part of this story. I wanted more assets for Boom, and this workflow helped me make them.

Here’s the knight, straight from Boom’s skin assets:

Six frames of the generated knight's idle animation, wearing blue and gold armor and holding a sword.

The idle spritesheet. Standing around, but professionally.

Eight frames of the generated knight's attack animation, lifting and swinging a sword.

The attack spritesheet. Same skin, another animation from the workflow.

Along the way, a fork became a tool with multiple animations per project and palette support shaped around my game. Very predictable behavior from someone who already built a whole game because he missed playing one.

SpriteSheetStudio has a project page now, and the source is on GitHub.

I still can’t draw. The repository count continues to rise.


Share this post on:

Next Post
Adding Team Colors Made My Game Smaller: Runtime Palette Swap