Aseprite Visual Novel Atlas
Your spritesheet is useless until you have this JSON
- aseprite_json
- json_path
- report
You got your AI to draw a nice character spritesheet. Great. Now the game engine has no idea which sprite is neutral and which is happy - it's just pixels in a grid. This node writes the JSON that fixes that: a proper Aseprite-style atlas that maps every frame to a named rectangle your engine or import tool can actually read.
It's one of a handful of nodes in comfyui-game-assets-maker, the pack Victor Quintero (quinteroac) shared on r/comfyui as "GPT Image 2 + ComfyUI for Animations and Sprite generations" - he's upfront that these are playground tools for prototyping sprite pipelines. This one is the least fiddly of the bunch and genuinely useful as-is.
What it does
GameAssets_AsepriteVisualNovelAtlas emits Aseprite's hash-format JSON - a frames object with coordinates plus a meta section whose image points at your spritesheet filename. It doesn't touch pixels at all; it's pure metadata generation. The point is to generate the JSON first, hand it to an image model as part of the prompt so it knows how to lay the sheet out, then keep the same JSON to parse the result.
The frontend swaps the raw JSON field for something nicer: one name input per sprite (sprite_1_name, sprite_2_name…), so you type neutral, happy, sad, angry and those become the frame keys in the atlas.
The inputs that matter
sheet_width/sheet_height- must match the spritesheet you actually generate. The node validates that the sheet divides evenly into uniform frames, so a mismatch is a hard error, not a silent one.spritesheet_type- Half Body, Full Body, or Face Expressions. This mostly affects defaults and labeling, not math.sprite_countandsprite_names- how many frames, and what they're called. Names become things likeneutral.png.layout_direction- Horizontal (one row), Vertical (one column), or Grid. In Grid modecolumnsof 0 auto-balances: 4 sprites → 2×2, 6 → 3×2, 9 → 3×3. Setcolumnsabove 0 to force it.image_filename- the PNG name stamped intometa.image. Your engine will look for this exact filename, so make it match the file you save.frame_duration- per-frame duration in ms (default 100). Irrelevant for static VN sprites, but harmless.
Outputs
aseprite_json (a STRING you can wire into the sibling nodes or dump to a file), json_path (where the node saved the JSON in ComfyUI's output directory, if save_json is on), and report - a text summary of the layout it computed. Wire aseprite_json into Aseprite Atlas Sprite Preview to eyeball each frame, or into Aseprite Apply VLM Correction if a vision model needs to fix the coordinates.
Installing it
Same as any custom node pack - ComfyUI Manager, searching "comfyui-game-assets-maker", or manually:
cd ComfyUI/custom_nodes
git clone https://github.com/quinteroac/ComfyUI-GameAssetsMaker.git
cd ComfyUI-GameAssetsMaker
pip install -r requirements.txt
Then restart ComfyUI. The only dependency is opencv-python - no model downloads, no GPU requirement, no API key. That's refreshingly rare in this ecosystem, which is normally a dependency-horror show.
Where people get burned
The classic mistake is treating the node as a spritesheet generator. It isn't - you still have to generate the image and keep the dimensions in sync. Change the sheet size after the fact and the JSON will happily describe a layout that no longer matches your PNG. Generate the JSON first, use it to drive the image generation, and only then save both.
Inputs (11)
| Name | Type | Default | Description |
|---|---|---|---|
| sheet_width | INT | 20481–65536 | — |
| sheet_height | INT | 20481–65536 | — |
| spritesheet_type | COMBO | Half Body | 3 options: Half Body, Full Body, Face Expressions |
| sprite_count | INT | 41–128 | — |
| layout_direction | COMBO | Horizontal | 3 options: Horizontal, Vertical, Grid |
| columns | INT | 00–128 | — |
| sprite_names | STRING | ["neutral", "happy", "sad", "angry"] | — |
| image_filename | STRING | visual_novel_character.png | — |
| frame_duration | INT | 1001–60000 | — |
| save_json | BOOLEAN | true | — |
| filename_prefix | STRING | vn_character_atlas | — |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| aseprite_json | STRING | — |
| json_path | STRING | — |
| report | STRING | — |