use std::path::PathBuf;
use bevy::{prelude::*, render::camera::Camera};
use bevy_ldtk::*;
fn main() {
App::build()
.add_plugins(DefaultPlugins)
.add_plugin(LdtkPlugin)
.add_startup_system(setup.system())
.add_system(camera_movement.system())
.add_system(spawn_player.system())
.run();
}
fn setup(mut commands: Commands, asset_server: Res<AssetServer>) {
asset_server.watch_for_changes().unwrap();
commands
.spawn()
.insert_bundle(LdtkMapBundle {
map: asset_server.load(PathBuf::from(
&std::env::args().nth(1).unwrap_or("map1.ldtk".into()),
)),
config: LdtkMapConfig {
set_clear_color: true,
scale: 1.0,
level: std::env::args()
.nth(2)
.map(|x| x.parse().unwrap())
.unwrap_or(0),
center_map: false,
},
..Default::default()
});
commands
.spawn()
.insert_bundle(OrthographicCameraBundle::new_2d());
}
const SPEED: f32 = 1.0;
fn camera_movement(
time: Res<Time>,
keyboard_input: Res<Input<KeyCode>>,
mut query: Query<(&Camera, &mut Transform)>,
) {
for (_, mut transform) in query.iter_mut() {
let mut direction = Vec3::ZERO;
let scale = transform.scale.x;
if keyboard_input.pressed(KeyCode::A) {
direction += Vec3::new(-SPEED, 0.0, 0.0);
}
if keyboard_input.pressed(KeyCode::D) {
direction += Vec3::new(SPEED, 0.0, 0.0);
}
if keyboard_input.pressed(KeyCode::W) {
direction += Vec3::new(0.0, SPEED, 0.0);
}
if keyboard_input.pressed(KeyCode::S) {
direction += Vec3::new(0.0, -SPEED, 0.0);
}
if keyboard_input.pressed(KeyCode::Q) {
let scale = scale + 0.005;
transform.scale = Vec3::new(scale, scale, 1.);
}
if keyboard_input.pressed(KeyCode::E) {
let scale = scale - 0.005;
transform.scale = Vec3::new(scale, scale, 1.);
}
transform.translation += time.delta_seconds() * direction * 1000.;
}
}
fn spawn_player(
mut commands: Commands,
printed_maps: Local<Vec<Entity>>,
query: Query<(Entity, &Handle<LdtkMap>)>,
map_assets: Res<Assets<LdtkMap>>,
asset_server: Res<AssetServer>,
mut color_materials: ResMut<Assets<ColorMaterial>>,
) {
for (ent, handle) in query.iter() {
if printed_maps.contains(&ent) {
continue;
}
if let Some(map) = map_assets.get(handle) {
let level_idx = 0;
let level = &map.project.levels[level_idx];
let entities_layer = level
.layer_instances
.as_ref() .unwrap() .iter() .filter(|&x| x.__identifier == "Entities") .next() .unwrap();
let player_start = entities_layer
.entity_instances
.iter() .filter(|x| x.__identifier == "Player_Spawn") .next() .unwrap();
let player_z = level.layer_instances.as_ref().unwrap().len() as f32 + 1.0;
commands.spawn().insert_bundle(SpriteBundle {
transform: Transform::from_xyz(
player_start.px[0] as f32,
player_start.px[1] as f32 * -1.0,
player_z,
),
material: color_materials.add(ColorMaterial {
texture: Some(asset_server.load("character.png")),
..Default::default()
}),
..Default::default()
});
}
}
}