Nodes/comfyui-game-assets-maker/Aseprite Visual Novel Atlas
ComfyUI Node

Aseprite Visual Novel Atlas

Your spritesheet is useless until you have this JSON

By quinteroac·Created 4 months ago·Updated 4 months ago· 21
Aseprite Visual Novel Atlas
    • aseprite_json
    • json_path
    • report
    sheet_width2048
    sheet_height2048
    spritesheet_typeHalf Body
    sprite_count4
    layout_directionHorizontal
    columns0
    sprite_names["neutral", "happy", "sad", "angry"]
    image_filenamevisual_novel_character.png
    frame_duration100
    save_jsontrue
    filename_prefixvn_character_atlas

    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_count and sprite_names - how many frames, and what they're called. Names become things like neutral.png.
    • layout_direction - Horizontal (one row), Vertical (one column), or Grid. In Grid mode columns of 0 auto-balances: 4 sprites → 2×2, 6 → 3×2, 9 → 3×3. Set columns above 0 to force it.
    • image_filename - the PNG name stamped into meta.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.

    CategoryGame Assets/Aseprite

    Inputs (11)

    NameTypeDefaultDescription
    sheet_widthINT20481–65536
    sheet_heightINT20481–65536
    spritesheet_typeCOMBOHalf Body3 options: Half Body, Full Body, Face Expressions
    sprite_countINT41–128
    layout_directionCOMBOHorizontal3 options: Horizontal, Vertical, Grid
    columnsINT00–128
    sprite_namesSTRING["neutral", "happy", "sad", "angry"]
    image_filenameSTRINGvisual_novel_character.png
    frame_durationINT1001–60000
    save_jsonBOOLEANtrue
    filename_prefixSTRINGvn_character_atlas

    Outputs (3)

    NameTypeDescription
    aseprite_jsonSTRING
    json_pathSTRING
    reportSTRING