bevy_ecs_ldtk
An ECS-friendly LDtk plugin for bevy. Uses bevy_ecs_tilemap as a base.
cargo run --example platformer --release
Features
- Support for all layer types
- Support for loading external levels
- Hot reloading (requires double-saving for external levels)
- Solutions for easily loading/unloading levels, changing levels, loading level neighbors...
- Low-boilerplate solutions for spawning bundles for LDtk Entities and IntGrid tiles using derive macros (other options available)
serde
types for LDtk based off LDtk's QuickType loader, but with several QoL improvements- Support for Wasm (and tile spacing) through "atlas" feature
Getting Started
The goal of this plugin is to make it as easy as possible to use LDtk with bevy for common use cases, while providing solutions to handle more difficult cases. You only need a few things to get started:
- Add the
LdtkPlugin
to theApp
- Insert the
LevelSelection
resource into theApp
to pick your level - Spawn an
LdtkWorldBundle
- Optionally, use
#[derive(LdtkEntity)]
and#[derive(LdtkIntCell)]
on bundles and register them to theApp
to automatically spawn those bundles on Entity and IntGrid layers.
use bevy::prelude::*;
use bevy_ecs_ldtk::prelude::*;
fn main() {
App::new()
.add_plugins(DefaultPlugins)
.add_plugin(LdtkPlugin)
.add_startup_system(setup)
.insert_resource(LevelSelection::Index(0))
.register_ldtk_entity::<MyBundle>("MyEntityIdentifier")
.run();
}
fn setup(mut commands: Commands, asset_server: Res<AssetServer>) {
commands.spawn(Camera2dBundle::default());
commands.spawn(LdtkWorldBundle {
ldtk_handle: asset_server.load("my_project.ldtk"),
..Default::default()
});
}
#[derive(Bundle, LdtkEntity)]
pub struct MyBundle {
a: ComponentA,
b: ComponentB,
#[sprite_sheet_bundle]
#[bundle]
sprite_bundle: SpriteSheetBundle,
}
There are other attributes available to #[derive(LdtkEntity)]
and #[derive(LdtkIntCell)]
, see the documentation for more details.
By default, LDtk Entities and IntGrid tiles get spawned with EntityInstance
and IntGridCell
components respectfully.
So, you can flesh out these entities in a system that queries for
Added<EntityInstance>
or Added<IntGridCell>
if you need more access to the
world, or if you just don't want to use the LdtkEntity
and LdtkIntCell
traits.
To load a new level, you can just update the LevelSelection
resource.
Be sure to check out the LdtkSettings
resource and the LevelSet
component
for additional level-loading options.
Compatibility
bevy | bevy_ecs_tilemap | LDtk | bevy_ecs_ldtk |
---|---|---|---|
0.10 | 0.10 | 1.3.3 | main |
0.10 | 0.10 | 1.1 | 0.7 |
0.10 | 0.10 | 1.1 | 0.6 |
0.9 | 0.9 | 1.1 | 0.5 |
0.8 | 0.7 | 1.1 | 0.4 |
0.7 | 0.6 | 1.1 | 0.3 |
0.6 | 0.5 | 0.9 | 0.2 |
0.6 | 0.5 | 0.9 | 0.1 |
Asset Credits
- SunnyLand, a texture pack by Ansimuz, licensed under CC0 1.0
- PIXEL FANTASY RPG ICONS, an icon pack by Caz, licensed under CC BY 4.0
- Nuclear Blaze, a tileset by Deepnight, licensed under CC BY-SA 4.0. Tileset was exported from aseprite to png, but no other modifications were made.