bevy-expedition-demo/src/layout/container.rs
2ndbeam 42cfd14214 feat: Layout changes
- Added padlock layout object
- Added lockpick item
- Added ItemImage component
- Tilemap colliders are now creating from the tiles themselves
- Removed items from container bundle
- Removed colliders from tilemap bundle
- Removed setup_player system
2026-03-25 13:32:12 +03:00

60 lines
1.6 KiB
Rust

use bevy::prelude::*;
use bevy_rapier2d::prelude::*;
use crate::{
GameState,
meters,
inventory::{
ActiveInventory,
Inventory,
}
};
use super::*;
const CRATE_CLOSED_ASSET: &'static str = "sprites/interactive/crate_closed.png";
#[derive(Component, Clone, Copy, Default, Reflect, Debug, PartialEq, Eq)]
#[reflect(Component, Clone, Default, Debug, PartialEq)]
#[require(Sprite, InteractiveObject, Inventory)]
pub struct Container;
pub fn on_container_interact(
event: On<InteractionEvent>,
mut commands: Commands,
locked_query: Query<(), With<Locked>>,
crate_query: Query<(), With<Container>>,
mut next_state: ResMut<NextState<GameState>>,
) {
if locked_query.get(event.entity).is_ok() {
return;
}
if crate_query.get(event.entity).is_err() {
return;
}
commands.entity(event.entity).insert(ActiveInventory);
next_state.set(GameState::Inventory);
}
pub fn container_bundle(
asset_server: &Res<AssetServer>,
position: Vec2,
inventory_size: UVec2,
) -> impl Bundle {
let image = asset_server.load(CRATE_CLOSED_ASSET);
(
Container,
Transform::from_xyz(position.x, position.y - meters(0.5), 0.),
Sprite::from_image(image),
Inventory::new(inventory_size),
Children::spawn((
Spawn((
Collider::cuboid(meters(1.), meters(1.)),
Sensor,
Transform::from_xyz(0., meters(0.5), 0.),
)),
)),
Name::new(format!("Container {}x{}", inventory_size.x, inventory_size.y)),
)
}