generated from 2ndbeam/bevy-template
feat!: "Syntax sugar" for pixels per meter measure
- Added meters function for better readability - Adjusted tilemap_bundle transform - Added 2nd floor in setup_world system BREAKING CHANGE: Removed HALVED_PIXELS_PER_METER const
This commit is contained in:
parent
b59cec172d
commit
0c0dcec4b8
6 changed files with 51 additions and 27 deletions
|
|
@ -2,7 +2,9 @@ use bevy::prelude::*;
|
||||||
use bevy_rapier2d::prelude::*;
|
use bevy_rapier2d::prelude::*;
|
||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
GameState, HALVED_PIXELS_PER_METER, PIXELS_PER_METER, inventory::{
|
GameState,
|
||||||
|
meters,
|
||||||
|
inventory::{
|
||||||
ActiveInventory,
|
ActiveInventory,
|
||||||
Inventory,
|
Inventory,
|
||||||
item::Item,
|
item::Item,
|
||||||
|
|
@ -45,16 +47,16 @@ pub fn container_bundle(
|
||||||
let image = asset_server.load(CRATE_CLOSED_ASSET);
|
let image = asset_server.load(CRATE_CLOSED_ASSET);
|
||||||
(
|
(
|
||||||
Container,
|
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),
|
Sprite::from_image(image),
|
||||||
Inventory::new(inventory_size),
|
Inventory::new(inventory_size),
|
||||||
Observer::new(on_container_interact),
|
Observer::new(on_container_interact),
|
||||||
Children::spawn((
|
Children::spawn((
|
||||||
SpawnIter(items.into_iter()),
|
SpawnIter(items.into_iter()),
|
||||||
Spawn((
|
Spawn((
|
||||||
Collider::cuboid(PIXELS_PER_METER, PIXELS_PER_METER),
|
Collider::cuboid(meters(1.), meters(1.)),
|
||||||
Sensor,
|
Sensor,
|
||||||
Transform::from_xyz(0., HALVED_PIXELS_PER_METER, 0.),
|
Transform::from_xyz(0., meters(0.5), 0.),
|
||||||
)),
|
)),
|
||||||
)),
|
)),
|
||||||
)
|
)
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
use bevy::prelude::*;
|
use bevy::prelude::*;
|
||||||
use bevy_rapier2d::prelude::*;
|
use bevy_rapier2d::prelude::*;
|
||||||
|
|
||||||
use crate::{PIXELS_PER_METER, HALVED_PIXELS_PER_METER};
|
use crate::meters;
|
||||||
|
|
||||||
use super::*;
|
use super::*;
|
||||||
|
|
||||||
|
|
@ -43,7 +43,7 @@ fn on_door_interact(
|
||||||
for child in children {
|
for child in children {
|
||||||
if let Ok((mut sprite, mut transform)) = sprite_query.get_mut(*child) {
|
if let Ok((mut sprite, mut transform)) = sprite_query.get_mut(*child) {
|
||||||
let (image, translation) = if was_opened { (DOOR_CLOSED_ASSET, 0.) }
|
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);
|
sprite.image = asset_server.load(image);
|
||||||
transform.translation.x = translation;
|
transform.translation.x = translation;
|
||||||
break;
|
break;
|
||||||
|
|
@ -58,7 +58,7 @@ fn on_door_interact(
|
||||||
}
|
}
|
||||||
|
|
||||||
fn door_collider() -> Collider {
|
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<AssetServer>, position: Vec2, facing_left: bool) -> impl Bundle {
|
pub fn door_bundle(asset_server: &Res<AssetServer>, position: Vec2, facing_left: bool) -> impl Bundle {
|
||||||
|
|
@ -72,7 +72,7 @@ pub fn door_bundle(asset_server: &Res<AssetServer>, position: Vec2, facing_left:
|
||||||
Observer::new(on_door_interact),
|
Observer::new(on_door_interact),
|
||||||
children![
|
children![
|
||||||
(
|
(
|
||||||
Collider::cuboid(HALVED_PIXELS_PER_METER, PIXELS_PER_METER),
|
Collider::cuboid(meters(0.5), meters(1.)),
|
||||||
Sensor,
|
Sensor,
|
||||||
Transform::from_xyz(0., 0., 0.),
|
Transform::from_xyz(0., 0., 0.),
|
||||||
),
|
),
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,9 @@ use bevy::{
|
||||||
use bevy_rapier2d::prelude::*;
|
use bevy_rapier2d::prelude::*;
|
||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
HALVED_PIXELS_PER_METER, PIXELS_PER_METER, inventory::item::Item, player::Player
|
meters,
|
||||||
|
inventory::item::Item,
|
||||||
|
player::Player,
|
||||||
};
|
};
|
||||||
|
|
||||||
use super::*;
|
use super::*;
|
||||||
|
|
@ -73,20 +75,27 @@ pub fn setup_world(
|
||||||
Item::new_positioned(uvec2(4, 4), uvec2(0, 4)),
|
Item::new_positioned(uvec2(4, 4), uvec2(0, 4)),
|
||||||
];
|
];
|
||||||
|
|
||||||
// floor
|
// floor 1F
|
||||||
let mut tiles = (0..16).map(|x| {
|
let mut tiles = (0..16).map(|x| {
|
||||||
(0, uvec2(x, 1))
|
(0, uvec2(x, 1))
|
||||||
}).collect::<Vec<(u16, UVec2)>>();
|
}).collect::<Vec<(u16, UVec2)>>();
|
||||||
|
|
||||||
// ceiling
|
// floor/ceil 1-2F
|
||||||
tiles.extend((0..16).map(|x| {
|
tiles.extend((0..16).map(|x| {
|
||||||
(0, uvec2(x, 5))
|
(0, uvec2(x, 5))
|
||||||
}));
|
}));
|
||||||
|
|
||||||
|
// ceil 2F
|
||||||
|
tiles.extend((0..16).map(|x| {
|
||||||
|
(0, uvec2(x, 9))
|
||||||
|
}));
|
||||||
|
|
||||||
// walls
|
// walls
|
||||||
tiles.extend([
|
tiles.extend([
|
||||||
(0, 4), (0, 3), (0, 2),
|
(0, 4), (0, 3), (0, 2),
|
||||||
|
(0, 8), (0, 7), (0, 6),
|
||||||
(15, 4), (15, 3), (15, 2),
|
(15, 4), (15, 3), (15, 2),
|
||||||
|
(15, 8), (15, 7), (15, 6),
|
||||||
].iter().map(|(x, y)| {
|
].iter().map(|(x, y)| {
|
||||||
(1, uvec2(*x, *y))
|
(1, uvec2(*x, *y))
|
||||||
}));
|
}));
|
||||||
|
|
@ -99,15 +108,21 @@ pub fn setup_world(
|
||||||
}));
|
}));
|
||||||
|
|
||||||
let colliders: Vec<(Collider, Vec2)> = vec![
|
let colliders: Vec<(Collider, Vec2)> = vec![
|
||||||
(Collider::cuboid(HALVED_PIXELS_PER_METER, PIXELS_PER_METER * 1.5),
|
// 1F
|
||||||
vec2(HALVED_PIXELS_PER_METER, HALVED_PIXELS_PER_METER)),
|
(Collider::cuboid(meters(0.5), meters(1.5)),
|
||||||
(Collider::cuboid(HALVED_PIXELS_PER_METER, PIXELS_PER_METER * 1.5),
|
vec2(meters(0.5), meters(-4.5))),
|
||||||
vec2(PIXELS_PER_METER * 15.5, HALVED_PIXELS_PER_METER)),
|
(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(meters(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(meters(3.5), 0.), false));
|
||||||
commands.spawn(door::door_bundle(&asset_server, vec2(PIXELS_PER_METER * 5.5, 0.), false)).insert(Locked);
|
commands.spawn(door::door_bundle(&asset_server, vec2(meters(5.5), 0.), false)).insert(Locked);
|
||||||
commands.spawn(container::container_bundle(&asset_server, vec2(-32., 0.), uvec2(8, 8), items));
|
commands.spawn(container::container_bundle(&asset_server, vec2(meters(-2.), 0.), uvec2(8, 8), items));
|
||||||
commands.spawn(tilemap::tilemap_bundle(&asset_server, uvec2(16, 6), tiles, colliders));
|
commands.spawn(tilemap::tilemap_bundle(&asset_server, uvec2(16, 16), tiles, colliders));
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -12,10 +12,10 @@ use bevy::{
|
||||||
};
|
};
|
||||||
use bevy_rapier2d::prelude::*;
|
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 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)]
|
#[derive(Component, Debug, PartialEq, Eq, Default, Clone, Copy, Reflect)]
|
||||||
#[reflect(Component, Debug, PartialEq, Default, Clone)]
|
#[reflect(Component, Debug, PartialEq, Default, Clone)]
|
||||||
|
|
@ -45,12 +45,13 @@ pub fn tilemap_bundle(
|
||||||
),
|
),
|
||||||
..default()
|
..default()
|
||||||
},
|
},
|
||||||
|
Transform::from_xyz(0., meters(0.5) * size.y as f32 - meters(3.), 0.),
|
||||||
TilemapChunkTileData(tile_data),
|
TilemapChunkTileData(tile_data),
|
||||||
Children::spawn(SpawnIter(colliders.into_iter()
|
Children::spawn(SpawnIter(colliders.into_iter()
|
||||||
.map(move |(collider, pos)| {(
|
.map(move |(collider, pos)| {(
|
||||||
collider.clone(),
|
collider.clone(),
|
||||||
Transform::from_xyz(
|
Transform::from_xyz(
|
||||||
pos.x - HALVED_PIXELS_PER_METER * size.x as f32,
|
pos.x - meters(0.5) * size.x as f32,
|
||||||
pos.y,
|
pos.y,
|
||||||
0.
|
0.
|
||||||
),
|
),
|
||||||
|
|
|
||||||
|
|
@ -16,7 +16,6 @@ mod tests;
|
||||||
pub mod ui;
|
pub mod ui;
|
||||||
|
|
||||||
pub const PIXELS_PER_METER: f32 = 16.0;
|
pub const PIXELS_PER_METER: f32 = 16.0;
|
||||||
pub const HALVED_PIXELS_PER_METER: f32 = PIXELS_PER_METER * 0.5;
|
|
||||||
|
|
||||||
pub struct ExpeditionPlugin;
|
pub struct ExpeditionPlugin;
|
||||||
|
|
||||||
|
|
@ -52,6 +51,11 @@ fn insert_entity_name(names: Query<(Entity, &mut Name), Added<Name>>) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[inline(always)]
|
||||||
|
pub const fn meters(value: f32) -> f32 {
|
||||||
|
PIXELS_PER_METER * value
|
||||||
|
}
|
||||||
|
|
||||||
fn setup_global(mut commands: Commands) {
|
fn setup_global(mut commands: Commands) {
|
||||||
commands.spawn(camera_bundle());
|
commands.spawn(camera_bundle());
|
||||||
commands.spawn(ui::UiRoot::new());
|
commands.spawn(ui::UiRoot::new());
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,9 @@ use bevy::prelude::*;
|
||||||
use bevy_rapier2d::prelude::*;
|
use bevy_rapier2d::prelude::*;
|
||||||
|
|
||||||
use crate::{
|
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;
|
pub mod systems;
|
||||||
|
|
@ -16,7 +18,7 @@ pub struct Player {
|
||||||
|
|
||||||
impl Default for Player {
|
impl Default for Player {
|
||||||
fn default() -> Self {
|
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<AssetServer>) -> impl Bundle {
|
||||||
RigidBody::KinematicPositionBased,
|
RigidBody::KinematicPositionBased,
|
||||||
KinematicCharacterController::default(),
|
KinematicCharacterController::default(),
|
||||||
ActiveCollisionTypes::default() | ActiveCollisionTypes::KINEMATIC_STATIC,
|
ActiveCollisionTypes::default() | ActiveCollisionTypes::KINEMATIC_STATIC,
|
||||||
Collider::cuboid(HALVED_PIXELS_PER_METER, PIXELS_PER_METER),
|
Collider::cuboid(meters(0.5), meters(1.)),
|
||||||
ActiveEvents::COLLISION_EVENTS,
|
ActiveEvents::COLLISION_EVENTS,
|
||||||
Sleeping::disabled(),
|
Sleeping::disabled(),
|
||||||
children![
|
children![
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue