diff --git a/Cargo.lock b/Cargo.lock index 6cb0ade..f1e0a72 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -544,6 +544,17 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "bevy_ecs_tilemap" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3f6d777dfdc74d24d63ecafaf31628377d2f96bbeeb0012040001a9cb8d442" +dependencies = [ + "bevy", + "log", + "regex", +] + [[package]] name = "bevy_egui" version = "0.20.3" @@ -1811,9 +1822,9 @@ dependencies = [ [[package]] name = "gpu-alloc" -version = "0.5.3" +version = "0.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fc59e5f710e310e76e6707f86c561dd646f69a8876da9131703b2f717de818d" +checksum = "22beaafc29b38204457ea030f6fb7a84c9e4dd1b86e311ba0542533453d87f62" dependencies = [ "bitflags", "gpu-alloc-types", @@ -2140,9 +2151,9 @@ dependencies = [ [[package]] name = "libc" -version = "0.2.142" +version = "0.2.143" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a987beff54b60ffa6d51982e1aa1146bc42f19bd26be28b0586f252fccf5317" +checksum = "edc207893e85c5d6be840e969b496b53d94cec8be2d501b214f50daa97fa8024" [[package]] name = "libloading" @@ -2890,18 +2901,18 @@ checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" [[package]] name = "serde" -version = "1.0.160" +version = "1.0.162" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb2f3770c8bce3bcda7e149193a069a0f4365bda1fa5cd88e03bca26afc1216c" +checksum = "71b2f6e1ab5c2b98c05f0f35b236b22e8df7ead6ffbf51d7808da7f8817e7ab6" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.160" +version = "1.0.162" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "291a097c63d8497e00160b166a967a4a79c64f3facdd01cbd7502231688d77df" +checksum = "a2a0814352fd64b58489904a44ea8d90cb1a91dcb6b4f5ebabc32c8318e93cb6" dependencies = [ "proc-macro2", "quote", @@ -3048,6 +3059,7 @@ version = "0.1.0" dependencies = [ "bevy", "bevy-inspector-egui", + "bevy_ecs_tilemap", ] [[package]] @@ -3777,9 +3789,9 @@ checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a" [[package]] name = "winit" -version = "0.28.3" +version = "0.28.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f504e8c117b9015f618774f8d58cd4781f5a479bc41079c064f974cbb253874" +checksum = "94c9651471cd576737671fbf7081edfea43de3e06846dd9bd4e49ea803c9f55f" dependencies = [ "android-activity", "bitflags", @@ -3855,6 +3867,6 @@ checksum = "a67300977d3dc3f8034dae89778f502b6ba20b269527b3223ba59c0cf393bb8a" [[package]] name = "xml-rs" -version = "0.8.5" +version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "374b609fb36c36ce3501094dc0548f7df5d8d102224b65bc59812e4a5425d571" +checksum = "699d0104bcdd7e7af6d093d6c6e2d0c479b8a129ee0d1023b31d2e0c71bfdda2" diff --git a/Cargo.toml b/Cargo.toml index 646ddf6..498d68a 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -8,6 +8,10 @@ edition = "2021" [profile.dev.package."*"] opt-level = 3 +[profile.release] +lto = "thin" + [dependencies] bevy = { version = "0.10.1", features = ["dynamic_linking"] } bevy-inspector-egui = "0.18.3" +bevy_ecs_tilemap = "0.10.0" diff --git a/rust-toolchain.toml b/rust-toolchain.toml index 5d56faf..7c10f12 100644 --- a/rust-toolchain.toml +++ b/rust-toolchain.toml @@ -1,2 +1,3 @@ [toolchain] -channel = "nightly" +# change back to nightly when fix https://github.com/rust-lang/rust/issues/111320 +channel = "nightly-2023-05-06" diff --git a/src/main.rs b/src/main.rs index 36d0c88..589b852 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,4 +1,5 @@ use bevy::prelude::*; +use bevy_ecs_tilemap::prelude::*; use bevy_inspector_egui::quick::WorldInspectorPlugin; use misc::AimTarget; use physics::Velocity; @@ -12,7 +13,14 @@ fn main() { App::new() .register_type::() .register_type::() - .add_plugins(DefaultPlugins) + .add_plugins(DefaultPlugins.set(WindowPlugin { + primary_window: Some(Window { + title: String::from("Tee city"), + ..Default::default() + }), + ..default() + })) + .add_plugin(TilemapPlugin) .add_plugin(WorldInspectorPlugin::new()) .add_startup_system(general_setup) .add_startup_system(player::add_player) @@ -27,4 +35,41 @@ pub struct MainCamera; fn general_setup(mut commands: Commands, server: Res) { commands.spawn((Camera2dBundle::default(), MainCamera)); + + let tilemap_handle: Handle = server.load("generic_clear.png"); + + let map_size = TilemapSize { x: 2, y: 2 }; + + let tilemap_entity = commands.spawn_empty().id(); + let mut tile_storage = TileStorage::empty(map_size); + + for x in 0..map_size.x { + for y in 0..map_size.y { + let tile_pos = TilePos { x, y }; + let tile_entity = commands + .spawn(TileBundle { + position: tile_pos, + tilemap_id: TilemapId(tilemap_entity), + texture_index: TileTextureIndex(1), + ..Default::default() + }) + .id(); + tile_storage.set(&tile_pos, tile_entity); + } + } + + let tile_size = TilemapTileSize { x: 64.0, y: 64.0 }; + let grid_size = tile_size.into(); + let map_type = TilemapType::Square; + + commands.entity(tilemap_entity).insert(TilemapBundle { + grid_size, + map_type, + size: map_size, + storage: tile_storage, + texture: TilemapTexture::Single(tilemap_handle.clone()), + tile_size, + transform: get_tilemap_center_transform(&map_size, &grid_size, &map_type, 0.0), + ..Default::default() + }); } diff --git a/src/misc.rs b/src/misc.rs index daa4632..07bb58f 100644 --- a/src/misc.rs +++ b/src/misc.rs @@ -1,6 +1,7 @@ use bevy::{math::Vec3Swizzles, prelude::*}; #[derive(Debug, Component, Reflect, Default)] +#[reflect(Component)] pub struct AimTarget(pub Option); pub fn aim_target_system(mut query: Query<(&mut Transform, &AimTarget)>) { diff --git a/src/physics.rs b/src/physics.rs index 53750f7..0d5c719 100644 --- a/src/physics.rs +++ b/src/physics.rs @@ -1,6 +1,7 @@ use bevy::prelude::*; #[derive(Debug, Reflect, Component, Default, Clone)] +#[reflect(Component)] pub struct Velocity { pub vel: Vec2, pub speed: f32, diff --git a/src/player.rs b/src/player.rs index bce30f3..bb37dd9 100644 --- a/src/player.rs +++ b/src/player.rs @@ -14,9 +14,9 @@ pub fn add_player(mut commands: Commands, server: Res) { let skin_handle: Handle = server.load("skins/default.png"); let game_handle: Handle = server.load("game.png"); - let tee_bundle = TeeBundle::new("Player", Vec3::new(32.0, 32.0, 0.0)); + let tee_bundle = TeeBundle::new("Player", Vec3::new(32.0, 32.0, 1.0)); - let tee_bundle_children = TeeBundleChildren::new(skin_handle, game_handle); + let tee_bundle_children = TeeBundleChildren::new(skin_handle, game_handle, 1.0); commands .spawn(( diff --git a/src/tee.rs b/src/tee.rs index e940028..42840ba 100644 --- a/src/tee.rs +++ b/src/tee.rs @@ -1,4 +1,4 @@ -use std::{borrow::Cow, default}; +use std::borrow::Cow; use bevy::prelude::*; @@ -59,7 +59,7 @@ impl TeeBundle { } impl TeeBundleChildren { - pub fn new(skin_handle: Handle, game_handle: Handle) -> Self { + pub fn new(skin_handle: Handle, game_handle: Handle, base_z: f32) -> Self { Self { weapon: TeePartBundle { sprite: SpriteBundle { @@ -68,7 +68,7 @@ impl TeeBundleChildren { rect: Some(Weapon::default().get_texture_rect()), ..Default::default() }, - transform: Weapon::default().get_transform(), + transform: Weapon::default().get_transform(base_z), ..default() }, marker: Weapon::default(), @@ -81,7 +81,7 @@ impl TeeBundleChildren { rect: Some(Rect::from_corners(Vec2::ZERO, Vec2::new(96.0, 96.0))), ..Default::default() }, - transform: Transform::from_xyz(0.0, 0.0, 0.5), + transform: Transform::from_xyz(0.0, 0.0, base_z + 0.5), ..default() }, marker: Body, @@ -94,7 +94,7 @@ impl TeeBundleChildren { rect: Some(Rect::new(96.0 * 2.0, 32.0, 96.0 * 2.0 + 64.0, 32.0 + 32.0)), ..Default::default() }, - transform: Transform::from_xyz(-28.0, -5.0, 0.0) + transform: Transform::from_xyz(-28.0, -5.0, base_z + 0.0) .with_rotation(Quat::from_rotation_z(1.7)), ..default() }, @@ -108,7 +108,7 @@ impl TeeBundleChildren { rect: Some(Rect::new(96.0 * 2.0, 32.0, 96.0 * 2.0 + 64.0, 32.0 + 32.0)), ..Default::default() }, - transform: Transform::from_xyz(28.0, -5.0, 0.0) + transform: Transform::from_xyz(28.0, -5.0, base_z + 0.0) .with_scale(Vec3::new(-1.0, 1.0, 1.0)) .with_rotation(Quat::from_rotation_z(-1.7)), ..default() @@ -151,13 +151,13 @@ impl Weapon { } } - pub fn get_transform(&self) -> Transform { + pub fn get_transform(&self, base_z: f32) -> Transform { match self { - Weapon::Katana => Transform::from_xyz(11.5, 50.0, 0.25) + Weapon::Katana => Transform::from_xyz(11.5, 50.0, base_z + 0.25) .with_scale(Vec3::splat(0.5)) .with_rotation(Quat::from_rotation_z(1.8)), - Weapon::Gun => Transform::from_xyz(2.0, 38.0, 0.25), - _ => Transform::from_xyz(2.0, 60.0, 0.25) + Weapon::Gun => Transform::from_xyz(2.0, 38.0, base_z + 0.25), + _ => Transform::from_xyz(2.0, 60.0, base_z + 0.25) .with_scale(Vec3::splat(0.5)) .with_rotation(Quat::from_rotation_z(std::f32::consts::FRAC_PI_2)), }