| name | agent-sprite-forge-2d-game-assets |
| description | Generate 2D sprite sheets, animated GIFs, transparent PNGs, layered maps, and engine-ready prototypes for Godot/Unity using Codex-driven asset pipelines. |
| triggers | ["generate a 2d sprite sheet for my game","create animated character sprites with transparent background","make a layered rpg map with props","generate pixel art assets for godot","create sprite animations and export to gif","build a 2d game asset pipeline","generate tileset and prop pack for unity","create game-ready sprite sheets with cleanup"] |
Agent Sprite Forge — 2D Game Asset Generation
Skill by ara.so — AI Agent Skills collection.
Agent Sprite Forge is a Codex-first 2D game asset workflow where the agent decides the plan, image generation creates the raw visuals, and deterministic scripts turn those visuals into reusable game assets. This skill enables AI agents to generate sprite sheets, layered maps, transparent PNGs, animated GIFs, and engine-ready exports for Godot and Unity.
What It Does
- Sprite Sheets: Characters, monsters, props, attacks, spells, projectiles, impacts, idles, walks, and reference-guided variants
- Layered Maps: Ground-only bases, dressed references, prop packs, transparent props, y-sort placement, collision, zones, and previews
- Engine Handoff: Godot scenes, editable TileMap layers, separated props, encounter grass, collision bodies, exits, and debug players
- Local Cleanup: Chroma-key removal, frame extraction, alignment, transparent PNG/GIF export, prop-pack slicing, and QA metadata
Installation
git clone https://github.com/0x0funky/agent-sprite-forge.git
cd agent-sprite-forge
pip install -r requirements.txt
export OPENAI_API_KEY="your-api-key-here"
echo "OPENAI_API_KEY=your-api-key-here" > .env
Requirements
- Python 3.8+
- PIL/Pillow for image processing
- OpenAI API access (for image generation)
- Optional: Godot 4.x or Unity for engine exports
Core Skills
1. Generate 2D Sprite Sheets ($generate2dsprite)
Use this skill when you need animated units, playable characters, monsters, props, spell bundles, or projectile/impact effects.
Basic sprite generation:
from agent_sprite_forge import SpriteGenerator
sprite_gen = SpriteGenerator()
result = sprite_gen.generate(
prompt="samurai warrior walking animation, 4 directions, pixel art style",
frames=4,
directions=["down", "left", "right", "up"],
output_dir="./output/sprites"
)
Attack and spell animations:
spell_result = sprite_gen.generate(
prompt="fire mage casting fireball spell, side view, 6 frames",
frames=6,
animation_type="cast",
include_projectile=True,
output_dir="./output/spells/fireball"
)
Reference-guided variants:
ref_result = sprite_gen.generate_from_reference(
reference_image="./refs/crocodile.jpg",
prompt="crocodile playing with a stone, 8 frame loop animation",
frames=8,
preserve_style=True,
output_dir="./output/croc_animation"
)
2. Generate 2D Maps ($generate2dmap)
Use this skill for layered RPG maps with ground, props, collision, and engine-ready exports.
Basic layered map generation:
from agent_sprite_forge import MapGenerator
map_gen = MapGenerator()
map_result = map_gen.generate_layered_map(
prompt="cyberpunk canal district, neon signs, bridges, water",
style="hand-painted HD game map",
include_props=True,
output_dir="./output/maps/cyber_canal"
)
Godot TileMap export:
godot_map = map_gen.generate_godot_map(
prompt="forest village with paths, houses, trees, pond",
tileset_size=16,
map_size=(40, 30),
include_collision=True,
include_zones=True,
output_dir="./output/godot_maps/forest_village"
)
3. Post-Processing and Cleanup
Chroma-key background removal:
from agent_sprite_forge.processors import BackgroundRemover
remover = BackgroundRemover()
clean_sprite = remover.remove_background(
input_path="./raw/sprite_sheet.png",
chroma_color="#00FF00",
tolerance=30,
output_path="./output/sprite_sheet_clean.png"
)
Frame extraction and GIF export:
from agent_sprite_forge.processors import FrameExtractor, GIFExporter
extractor = FrameExtractor()
frames = extractor.extract_frames(
sprite_sheet="./output/sprite_sheet_clean.png",
frame_width=64,
frame_height=64,
output_dir="./output/frames"
)
gif_exporter = GIFExporter()
gif_exporter.create_animation(
frames_dir="./output/frames",
output_path="./output/animation.gif",
frame_duration=100,
loop=0
)
Prop pack slicing:
from agent_sprite_forge.processors import PropPackSlicer
slicer = PropPackSlicer()
props = slicer.slice_prop_pack(
prop_pack="./output/maps/cyber_canal/prop_pack_3x3.png",
grid_size=(3, 3),
output_dir="./output/maps/cyber_canal/props",
remove_background=True,
chroma_color="#FFFFFF"
)
Configuration
Create a config.yaml file to set defaults:
image_generation:
model: "dall-e-3"
size: "1024x1024"
quality: "hd"
style: "natural"
sprites:
default_frame_count: 4
default_frame_size: [64, 64]
background_color: "#00FF00"
export_formats: ["png", "gif"]
maps:
default_tile_size: 16
prop_pack_grid: [3, 3]
layer_order: ["ground", "props", "collision", "zones"]
processing:
chroma_tolerance: 30
gif_frame_duration: 100
png_compression: 9
godot:
version: "4.5"
tilemap_layer_enabled: true
include_debug_player: true
unity:
version: "2022.3"
sprite_pixels_per_unit: 16
include_prefabs: true
Load config in Python:
from agent_sprite_forge import load_config
config = load_config("config.yaml")
sprite_gen = SpriteGenerator(config=config)
Common Patterns
Full Character Asset Pipeline
from agent_sprite_forge import SpriteGenerator, BackgroundRemover, FrameExtractor, GIFExporter
def create_character_assets(character_name, prompt_base):
"""Generate complete character asset set"""
sprite_gen = SpriteGenerator()
walk_result = sprite_gen.generate(
prompt=f"{prompt_base}, walking animation, 4 directions",
frames=4,
directions=["down", "left", "right", "up"],
output_dir=f"./output/characters/{character_name}/walk"
)
attack_result = sprite_gen.generate(
prompt=f"{prompt_base}, sword attack, side view",
frames=6,
animation_type="attack",
output_dir=f"./output/characters/{character_name}/attack"
)
idle_result = sprite_gen.generate(
prompt=f"{prompt_base}, idle breathing animation",
frames=2,
animation_type="idle",
output_dir=f"./output/characters/{character_name}/idle"
)
return {
"walk": walk_result,
"attack": attack_result,
"idle": idle_result
}
samurai_assets = create_character_assets(
"samurai_warrior",
"pixel art samurai in blue armor"
)
RPG Map with Godot Export
from agent_sprite_forge import MapGenerator
def create_rpg_zone(zone_name, description):
"""Generate RPG map zone with Godot export"""
map_gen = MapGenerator()
map_result = map_gen.generate_godot_map(
prompt=description,
tileset_size=16,
map_size=(40, 30),
include_collision=True,
include_zones=True,
zone_types=["encounter_grass", "exit", "trigger"],
output_dir=f"./output/maps/{zone_name}"
)
map_result.add_metadata({
"zone_name": zone_name,
"encounters": ["slime", "bat", "wolf"],
"exits": [
{"name": "north_exit", "to": "zone_02"},
{"name": "south_exit", "to": "zone_00"}
]
})
return map_result
forest_zone = create_rpg_zone(
"forest_01",
"dense forest with winding path, old shrine, mushroom clusters"
)
Spell Bundle Generation
def create_spell_bundle(spell_name, element, color_scheme):
"""Generate complete spell asset bundle"""
sprite_gen = SpriteGenerator()
spell_dir = f"./output/spells/{spell_name}"
cast = sprite_gen.generate(
prompt=f"mage casting {element} spell, {color_scheme} colors, side view",
frames=6,
output_dir=f"{spell_dir}/cast"
)
projectile = sprite_gen.generate(
prompt=f"{element} projectile, {color_scheme}, spinning animation",
frames=4,
animation_type="projectile",
output_dir=f"{spell_dir}/projectile"
)
impact = sprite_gen.generate(
prompt=f"{element} explosion impact, {color_scheme}, burst effect",
frames=8,
animation_type="impact",
output_dir=f"{spell_dir}/impact"
)
return {
"cast": cast,
"projectile": projectile,
"impact": impact
}
fireball = create_spell_bundle("fireball", "fire", "red and orange")
ice_lance = create_spell_bundle("ice_lance", "ice", "blue and white")
Unity Survivors-like Setup
from agent_sprite_forge import SpriteGenerator, UnityExporter
def setup_survivors_game(game_name):
"""Generate assets for survivors-like game"""
sprite_gen = SpriteGenerator()
unity_export = UnityExporter()
base_dir = f"./output/unity_projects/{game_name}"
hero = sprite_gen.generate(
prompt="anime hero character, walking animation, 4 directions",
frames=4,
directions=["down", "left", "right", "up"],
output_dir=f"{base_dir}/Assets/Heroes/Hero01"
)
summons = []
for i, summon_type in enumerate(["wolf", "eagle", "bear"]):
summon = sprite_gen.generate(
prompt=f"spirit {summon_type} companion, idle and attack",
frames=6,
output_dir=f"{base_dir}/Assets/Summons/{summon_type}"
)
summons.append(summon)
enemies = []
for enemy_type in ["slime", "skeleton", "demon"]:
enemy = sprite_gen.generate(
prompt=f"{enemy_type} enemy, walk and attack animation",
frames=4,
output_dir=f"{base_dir}/Assets/Enemies/{enemy_type}"
)
enemies.append(enemy)
unity_export.export_project(
assets={
"hero": hero,
"summons": summons,
"enemies": enemies
},
output_dir=base_dir,
include_prefabs=True,
include_animator_controllers=True
)
return base_dir
game_path = setup_survivors_game("SummonSurvivors")
API Reference
SpriteGenerator
class SpriteGenerator:
def generate(
self,
prompt: str,
frames: int = 4,
directions: list = None,
animation_type: str = "walk",
include_projectile: bool = False,
include_impact: bool = False,
output_dir: str = "./output"
) -> SpriteResult
def generate_from_reference(
self,
reference_image: str,
prompt: str,
frames: int,
preserve_style: bool = True,
output_dir: str = "./output"
) -> SpriteResult
MapGenerator
class MapGenerator:
def generate_layered_map(
self,
prompt: str,
style: str = "hand-painted HD game map",
include_props: bool = True,
output_dir: str = "./output"
) -> MapResult
def generate_godot_map(
self,
prompt: str,
tileset_size: int = 16,
map_size: tuple = (40, 30),
include_collision: bool = True,
include_zones: bool = True,
zone_types: list = None,
output_dir: str = "./output"
) -> GodotMapResult
BackgroundRemover
class BackgroundRemover:
def remove_background(
self,
input_path: str,
chroma_color: str = "#00FF00",
tolerance: int = 30,
output_path: str = None
) -> str
GIFExporter
class GIFExporter:
def create_animation(
self,
frames_dir: str,
output_path: str,
frame_duration: int = 100,
loop: int = 0
) -> str
Troubleshooting
Background removal leaves artifacts
remover.remove_background(
input_path="sprite.png",
chroma_color="#00FF00",
tolerance=50,
output_path="sprite_clean.png"
)
remover.remove_background(
input_path="sprite.png",
chroma_color="#00FF00",
tolerance=30,
smooth_edges=True,
edge_blur=2,
output_path="sprite_clean.png"
)
Generated sprites don't align properly
from agent_sprite_forge.processors import FrameAligner
aligner = FrameAligner()
aligned_frames = aligner.align_frames(
frames_dir="./output/frames",
alignment="center",
reference_point="auto",
output_dir="./output/frames_aligned"
)
Godot export scene not loading
godot_map = map_gen.generate_godot_map(
prompt="village map",
godot_version="4.5",
output_dir="./output/godot_maps/village"
)
import os
assert os.path.exists("./output/godot_maps/village/scenes/Village.tscn")
Image generation quality issues
sprite_gen = SpriteGenerator(
image_model="dall-e-3",
quality="hd",
style="vivid"
)
result = sprite_gen.generate(
prompt="detailed pixel art character, sharp edges, vibrant colors, 64x64 resolution",
frames=4,
output_dir="./output/sprites"
)
GIF animations too large
gif_exporter = GIFExporter()
gif_exporter.create_animation(
frames_dir="./output/frames",
output_path="./output/animation.gif",
frame_duration=100,
loop=0,
optimize=True,
colors=64,
dither=False
)
Prop extraction misses objects
slicer = PropPackSlicer()
props = slicer.slice_prop_pack(
prop_pack="./props.png",
grid_size=(3, 3),
output_dir="./output/props",
min_object_size=10,
detection_threshold=128,
remove_background=True
)
Environment Variables
export OPENAI_API_KEY="sk-..."
export AGENT_SPRITE_FORGE_OUTPUT_DIR="./my_assets"
export AGENT_SPRITE_FORGE_CACHE_DIR="./.cache"
export AGENT_SPRITE_FORGE_LOG_LEVEL="INFO"
export GODOT_EXECUTABLE_PATH="/usr/local/bin/godot"
export UNITY_EXECUTABLE_PATH="/Applications/Unity/Hub/Editor/2022.3.0f1/Unity.app/Contents/MacOS/Unity"
CLI Usage
python -m agent_sprite_forge sprite \
--prompt "knight walking animation" \
--frames 4 \
--directions down,left,right,up \
--output ./output/knight
python -m agent_sprite_forge map \
--prompt "desert oasis with palm trees" \
--include-props \
--output ./output/maps/oasis
python -m agent_sprite_forge godot-map \
--prompt "cave system with crystals" \
--tileset-size 16 \
--map-size 40,30 \
--output ./output/godot/cave
python -m agent_sprite_forge remove-bg \
--input ./raw/sprite.png \
--output ./clean/sprite.png \
--chroma "#00FF00" \
--tolerance 30
python -m agent_sprite_forge make-gif \
--frames ./output/frames \
--output ./animation.gif \
--duration 100 \
--loop 0