use bevy::prelude::*; use leafwing_input_manager::prelude::*; use crate::{GameState, InputAction as Action, inventory::{ActiveInventory, Inventory, item::Item}}; #[derive(Component, Reflect)] pub struct Player { // px/s speed: f32, } fn player_bundle(asset_server: &Res) -> impl Bundle { let image = asset_server.load("sprites/player/player.png"); ( Player { speed: 51.2, }, Sprite::from_image(image), Transform::from_xyz(0f32, 0f32, 1f32), Action::default_input_map(), Name::new("Player"), children![ (Inventory::new(UVec2::new(6, 2)), ActiveInventory), (Inventory::new(UVec2::new(5, 3)), ActiveInventory), (Inventory::new(UVec2::new(4, 4)), ActiveInventory), ], ) } pub fn setup_player(mut commands: Commands, asset_server: Res) { commands.spawn(player_bundle(&asset_server)); } pub fn try_insert_item( mut commands: Commands, item_query: Query<&Item>, inventory_query: Query<(Entity, &Inventory, Option<&Children>)>, ) { let mut item = Item::new(UVec2::new(1, 1)); let name = Name::new(format!("Item {}x{}", item.size.x, item.size.y)); for (entity, inventory, children) in inventory_query.iter().sort::() { let children = match children { Some(children) => &children[..], None => &[], }; match inventory.find_free_space(item_query, children, item.size) { Some((position, should_rotate)) => { if should_rotate { item.rotate(); } item.position = Some(position); info!("Spawning item {item:?}"); commands.entity(entity).with_child((item, name)); break; }, None => (), } } } pub fn handle_input( mut commands: Commands, time: Res