use bevy::prelude::*;
use bevy_tiled_loader::types::*;
use bevy_tiled_loader::relations::*;
use tiled_parse::types::*;
pub fn main() {
App::new()
.add_plugins((
DefaultPlugins.set(ImagePlugin::default_nearest()),
bevy_tiled_loader::plugin::TiledScenePlugin::default(),
avian2d::PhysicsPlugins::default(),
avian2d::prelude::PhysicsDebugPlugin::default(),
))
.insert_gizmo_config(
avian2d::prelude::PhysicsGizmos {
aabb_color: None,
collider_color: Some(Color::WHITE),
..Default::default()
},
GizmoConfig::default(),
)
.add_systems(Startup, setup)
.add_systems(Update, properties_to_components)
.run();
}
pub fn setup(mut commands: Commands, asset_server: Res<AssetServer>) {
commands.spawn(
TiledMapScene(asset_server.load("sample-map.tmx")),
);
commands.spawn((
Camera2d::default(),
Transform::from_xyz(175., -100., 0.).with_scale(0.3 * Vec3::ONE)
));
}
fn properties_to_components(
mut commands: Commands,
tiled_map_assets: Res<Assets<TiledMapAsset>>,
query_scenes: Query<(Entity, &TiledMapScene), Added<SceneRoot>>,
children: Query<&Children>,
query_tiled_id: Query<&TiledId>,
) {
query_scenes.iter().for_each(|(entity, TiledMapScene(tiled_map_handle))| {
let Some(tma) = tiled_map_assets.get(tiled_map_handle) else {return};
children
.iter_descendants(entity)
.filter_map(|child_e| query_tiled_id.get(child_e).ok().map(|tile_id| (child_e, tile_id)))
.for_each(|(child_e, tile_id)| {
let mut entity_commands = commands.entity(child_e);
match tile_id {
TiledId::Object(o_id) => {
let object = tma.map.get_scene_object(*o_id).unwrap();
object.properties.iter().chain(
try_match::match_ok!(object.otype, ObjectType::Tile(t_guid))
.and_then(|t_guid| tma.map.get_tile_properties(t_guid))
.iter()
.flat_map(|hm| hm.iter()),
)
}
.for_each(|(k, v)| match k.as_str() {
"coin" => {
entity_commands.insert((
Name::new("GameCoin")
));
},
"door" => println!("The door"),
"is_locked" => println!("The door is locked"),
_ => println!("Un-implemented object property : {}", k),
}),
TiledId::Layer(_) => (), TiledId::Tile(_) => (), }
})
})
}