Loading...
Loading...
Use when making the art for a side-scroller or 2D platformer: side-view pixel-art sprite sheets for a hero and ground enemies (run, walk, idle, attack, hurt cycles, air spin, jump and fall poses) and per-level layers (parallax background and midground, seamless wall texture, platform strip, props). Also use when a magenta key eats part of a sprite, a walk loop will not close, a slash trail keys into a solid block, generated textures do not tile, or poses on one sheet will not split.
npx skill4agent add scenario-labs/skills scenario-side-view-game-kitupload_assetscenarioscenario-sprite-animationscenario-game-assetsscenario-videonpx skills add scenario-labs/skills --skill <name>side_sprites.py--report| Step | How | Keep when |
|---|---|---|
| Models | | You know each schema's field names, enums and caps |
| Reframe and upload | | Headroom for a raised weapon or a somersault |
| Pose sheet | Text to image, chosen still as reference, 4 poses in a row on magenta | Same design and palette as the strips |
| Price and wait | | The user heard the total before spending |
| Strips | | Loop seams (idle aside) under 0.6x baseline; no solid blocks |
| Level layers | Five renders per level, level 1 first | Dark lower middle, empty midground center, props apart |
| Level finish | | Texture tiles, ledge trims flat, prop count matches |
| Deliver | Strips and pose images as lossless WebP plus | One anchor per character; nothing magenta at the edges |
startImageendImagereferenceImagesbackgroundqualitynumOutputscfgScalemodel_schema_getrecommendteam_idproject_idscenariorecommend { "capability": "txt2img", "prompt": "<the user's request>; needs reference image input, transparent output" }model_schema_getmodel_run { "model_id": "<pick>", "dry_run": true, "parameters": { "prompt": "...", "width": 1536, "height": 1024, "quality": "high", "background": "opaque", "numOutputs": 2 } }jobs_waitjob_idasset_displayasset_downloadcurl -Lfox_two_pose.pngpython3 scripts/reframe_stills.py fox_two_pose.png --name fox --out framesframes/fox_rest.pngframes/fox_action.pngupload_asset { "file_name": "fox_rest.png", "content_type": "image/png", "kind": "image", "file_size": <bytes> }upload_asset_complete { "upload_id": "<id>" }recommend { "capability": "img2video", "features": ["endImage"], "prompt": "<the user's request>; square clip, no audio" }model_schema_getrun: { "prompt": "<run sentence> <facing and tail>", "negativePrompt": "<negative>, slowing down, stopping, standing still",
"startImage": "<fox_rest id>", "duration": "3", "aspectRatio": "1:1", "generateAudio": false }
atk1: { "prompt": "<attack: a fast rapier thrust ... returns to the starting ready pose> <facing and tail>", "negativePrompt": "<negative>",
"startImage": "<fox_rest id>", "endImage": "<fox_rest id>", "duration": "3", "aspectRatio": "1:1", "generateAudio": false }dry_run: true"wait": falsejobs_wait { "job_ids": [...] }pending_job_idsjob_idsjob_getasset_downloadformatclips/fox_<cycle>.mp4<cycle>--cyclesrunidleatk1spinhurtffmpeg -i clips/fox_run.mp4 -vf "fps=6,scale=240:-1,tile=6x3" fox_run_sheet.pngasset_displayreferenceImages: ["<chosen still id>"]fox_poses.pngpython3 scripts/side_sprites.py --clips clips --name fox --cycles run:loop:8,idle:loop:8,atk1:attack:7,spin:attack:8,hurt:attack:5 --report
python3 scripts/side_sprites.py --clips clips --name fox --height 56 --palette 28 \
--cycles run:loop:8,idle:loop:8,atk1:attack:7,spin:attack:8,hurt:attack:5 \
--poses fox_poses.png --jump frames/fox_action.png --webp --out sprites--drop atk1=<index>--forcemole_rest.pngcfgScale: 0.7side_sprites.py --clips clips --name mole --height 72 --cycles walk:loop:8,attack:attack:8,hurt:attack:5 --report--range walk=12:48dry_runenv/bg1.pngenv/mid1.pngenv/tex1.pngenv/ledge1.pngenv/props1.pngpython3 scripts/process_env.py --env env --out assets --levels 1--levels 2,2--force<name>_meta.json--drop--posesprocess_env.py--drop--dropmoderation_blockedrecommendendImagescenario-moderation