bevy_spritefusion

Crates.iobevy_spritefusion
lib.rsbevy_spritefusion
version0.1.0
created_at2025-12-23 16:05:46.390131+00
updated_at2025-12-23 16:05:46.390131+00
descriptionA Bevy plugin for loading Sprite Fusion tilemap exports
homepage
repositoryhttps://github.com/Hugo-Dz/bevy_spritefusion
max_upload_size
id2001829
size571,184
Hugo-Dz (Hugo-Dz)

documentation

README

Sprite Fusion Bevy Plugin

A Bevy plugin for loading and rendering Sprite Fusion maps.

Crate Docs License

Sprite Fusion

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 Collider component 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 data
  • spritesheet.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 basic

Use arrow keys to move the camera.

Commit count: 0

cargo fmt