diff --git a/src/layout/container.rs b/src/layout/container.rs index 91f72b4..68850af 100644 --- a/src/layout/container.rs +++ b/src/layout/container.rs @@ -2,7 +2,9 @@ use bevy::prelude::*; use bevy_rapier2d::prelude::*; use crate::{ - GameState, HALVED_PIXELS_PER_METER, PIXELS_PER_METER, inventory::{ + GameState, + meters, + inventory::{ ActiveInventory, Inventory, item::Item, @@ -45,16 +47,16 @@ pub fn container_bundle( let image = asset_server.load(CRATE_CLOSED_ASSET); ( Container, - Transform::from_xyz(position.x, position.y - HALVED_PIXELS_PER_METER, 0.), + Transform::from_xyz(position.x, position.y - meters(0.5), 0.), Sprite::from_image(image), Inventory::new(inventory_size), Observer::new(on_container_interact), Children::spawn(( SpawnIter(items.into_iter()), Spawn(( - Collider::cuboid(PIXELS_PER_METER, PIXELS_PER_METER), + Collider::cuboid(meters(1.), meters(1.)), Sensor, - Transform::from_xyz(0., HALVED_PIXELS_PER_METER, 0.), + Transform::from_xyz(0., meters(0.5), 0.), )), )), ) diff --git a/src/layout/door.rs b/src/layout/door.rs index 426a1ed..9d46f7b 100644 --- a/src/layout/door.rs +++ b/src/layout/door.rs @@ -1,7 +1,7 @@ use bevy::prelude::*; use bevy_rapier2d::prelude::*; -use crate::{PIXELS_PER_METER, HALVED_PIXELS_PER_METER}; +use crate::meters; use super::*; @@ -43,7 +43,7 @@ fn on_door_interact( for child in children { if let Ok((mut sprite, mut transform)) = sprite_query.get_mut(*child) { let (image, translation) = if was_opened { (DOOR_CLOSED_ASSET, 0.) } - else { (DOOR_OPENED_ASSET, door.0 as f32 * HALVED_PIXELS_PER_METER) }; + else { (DOOR_OPENED_ASSET, door.0 as f32 * meters(0.5)) }; sprite.image = asset_server.load(image); transform.translation.x = translation; break; @@ -58,7 +58,7 @@ fn on_door_interact( } fn door_collider() -> Collider { - Collider::cuboid(PIXELS_PER_METER * 0.06125, PIXELS_PER_METER) + Collider::cuboid(meters(0.06125), meters(1.)) } pub fn door_bundle(asset_server: &Res, position: Vec2, facing_left: bool) -> impl Bundle { @@ -72,7 +72,7 @@ pub fn door_bundle(asset_server: &Res, position: Vec2, facing_left: Observer::new(on_door_interact), children![ ( - Collider::cuboid(HALVED_PIXELS_PER_METER, PIXELS_PER_METER), + Collider::cuboid(meters(0.5), meters(1.)), Sensor, Transform::from_xyz(0., 0., 0.), ), diff --git a/src/layout/systems.rs b/src/layout/systems.rs index a5968e4..3a0859e 100644 --- a/src/layout/systems.rs +++ b/src/layout/systems.rs @@ -5,7 +5,9 @@ use bevy::{ use bevy_rapier2d::prelude::*; use crate::{ - HALVED_PIXELS_PER_METER, PIXELS_PER_METER, inventory::item::Item, player::Player + meters, + inventory::item::Item, + player::Player, }; use super::*; @@ -73,20 +75,27 @@ pub fn setup_world( Item::new_positioned(uvec2(4, 4), uvec2(0, 4)), ]; - // floor + // floor 1F let mut tiles = (0..16).map(|x| { (0, uvec2(x, 1)) }).collect::>(); - // ceiling + // floor/ceil 1-2F tiles.extend((0..16).map(|x| { (0, uvec2(x, 5)) })); + + // ceil 2F + tiles.extend((0..16).map(|x| { + (0, uvec2(x, 9)) + })); // walls tiles.extend([ (0, 4), (0, 3), (0, 2), + (0, 8), (0, 7), (0, 6), (15, 4), (15, 3), (15, 2), + (15, 8), (15, 7), (15, 6), ].iter().map(|(x, y)| { (1, uvec2(*x, *y)) })); @@ -99,15 +108,21 @@ pub fn setup_world( })); let colliders: Vec<(Collider, Vec2)> = vec![ - (Collider::cuboid(HALVED_PIXELS_PER_METER, PIXELS_PER_METER * 1.5), - vec2(HALVED_PIXELS_PER_METER, HALVED_PIXELS_PER_METER)), - (Collider::cuboid(HALVED_PIXELS_PER_METER, PIXELS_PER_METER * 1.5), - vec2(PIXELS_PER_METER * 15.5, HALVED_PIXELS_PER_METER)), + // 1F + (Collider::cuboid(meters(0.5), meters(1.5)), + vec2(meters(0.5), meters(-4.5))), + (Collider::cuboid(meters(0.5), meters(1.5)), + vec2(meters(15.5), meters(-4.5))), + // 2F + (Collider::cuboid(meters(0.5), meters(1.5)), + vec2(meters(0.5), meters(0.5))), + (Collider::cuboid(meters(0.5), meters(1.5)), + vec2(meters(15.5), meters(-0.5))), ]; - commands.spawn(door::door_bundle(&asset_server, vec2(PIXELS_PER_METER * 1.5, 0.), true)); - commands.spawn(door::door_bundle(&asset_server, vec2(PIXELS_PER_METER * 3.5, 0.), false)); - commands.spawn(door::door_bundle(&asset_server, vec2(PIXELS_PER_METER * 5.5, 0.), false)).insert(Locked); - commands.spawn(container::container_bundle(&asset_server, vec2(-32., 0.), uvec2(8, 8), items)); - commands.spawn(tilemap::tilemap_bundle(&asset_server, uvec2(16, 6), tiles, colliders)); + commands.spawn(door::door_bundle(&asset_server, vec2(meters(1.5), 0.), true)); + commands.spawn(door::door_bundle(&asset_server, vec2(meters(3.5), 0.), false)); + commands.spawn(door::door_bundle(&asset_server, vec2(meters(5.5), 0.), false)).insert(Locked); + commands.spawn(container::container_bundle(&asset_server, vec2(meters(-2.), 0.), uvec2(8, 8), items)); + commands.spawn(tilemap::tilemap_bundle(&asset_server, uvec2(16, 16), tiles, colliders)); } diff --git a/src/layout/tilemap.rs b/src/layout/tilemap.rs index b80cde3..1e9e895 100644 --- a/src/layout/tilemap.rs +++ b/src/layout/tilemap.rs @@ -12,10 +12,10 @@ use bevy::{ }; use bevy_rapier2d::prelude::*; -use crate::{HALVED_PIXELS_PER_METER, PIXELS_PER_METER}; +use crate::meters; const TILEMAP_PATH: &'static str = "sprites/level/tilemap.png"; -const TILE_DISPLAY_SIZE: UVec2 = UVec2::splat(PIXELS_PER_METER as u32); +const TILE_DISPLAY_SIZE: UVec2 = UVec2::splat(meters(1.) as u32); #[derive(Component, Debug, PartialEq, Eq, Default, Clone, Copy, Reflect)] #[reflect(Component, Debug, PartialEq, Default, Clone)] @@ -45,12 +45,13 @@ pub fn tilemap_bundle( ), ..default() }, + Transform::from_xyz(0., meters(0.5) * size.y as f32 - meters(3.), 0.), TilemapChunkTileData(tile_data), Children::spawn(SpawnIter(colliders.into_iter() .map(move |(collider, pos)| {( collider.clone(), Transform::from_xyz( - pos.x - HALVED_PIXELS_PER_METER * size.x as f32, + pos.x - meters(0.5) * size.x as f32, pos.y, 0. ), diff --git a/src/lib.rs b/src/lib.rs index 505da91..d8f4dd8 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -16,7 +16,6 @@ mod tests; pub mod ui; pub const PIXELS_PER_METER: f32 = 16.0; -pub const HALVED_PIXELS_PER_METER: f32 = PIXELS_PER_METER * 0.5; pub struct ExpeditionPlugin; @@ -52,6 +51,11 @@ fn insert_entity_name(names: Query<(Entity, &mut Name), Added>) { } } +#[inline(always)] +pub const fn meters(value: f32) -> f32 { + PIXELS_PER_METER * value +} + fn setup_global(mut commands: Commands) { commands.spawn(camera_bundle()); commands.spawn(ui::UiRoot::new()); diff --git a/src/player/mod.rs b/src/player/mod.rs index 9a262ed..c512c55 100644 --- a/src/player/mod.rs +++ b/src/player/mod.rs @@ -2,7 +2,9 @@ use bevy::prelude::*; use bevy_rapier2d::prelude::*; use crate::{ - HALVED_PIXELS_PER_METER, PIXELS_PER_METER, input::InputAction as Action, inventory::Inventory + meters, + input::InputAction as Action, + inventory::Inventory, }; pub mod systems; @@ -16,7 +18,7 @@ pub struct Player { impl Default for Player { fn default() -> Self { - Self { speed: PIXELS_PER_METER * 0.8 } + Self { speed: meters(0.8) } } } @@ -31,7 +33,7 @@ pub fn player_bundle(asset_server: &Res) -> impl Bundle { RigidBody::KinematicPositionBased, KinematicCharacterController::default(), ActiveCollisionTypes::default() | ActiveCollisionTypes::KINEMATIC_STATIC, - Collider::cuboid(HALVED_PIXELS_PER_METER, PIXELS_PER_METER), + Collider::cuboid(meters(0.5), meters(1.)), ActiveEvents::COLLISION_EVENTS, Sleeping::disabled(), children![