generated from 2ndbeam/bevy-template
Compare commits
2 commits
0c0dcec4b8
...
5157450ced
| Author | SHA1 | Date | |
|---|---|---|---|
| 5157450ced | |||
| 764e196d39 |
8 changed files with 129 additions and 11 deletions
|
|
@ -32,7 +32,6 @@ impl Inventory {
|
|||
|
||||
for entity in contained_items {
|
||||
let Ok(item) = item_query.get(*entity) else {
|
||||
warn!("Could not query inventory child ({entity}), probably not item?");
|
||||
continue;
|
||||
};
|
||||
|
||||
|
|
@ -51,7 +50,6 @@ impl Inventory {
|
|||
queried_position: UVec2,
|
||||
) -> bool {
|
||||
let Ok(item::Item {size, ..}) = item_query.get(queried_item) else {
|
||||
error!("Could not query inventory child ({queried_item}), probably not item?");
|
||||
return false;
|
||||
};
|
||||
let children = contained_items.iter()
|
||||
|
|
|
|||
|
|
@ -20,7 +20,7 @@ const CRATE_CLOSED_ASSET: &'static str = "sprites/interactive/crate_closed.png";
|
|||
#[require(Sprite, InteractiveObject, Inventory)]
|
||||
pub struct Container;
|
||||
|
||||
fn on_container_interact(
|
||||
pub fn on_container_interact(
|
||||
event: On<InteractionEvent>,
|
||||
mut commands: Commands,
|
||||
locked_query: Query<(), With<Locked>>,
|
||||
|
|
@ -42,7 +42,7 @@ pub fn container_bundle(
|
|||
asset_server: &Res<AssetServer>,
|
||||
position: Vec2,
|
||||
inventory_size: UVec2,
|
||||
items: Vec<Item>
|
||||
items: Vec<Item>,
|
||||
) -> impl Bundle {
|
||||
let image = asset_server.load(CRATE_CLOSED_ASSET);
|
||||
(
|
||||
|
|
@ -50,7 +50,6 @@ pub fn container_bundle(
|
|||
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((
|
||||
|
|
@ -59,5 +58,6 @@ pub fn container_bundle(
|
|||
Transform::from_xyz(0., meters(0.5), 0.),
|
||||
)),
|
||||
)),
|
||||
Name::new(format!("Container {}x{}", inventory_size.x, inventory_size.y)),
|
||||
)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -19,7 +19,7 @@ impl Default for Door {
|
|||
}
|
||||
}
|
||||
|
||||
fn on_door_interact(
|
||||
pub fn on_door_interact(
|
||||
event: On<InteractionEvent>,
|
||||
mut commands: Commands,
|
||||
locked_query: Query<(), With<Locked>>,
|
||||
|
|
@ -69,7 +69,6 @@ pub fn door_bundle(asset_server: &Res<AssetServer>, position: Vec2, facing_left:
|
|||
Transform::from_xyz(position.x, position.y, 0.),
|
||||
Name::new(format!("Door ({}, {})", position.x, position.y)),
|
||||
door_collider(),
|
||||
Observer::new(on_door_interact),
|
||||
children![
|
||||
(
|
||||
Collider::cuboid(meters(0.5), meters(1.)),
|
||||
|
|
|
|||
|
|
@ -2,6 +2,7 @@ use bevy::prelude::*;
|
|||
|
||||
pub mod container;
|
||||
pub mod door;
|
||||
pub mod stairs;
|
||||
pub mod systems;
|
||||
pub mod tilemap;
|
||||
|
||||
|
|
|
|||
98
src/layout/stairs.rs
Normal file
98
src/layout/stairs.rs
Normal file
|
|
@ -0,0 +1,98 @@
|
|||
use bevy::{ecs::relationship::RelatedSpawner, prelude::*};
|
||||
use bevy_rapier2d::prelude::*;
|
||||
|
||||
use crate::{meters, player::Player};
|
||||
|
||||
use super::*;
|
||||
|
||||
#[derive(Component, Debug, PartialEq, Eq, Default, Clone, Copy, Reflect)]
|
||||
#[reflect(Component, Debug, PartialEq, Default, Clone)]
|
||||
#[require(InteractiveObject, Collider, Sensor)]
|
||||
pub enum StairCollider {
|
||||
#[default]
|
||||
Up,
|
||||
Down,
|
||||
}
|
||||
|
||||
#[derive(Component, Clone, Copy, Default, Reflect, Debug, PartialEq)]
|
||||
#[reflect(Component, Clone, Default, Debug, PartialEq)]
|
||||
#[require(Transform)]
|
||||
pub struct Stairs {
|
||||
pub up: Option<Vec2>,
|
||||
pub down: Option<Vec2>,
|
||||
}
|
||||
|
||||
pub fn on_stairs_interact(
|
||||
event: On<InteractionEvent>,
|
||||
collider_query: Query<(&ChildOf, &StairCollider)>,
|
||||
stairs_query: Query<&Stairs>,
|
||||
mut player_query: Query<&mut Transform, With<Player>>,
|
||||
) {
|
||||
let Ok((parent, collider_type)) = collider_query.get(event.entity) else {
|
||||
return;
|
||||
};
|
||||
let Ok(stairs) = stairs_query.get(parent.0) else {
|
||||
error!("StairCollider does not have Stairs parent");
|
||||
return;
|
||||
};
|
||||
let Ok(mut player_transform) = player_query.single_mut() else {
|
||||
error!("Player is not single");
|
||||
return;
|
||||
};
|
||||
|
||||
let offset = match collider_type {
|
||||
StairCollider::Up => {
|
||||
let Some(offset) = stairs.up else {
|
||||
error!("StairCollider::Up triggered but Stairs.up is None");
|
||||
return;
|
||||
};
|
||||
offset
|
||||
},
|
||||
StairCollider::Down => {
|
||||
let Some(offset) = stairs.down else {
|
||||
error!("StairCollider::Down triggered but Stairs.down is None");
|
||||
return;
|
||||
};
|
||||
offset
|
||||
},
|
||||
};
|
||||
|
||||
player_transform.translation.x += offset.x;
|
||||
player_transform.translation.y += offset.y;
|
||||
}
|
||||
|
||||
pub fn stairs_bundle(
|
||||
_asset_server: &Res<AssetServer>,
|
||||
position: Vec2,
|
||||
up_position: Option<Vec2>,
|
||||
down_position: Option<Vec2>,
|
||||
) -> impl Bundle {
|
||||
let (has_up, has_down) = (up_position.is_some(), down_position.is_some());
|
||||
(
|
||||
Stairs {
|
||||
up: up_position,
|
||||
down: down_position,
|
||||
},
|
||||
Transform::from_xyz(position.x, position.y, -1.),
|
||||
Children::spawn(
|
||||
SpawnWith(move |parent: &mut RelatedSpawner<ChildOf>| {
|
||||
if has_up {
|
||||
parent.spawn((
|
||||
StairCollider::Up,
|
||||
Collider::cuboid(meters(1.), meters(1.)),
|
||||
Transform::from_xyz(meters(-1.), 0., 0.),
|
||||
));
|
||||
}
|
||||
|
||||
if has_down {
|
||||
parent.spawn((
|
||||
StairCollider::Down,
|
||||
Collider::cuboid(meters(1.), meters(1.)),
|
||||
Transform::from_xyz(meters(1.), 0., 0.),
|
||||
));
|
||||
}
|
||||
})
|
||||
),
|
||||
Name::new(format!("Stairs ({},{})", position.x, position.y))
|
||||
)
|
||||
}
|
||||
|
|
@ -115,7 +115,7 @@ pub fn setup_world(
|
|||
vec2(meters(15.5), meters(-4.5))),
|
||||
// 2F
|
||||
(Collider::cuboid(meters(0.5), meters(1.5)),
|
||||
vec2(meters(0.5), meters(0.5))),
|
||||
vec2(meters(0.5), meters(-0.5))),
|
||||
(Collider::cuboid(meters(0.5), meters(1.5)),
|
||||
vec2(meters(15.5), meters(-0.5))),
|
||||
];
|
||||
|
|
@ -123,6 +123,25 @@ pub fn setup_world(
|
|||
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(container::container_bundle(&asset_server, vec2(meters(-2.), 0.), uvec2(8, 8), items.clone()));
|
||||
commands.spawn(container::container_bundle(&asset_server, vec2(meters(2.), meters(4.)), uvec2(10, 8), items.clone()));
|
||||
commands.spawn(tilemap::tilemap_bundle(&asset_server, uvec2(16, 16), tiles, colliders));
|
||||
commands.spawn(stairs::stairs_bundle(
|
||||
&asset_server,
|
||||
vec2(meters(-5.), 0.),
|
||||
Some(vec2(meters(2.), meters(4.))),
|
||||
None,
|
||||
));
|
||||
commands.spawn(stairs::stairs_bundle(
|
||||
&asset_server,
|
||||
vec2(meters(-5.), meters(4.)),
|
||||
Some(vec2(meters(2.), meters(4.))),
|
||||
Some(vec2(meters(-2.), meters(-4.))),
|
||||
));
|
||||
commands.spawn(stairs::stairs_bundle(
|
||||
&asset_server,
|
||||
vec2(meters(-5.), meters(8.)),
|
||||
None,
|
||||
Some(vec2(meters(-2.), meters(-4.))),
|
||||
));
|
||||
}
|
||||
|
|
|
|||
|
|
@ -99,6 +99,9 @@ impl Plugin for ExpeditionPlugin {
|
|||
))
|
||||
.add_systems(OnEnter(GameState::Inventory), ui::inventory::systems::setup_ui_inventory)
|
||||
.add_systems(OnExit(GameState::Inventory), ui::inventory::systems::clear_ui_inventory)
|
||||
.add_observer(ui::inventory::observers::on_ui_rotate);
|
||||
.add_observer(ui::inventory::observers::on_ui_rotate)
|
||||
.add_observer(layout::container::on_container_interact)
|
||||
.add_observer(layout::door::on_door_interact)
|
||||
.add_observer(layout::stairs::on_stairs_interact);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -18,7 +18,7 @@ pub struct Player {
|
|||
|
||||
impl Default for Player {
|
||||
fn default() -> Self {
|
||||
Self { speed: meters(0.8) }
|
||||
Self { speed: meters(4.) }
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue