A Bevy plugin for loading and rendering Sprite Fusion maps.
Why ?
Sprite Fusion is a free, web-based tilemap editor with a strong focus on simplicity.
- Layer Support: Each SpriteFusion layer becomes a separate tilemap with proper Z-ordering
- Collisions support: Layers marked as colliders get a
Collidercomponent on their tiles - Custom tiles attributes: Custom attributes from SpriteFusion are preserved and queryable
- Advanced features: Auto tiling, bucket fill, save and load maps, etc.
Quick Start
1. Add the dependency
[dependencies] bevy_spritefusion = "0.1"
2. Export from SpriteFusion
Export your map from Sprite Fusion via the Bevy export button. You'll get:
map.json, The tilemap dataspritesheet.png, The generated tileset
Place both files in your assets/ folder.
3. Load and spawn the map
use bevy::prelude::*; use bevy_spritefusion::prelude::*; fn main() { App::new() .add_plugins(DefaultPlugins.set(ImagePlugin::default_nearest())) .add_plugins(SpriteFusionPlugin) .add_systems(Startup, spawn_map) .run(); } fn spawn_map(mut commands: Commands, asset_server: Res<AssetServer>) { commands.spawn(Camera2d); commands.spawn(SpriteFusionBundle { map: SpriteFusionMapHandle(asset_server.load("map.json")), tileset: SpriteFusionTilesetHandle(asset_server.load("spritesheet.png")), ..default() }); }
Querying tiles
Find tiles with collisions
use bevy::prelude::*; use bevy_spritefusion::prelude::*; fn find_colliders(query: Query<&TilePos, With<Collider>>) { for pos in query.iter() { println!("Collider at ({}, {})", pos.x, pos.y); } }
Query tiles attributes
SpriteFusion allows you to attach custom attributes to tiles. These are preserved as TileAttributes components:
fn find_collectibles(query: Query<(&TilePos, &TileAttributes)>) { for (pos, attrs) in query.iter() { if attrs.get_bool("isCollectible").unwrap_or(false) { let name = attrs.get_str("name").unwrap_or("unknown"); let value = attrs.get_i64("value").unwrap_or(0); println!("{} at ({}, {}) worth {}", name, pos.x, pos.y, value); } } }
Query by layer
fn find_layer(query: Query<(Entity, &SpriteFusionLayerMarker)>) { for (entity, layer) in query.iter() { println!("Layer '{}' (index: {}, collider: {})", layer.name, layer.index, layer.collider); } }
Sprite Fusion JSON Format
The plugin expects the standard SpriteFusion JSON export format:
{
"tileSize": 16,
"mapWidth": 38,
"mapHeight": 14,
"layers": [
{
"name": "Ground",
"collider": true,
"tiles": [
{ "id": "0", "x": 5, "y": 11 },
{ "id": "1", "x": 6, "y": 11, "attributes": { "isSpawn": true } }
]
}
]
}Running the example
git clone https://github.com/Hugo-Dz/bevy_spritefusion.git
cd bevy_spritefusion
cargo run --example basicUse arrow keys to move the camera.