agent-sprite-forge-2d-game-assets
Compare original and translation side by side
🇺🇸
Original
English🇨🇳
Translation
ChineseAgent Sprite Forge — 2D Game Asset Generation
Agent Sprite Forge — 2D游戏资源生成
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.
由ara.so提供的技能 — AI Agent技能合集。
Agent Sprite Forge是一款以Codex为核心的2D游戏资源工作流,由Agent制定生成方案,图像生成模块创建原始视觉素材,确定性脚本将这些素材转换为可复用的游戏资源。该技能支持AI Agent生成精灵图、分层地图、透明PNG、动画GIF,以及可直接导入Godot和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
- 精灵图:角色、怪物、道具、攻击特效、法术、投射物、碰撞效果、待机动作、行走动作,以及基于参考图的变体资源
- 分层地图:纯地面基底、带装饰参考图、道具包、透明道具、Y轴排序布局、碰撞层、区域层和预览图
- 引擎导出:Godot场景、可编辑TileMap图层、分离的道具、遭遇战草丛、碰撞体、出口和调试玩家
- 本地处理:绿幕背景移除、帧提取、对齐、透明PNG/GIF导出、道具包切片和QA元数据
Installation
安装步骤
bash
undefinedbash
undefinedClone the repository
Clone the repository
git clone https://github.com/0x0funky/agent-sprite-forge.git
cd agent-sprite-forge
git clone https://github.com/0x0funky/agent-sprite-forge.git
cd agent-sprite-forge
Install dependencies
Install dependencies
pip install -r requirements.txt
pip install -r requirements.txt
Set up environment variables
Set up environment variables
export OPENAI_API_KEY="your-api-key-here"
export OPENAI_API_KEY="your-api-key-here"
or create .env file
or create .env file
echo "OPENAI_API_KEY=your-api-key-here" > .env
undefinedecho "OPENAI_API_KEY=your-api-key-here" > .env
undefinedRequirements
环境要求
- Python 3.8+
- PIL/Pillow for image processing
- OpenAI API access (for image generation)
- Optional: Godot 4.x or Unity for engine exports
- Python 3.8+
- PIL/Pillow(用于图像处理)
- OpenAI API访问权限(用于图像生成)
- 可选:Godot 4.x或Unity(用于引擎导出)
Core Skills
核心功能
1. Generate 2D Sprite Sheets ($generate2dsprite
)
$generate2dsprite1. 生成2D精灵图 ($generate2dsprite
)
$generate2dspriteUse this skill when you need animated units, playable characters, monsters, props, spell bundles, or projectile/impact effects.
Basic sprite generation:
python
from agent_sprite_forge import SpriteGenerator当你需要动画单位、可玩角色、怪物、道具、法术套装或投射物/碰撞效果时,可使用此功能。
基础精灵图生成:
python
from agent_sprite_forge import SpriteGeneratorInitialize generator
Initialize generator
sprite_gen = SpriteGenerator()
sprite_gen = SpriteGenerator()
Generate character sprite sheet
Generate character sprite sheet
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"
)
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"
)
Result includes:
Result includes:
- sprite_sheet.png (full sheet)
- sprite_sheet.png (full sheet)
- frames/ (individual PNG frames)
- frames/ (individual PNG frames)
- animations/ (GIF animations per direction)
- animations/ (GIF animations per direction)
- metadata.json (frame info, dimensions, cleanup settings)
- metadata.json (frame info, dimensions, cleanup settings)
**Attack and spell animations:**
```python
**攻击与法术动画:**
```pythonGenerate spell cast animation
Generate spell cast animation
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"
)
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"
)
Generates:
Generates:
- cast_animation.gif
- cast_animation.gif
- projectile_animation.gif
- projectile_animation.gif
- impact_animation.gif (if include_impact=True)
- impact_animation.gif (if include_impact=True)
- transparent PNG frames for each
- transparent PNG frames for each
**Reference-guided variants:**
```python
**基于参考图的变体生成:**
```pythonGenerate sprite based on reference image
Generate sprite based on reference image
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"
)
undefinedref_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"
)
undefined2. Generate 2D Maps ($generate2dmap
)
$generate2dmap2. 生成2D地图 ($generate2dmap
)
$generate2dmapUse this skill for layered RPG maps with ground, props, collision, and engine-ready exports.
Basic layered map generation:
python
from agent_sprite_forge import MapGenerator
map_gen = MapGenerator()此功能适用于包含地面、道具、碰撞层且可直接导出至引擎的RPG分层地图。
基础分层地图生成:
python
from agent_sprite_forge import MapGenerator
map_gen = MapGenerator()Generate layered map with prop extraction
Generate layered map with prop extraction
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"
)
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"
)
Generates:
Generates:
- ground_base.png (clean ground layer)
- ground_base.png (clean ground layer)
- dressed_reference.png (fully decorated reference)
- dressed_reference.png (fully decorated reference)
- prop_pack_3x3.png (extracted props grid)
- prop_pack_3x3.png (extracted props grid)
- props/ (individual transparent prop PNGs)
- props/ (individual transparent prop PNGs)
- layered_preview.png (flattened preview)
- layered_preview.png (flattened preview)
- metadata.json (layer info, prop positions)
- metadata.json (layer info, prop positions)
**Godot TileMap export:**
```python
**Godot TileMap导出:**
```pythonGenerate Godot-ready map project
Generate Godot-ready map project
godot_map = map_gen.generate_godot_map(
prompt="forest village with paths, houses, trees, pond",
tileset_size=16, # 16x16 tiles
map_size=(40, 30), # tiles
include_collision=True,
include_zones=True, # encounter grass, exits
output_dir="./output/godot_maps/forest_village"
)
godot_map = map_gen.generate_godot_map(
prompt="forest village with paths, houses, trees, pond",
tileset_size=16, # 16x16 tiles
map_size=(40, 30), # tiles
include_collision=True,
include_zones=True, # encounter grass, exits
output_dir="./output/godot_maps/forest_village"
)
Generates:
Generates:
- tileset.png (autotile-ready)
- tileset.png (autotile-ready)
- prop_sheet_3x3.png
- prop_sheet_3x3.png
- scenes/ForestVillage.tscn (editable scene)
- scenes/ForestVillage.tscn (editable scene)
- resources/tileset.tres
- resources/tileset.tres
- resources/prop_atlas.tres
- resources/prop_atlas.tres
- scripts/debug_player.gd
- scripts/debug_player.gd
- collision and area metadata
- collision and area metadata
undefinedundefined3. Post-Processing and Cleanup
3. 后期处理与优化
Chroma-key background removal:
python
from agent_sprite_forge.processors import BackgroundRemover
remover = BackgroundRemover()绿幕背景移除:
python
from agent_sprite_forge.processors import BackgroundRemover
remover = BackgroundRemover()Remove background and export transparent PNG
Remove background and export transparent PNG
clean_sprite = remover.remove_background(
input_path="./raw/sprite_sheet.png",
chroma_color="#00FF00", # green screen
tolerance=30,
output_path="./output/sprite_sheet_clean.png"
)
**Frame extraction and GIF export:**
```python
from agent_sprite_forge.processors import FrameExtractor, GIFExporterclean_sprite = remover.remove_background(
input_path="./raw/sprite_sheet.png",
chroma_color="#00FF00", # green screen
tolerance=30,
output_path="./output/sprite_sheet_clean.png"
)
**帧提取与GIF导出:**
```python
from agent_sprite_forge.processors import FrameExtractor, GIFExporterExtract frames from sprite sheet
Extract frames from sprite sheet
extractor = FrameExtractor()
frames = extractor.extract_frames(
sprite_sheet="./output/sprite_sheet_clean.png",
frame_width=64,
frame_height=64,
output_dir="./output/frames"
)
extractor = FrameExtractor()
frames = extractor.extract_frames(
sprite_sheet="./output/sprite_sheet_clean.png",
frame_width=64,
frame_height=64,
output_dir="./output/frames"
)
Create animated GIF
Create animated GIF
gif_exporter = GIFExporter()
gif_exporter.create_animation(
frames_dir="./output/frames",
output_path="./output/animation.gif",
frame_duration=100, # milliseconds
loop=0 # infinite loop
)
**Prop pack slicing:**
```python
from agent_sprite_forge.processors import PropPackSlicer
slicer = PropPackSlicer()gif_exporter = GIFExporter()
gif_exporter.create_animation(
frames_dir="./output/frames",
output_path="./output/animation.gif",
frame_duration=100, # milliseconds
loop=0 # infinite loop
)
**道具包切片:**
```python
from agent_sprite_forge.processors import PropPackSlicer
slicer = PropPackSlicer()Slice 3x3 prop pack into individual props
Slice 3x3 prop pack into individual props
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"
)
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"
)
Returns list of prop files with bounding box metadata
Returns list of prop files with bounding box metadata
undefinedundefinedConfiguration
配置
Create a file to set defaults:
config.yamlyaml
undefined创建文件设置默认参数:
config.yamlyaml
undefinedImage generation settings
Image generation settings
image_generation:
model: "dall-e-3"
size: "1024x1024"
quality: "hd"
style: "natural" # or "vivid"
image_generation:
model: "dall-e-3"
size: "1024x1024"
quality: "hd"
style: "natural" # or "vivid"
Sprite settings
Sprite settings
sprites:
default_frame_count: 4
default_frame_size: [64, 64]
background_color: "#00FF00" # chroma key
export_formats: ["png", "gif"]
sprites:
default_frame_count: 4
default_frame_size: [64, 64]
background_color: "#00FF00" # chroma key
export_formats: ["png", "gif"]
Map settings
Map settings
maps:
default_tile_size: 16
prop_pack_grid: [3, 3]
layer_order: ["ground", "props", "collision", "zones"]
maps:
default_tile_size: 16
prop_pack_grid: [3, 3]
layer_order: ["ground", "props", "collision", "zones"]
Processing
Processing
processing:
chroma_tolerance: 30
gif_frame_duration: 100
png_compression: 9
processing:
chroma_tolerance: 30
gif_frame_duration: 100
png_compression: 9
Engine exports
Engine exports
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:
```python
from agent_sprite_forge import load_config
config = load_config("config.yaml")
sprite_gen = SpriteGenerator(config=config)godot:
version: "4.5"
tilemap_layer_enabled: true
include_debug_player: true
unity:
version: "2022.3"
sprite_pixels_per_unit: 16
include_prefabs: true
在Python中加载配置:
```python
from agent_sprite_forge import load_config
config = load_config("config.yaml")
sprite_gen = SpriteGenerator(config=config)Common Patterns
常见使用模式
Full Character Asset Pipeline
完整角色资源管线
python
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()
# 1. Generate directional walk animations
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"
)
# 2. Generate attack animation
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"
)
# 3. Generate idle animation
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
}python
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()
# 1. Generate directional walk animations
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"
)
# 2. Generate attack animation
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"
)
# 3. Generate idle animation
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
}Usage
Usage
samurai_assets = create_character_assets(
"samurai_warrior",
"pixel art samurai in blue armor"
)
undefinedsamurai_assets = create_character_assets(
"samurai_warrior",
"pixel art samurai in blue armor"
)
undefinedRPG Map with Godot Export
带Godot导出的RPG地图
python
from agent_sprite_forge import MapGenerator
def create_rpg_zone(zone_name, description):
"""Generate RPG map zone with Godot export"""
map_gen = MapGenerator()
# Generate layered map
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}"
)
# Add custom metadata
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_resultpython
from agent_sprite_forge import MapGenerator
def create_rpg_zone(zone_name, description):
"""Generate RPG map zone with Godot export"""
map_gen = MapGenerator()
# Generate layered map
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}"
)
# Add custom metadata
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_resultUsage
Usage
forest_zone = create_rpg_zone(
"forest_01",
"dense forest with winding path, old shrine, mushroom clusters"
)
undefinedforest_zone = create_rpg_zone(
"forest_01",
"dense forest with winding path, old shrine, mushroom clusters"
)
undefinedSpell Bundle Generation
法术套装生成
python
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 animation
cast = sprite_gen.generate(
prompt=f"mage casting {element} spell, {color_scheme} colors, side view",
frames=6,
output_dir=f"{spell_dir}/cast"
)
# Projectile
projectile = sprite_gen.generate(
prompt=f"{element} projectile, {color_scheme}, spinning animation",
frames=4,
animation_type="projectile",
output_dir=f"{spell_dir}/projectile"
)
# Impact
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
}python
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 animation
cast = sprite_gen.generate(
prompt=f"mage casting {element} spell, {color_scheme} colors, side view",
frames=6,
output_dir=f"{spell_dir}/cast"
)
# Projectile
projectile = sprite_gen.generate(
prompt=f"{element} projectile, {color_scheme}, spinning animation",
frames=4,
animation_type="projectile",
output_dir=f"{spell_dir}/projectile"
)
# Impact
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
}Usage
Usage
fireball = create_spell_bundle("fireball", "fire", "red and orange")
ice_lance = create_spell_bundle("ice_lance", "ice", "blue and white")
undefinedfireball = create_spell_bundle("fireball", "fire", "red and orange")
ice_lance = create_spell_bundle("ice_lance", "ice", "blue and white")
undefinedUnity Survivors-like Setup
类幸存者游戏Unity配置
python
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 sheets (4 directions)
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"
)
# Summon/minion sheets
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)
# Enemy sheets
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)
# Export Unity-ready structure
unity_export.export_project(
assets={
"hero": hero,
"summons": summons,
"enemies": enemies
},
output_dir=base_dir,
include_prefabs=True,
include_animator_controllers=True
)
return base_dirpython
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 sheets (4 directions)
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"
)
# Summon/minion sheets
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)
# Enemy sheets
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)
# Export Unity-ready structure
unity_export.export_project(
assets={
"hero": hero,
"summons": summons,
"enemies": enemies
},
output_dir=base_dir,
include_prefabs=True,
include_animator_controllers=True
)
return base_dirUsage
Usage
game_path = setup_survivors_game("SummonSurvivors")
undefinedgame_path = setup_survivors_game("SummonSurvivors")
undefinedAPI Reference
API参考
SpriteGenerator
SpriteGenerator
python
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"
) -> SpriteResultpython
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"
) -> SpriteResultMapGenerator
MapGenerator
python
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"
) -> GodotMapResultpython
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"
) -> GodotMapResultBackgroundRemover
BackgroundRemover
python
class BackgroundRemover:
def remove_background(
self,
input_path: str,
chroma_color: str = "#00FF00",
tolerance: int = 30,
output_path: str = None
) -> strpython
class BackgroundRemover:
def remove_background(
self,
input_path: str,
chroma_color: str = "#00FF00",
tolerance: int = 30,
output_path: str = None
) -> strGIFExporter
GIFExporter
python
class GIFExporter:
def create_animation(
self,
frames_dir: str,
output_path: str,
frame_duration: int = 100,
loop: int = 0
) -> strpython
class GIFExporter:
def create_animation(
self,
frames_dir: str,
output_path: str,
frame_duration: int = 100,
loop: int = 0
) -> strTroubleshooting
故障排除
Background removal leaves artifacts
背景移除残留痕迹
python
undefinedpython
undefinedIncrease tolerance for better removal
Increase tolerance for better removal
remover.remove_background(
input_path="sprite.png",
chroma_color="#00FF00",
tolerance=50, # Increase from default 30
output_path="sprite_clean.png"
)
remover.remove_background(
input_path="sprite.png",
chroma_color="#00FF00",
tolerance=50, # Increase from default 30
output_path="sprite_clean.png"
)
Or use edge smoothing
Or use edge smoothing
remover.remove_background(
input_path="sprite.png",
chroma_color="#00FF00",
tolerance=30,
smooth_edges=True,
edge_blur=2,
output_path="sprite_clean.png"
)
undefinedremover.remove_background(
input_path="sprite.png",
chroma_color="#00FF00",
tolerance=30,
smooth_edges=True,
edge_blur=2,
output_path="sprite_clean.png"
)
undefinedGenerated sprites don't align properly
生成的精灵图对齐错误
python
undefinedpython
undefinedUse frame alignment processor
Use frame alignment processor
from agent_sprite_forge.processors import FrameAligner
aligner = FrameAligner()
aligned_frames = aligner.align_frames(
frames_dir="./output/frames",
alignment="center", # or "bottom", "top"
reference_point="auto", # detect common ground point
output_dir="./output/frames_aligned"
)
undefinedfrom agent_sprite_forge.processors import FrameAligner
aligner = FrameAligner()
aligned_frames = aligner.align_frames(
frames_dir="./output/frames",
alignment="center", # or "bottom", "top"
reference_point="auto", # detect common ground point
output_dir="./output/frames_aligned"
)
undefinedGodot export scene not loading
Godot导出场景无法加载
python
undefinedpython
undefinedVerify Godot version compatibility
Verify Godot version compatibility
godot_map = map_gen.generate_godot_map(
prompt="village map",
godot_version="4.5", # Explicit version
output_dir="./output/godot_maps/village"
)
godot_map = map_gen.generate_godot_map(
prompt="village map",
godot_version="4.5", # Explicit version
output_dir="./output/godot_maps/village"
)
Check generated scene file
Check generated scene file
import os
assert os.path.exists("./output/godot_maps/village/scenes/Village.tscn")
undefinedimport os
assert os.path.exists("./output/godot_maps/village/scenes/Village.tscn")
undefinedImage generation quality issues
图像生成质量不佳
python
undefinedpython
undefinedUse HD quality and specific style guidance
Use HD quality and specific style guidance
sprite_gen = SpriteGenerator(
image_model="dall-e-3",
quality="hd",
style="vivid" # More saturated colors
)
result = sprite_gen.generate(
prompt="detailed pixel art character, sharp edges, vibrant colors, 64x64 resolution",
frames=4,
output_dir="./output/sprites"
)
undefinedsprite_gen = SpriteGenerator(
image_model="dall-e-3",
quality="hd",
style="vivid" # More saturated colors
)
result = sprite_gen.generate(
prompt="detailed pixel art character, sharp edges, vibrant colors, 64x64 resolution",
frames=4,
output_dir="./output/sprites"
)
undefinedGIF animations too large
GIF动画文件过大
python
undefinedpython
undefinedOptimize GIF export
Optimize GIF export
gif_exporter = GIFExporter()
gif_exporter.create_animation(
frames_dir="./output/frames",
output_path="./output/animation.gif",
frame_duration=100,
loop=0,
optimize=True, # Enable optimization
colors=64, # Reduce color palette (max 256)
dither=False # Disable dithering for smaller size
)
undefinedgif_exporter = GIFExporter()
gif_exporter.create_animation(
frames_dir="./output/frames",
output_path="./output/animation.gif",
frame_duration=100,
loop=0,
optimize=True, # Enable optimization
colors=64, # Reduce color palette (max 256)
dither=False # Disable dithering for smaller size
)
undefinedProp extraction misses objects
道具提取遗漏对象
python
undefinedpython
undefinedAdjust detection sensitivity
Adjust detection sensitivity
slicer = PropPackSlicer()
props = slicer.slice_prop_pack(
prop_pack="./props.png",
grid_size=(3, 3),
output_dir="./output/props",
min_object_size=10, # Smaller minimum
detection_threshold=128, # Adjust alpha threshold
remove_background=True
)
undefinedslicer = PropPackSlicer()
props = slicer.slice_prop_pack(
prop_pack="./props.png",
grid_size=(3, 3),
output_dir="./output/props",
min_object_size=10, # Smaller minimum
detection_threshold=128, # Adjust alpha threshold
remove_background=True
)
undefinedEnvironment Variables
环境变量
bash
undefinedbash
undefinedRequired
Required
export OPENAI_API_KEY="sk-..."
export OPENAI_API_KEY="sk-..."
Optional
Optional
export AGENT_SPRITE_FORGE_OUTPUT_DIR="./my_assets"
export AGENT_SPRITE_FORGE_CACHE_DIR="./.cache"
export AGENT_SPRITE_FORGE_LOG_LEVEL="INFO" # DEBUG, INFO, WARNING, ERROR
export AGENT_SPRITE_FORGE_OUTPUT_DIR="./my_assets"
export AGENT_SPRITE_FORGE_CACHE_DIR="./.cache"
export AGENT_SPRITE_FORGE_LOG_LEVEL="INFO" # DEBUG, INFO, WARNING, ERROR
Godot export
Godot export
export GODOT_EXECUTABLE_PATH="/usr/local/bin/godot"
export GODOT_EXECUTABLE_PATH="/usr/local/bin/godot"
Unity export
Unity export
export UNITY_EXECUTABLE_PATH="/Applications/Unity/Hub/Editor/2022.3.0f1/Unity.app/Contents/MacOS/Unity"
undefinedexport UNITY_EXECUTABLE_PATH="/Applications/Unity/Hub/Editor/2022.3.0f1/Unity.app/Contents/MacOS/Unity"
undefinedCLI Usage
CLI使用
bash
undefinedbash
undefinedGenerate sprite sheet
Generate sprite sheet
python -m agent_sprite_forge sprite
--prompt "knight walking animation"
--frames 4
--directions down,left,right,up
--output ./output/knight
--prompt "knight walking animation"
--frames 4
--directions down,left,right,up
--output ./output/knight
python -m agent_sprite_forge sprite
--prompt "knight walking animation"
--frames 4
--directions down,left,right,up
--output ./output/knight
--prompt "knight walking animation"
--frames 4
--directions down,left,right,up
--output ./output/knight
Generate layered map
Generate layered map
python -m agent_sprite_forge map
--prompt "desert oasis with palm trees"
--include-props
--output ./output/maps/oasis
--prompt "desert oasis with palm trees"
--include-props
--output ./output/maps/oasis
python -m agent_sprite_forge map
--prompt "desert oasis with palm trees"
--include-props
--output ./output/maps/oasis
--prompt "desert oasis with palm trees"
--include-props
--output ./output/maps/oasis
Generate Godot map
Generate Godot map
python -m agent_sprite_forge godot-map
--prompt "cave system with crystals"
--tileset-size 16
--map-size 40,30
--output ./output/godot/cave
--prompt "cave system with crystals"
--tileset-size 16
--map-size 40,30
--output ./output/godot/cave
python -m agent_sprite_forge godot-map
--prompt "cave system with crystals"
--tileset-size 16
--map-size 40,30
--output ./output/godot/cave
--prompt "cave system with crystals"
--tileset-size 16
--map-size 40,30
--output ./output/godot/cave
Remove background
Remove background
python -m agent_sprite_forge remove-bg
--input ./raw/sprite.png
--output ./clean/sprite.png
--chroma "#00FF00"
--tolerance 30
--input ./raw/sprite.png
--output ./clean/sprite.png
--chroma "#00FF00"
--tolerance 30
python -m agent_sprite_forge remove-bg
--input ./raw/sprite.png
--output ./clean/sprite.png
--chroma "#00FF00"
--tolerance 30
--input ./raw/sprite.png
--output ./clean/sprite.png
--chroma "#00FF00"
--tolerance 30
Create GIF
Create GIF
python -m agent_sprite_forge make-gif
--frames ./output/frames
--output ./animation.gif
--duration 100
--loop 0
--frames ./output/frames
--output ./animation.gif
--duration 100
--loop 0
undefinedpython -m agent_sprite_forge make-gif
--frames ./output/frames
--output ./animation.gif
--duration 100
--loop 0
--frames ./output/frames
--output ./animation.gif
--duration 100
--loop 0
undefined