use bevy::asset::FileAssetIo;
use bevy::prelude::*;
use bevy_tileset::prelude::*;
fn main() {
App::build()
.add_plugins(DefaultPlugins)
.add_plugin(TilesetPlugin::default())
.init_resource::<MyTileset>()
.add_startup_system(load_tileset.system())
.add_system(check_loaded.system())
.add_system(show_tileset.system())
.run();
}
struct MyTileset {
tiles: Option<Vec<TileHandle>>,
raw_tileset: Option<RawTileset>,
is_loaded: bool,
}
impl Default for MyTileset {
fn default() -> Self {
Self {
tiles: None,
is_loaded: false,
raw_tileset: None,
}
}
}
fn load_tileset(mut my_tileset: ResMut<MyTileset>, asset_server: Res<AssetServer>) {
let asset_path = FileAssetIo::get_root_path().join("assets");
let dirt_path = asset_path.join("tiles/dirt.ron");
let glass_path = asset_path.join("tiles/glass.ron");
let dirt_bytes = std::fs::read(dirt_path).unwrap();
let glass_bytes = std::fs::read(glass_path).unwrap();
let dirt_tile = ron::de::from_bytes::<TileDef>(&dirt_bytes).unwrap();
let glass_tile = ron::de::from_bytes::<TileDef>(&glass_bytes).unwrap();
let mut handles = load_tile_handles(vec![dirt_tile, glass_tile], &asset_server);
let grass_handle: Handle<Texture> = asset_server.load("tiles/grass.png");
let grass_tile = TileHandle::new_standard("Dynamic Grass", grass_handle);
handles.push(grass_tile);
my_tileset.tiles = Some(handles);
}
fn check_loaded(
mut my_tileset: ResMut<MyTileset>,
asset_server: Res<AssetServer>,
mut textures: ResMut<Assets<Texture>>,
) {
if my_tileset.is_loaded || my_tileset.tiles.is_none() {
return;
}
let is_loaded = my_tileset
.tiles
.as_ref()
.unwrap()
.iter()
.all(|tile| tile.is_loaded(&asset_server));
if !is_loaded {
return;
}
let mut builder = TilesetBuilder::default();
let tiles = my_tileset.tiles.take();
for (group_id, tile) in tiles.unwrap().into_iter().enumerate() {
builder
.add_tile(tile, group_id as TileGroupId, &textures)
.unwrap();
}
let raw_tileset = builder
.build("My Dynamic Tileset", 123, &mut textures)
.unwrap();
my_tileset.raw_tileset = Some(raw_tileset);
my_tileset.tiles = None;
my_tileset.is_loaded = true;
}
fn show_tileset(
mut commands: Commands,
my_tileset: Res<MyTileset>,
mut materials: ResMut<Assets<ColorMaterial>>,
mut has_ran: Local<bool>,
) {
if my_tileset.raw_tileset.is_none() || *has_ran {
return;
}
let raw_tileset = my_tileset.raw_tileset.as_ref().unwrap();
println!("{:#?}", raw_tileset);
let texture = raw_tileset.texture().clone();
commands.spawn_bundle(OrthographicCameraBundle::new_2d());
commands.spawn_bundle(SpriteBundle {
material: materials.add(texture.into()),
transform: Transform::from_xyz(0.0, 0.0, 0.0),
..Default::default()
});
if let Some((ref tile_index, ..)) = raw_tileset.select_tile("Dynamic Grass") {
match tile_index {
TileIndex::Standard(index) => {
if let Some(handle) = raw_tileset.get_tile_handle(index) {
commands.spawn_bundle(SpriteBundle {
material: materials.add(handle.clone().into()),
transform: Transform::from_xyz(0.0, 48.0, 0.0),
..Default::default()
});
}
}
TileIndex::Animated(start, end, speed) => {
}
}
}
*has_ran = true;
}