ui: Beginning of UI-related stuff

- UiRoot component
- WindowSize resource and update_window_size system
- UiInventory and UiInventorySlot components
- UiInventory now shows player inventory slots
This commit is contained in:
Alexey 2026-03-09 13:59:51 +03:00
commit ab993be476
6 changed files with 183 additions and 10 deletions

View file

@ -1,7 +1,7 @@
use bevy::prelude::*;
use leafwing_input_manager::prelude::*;
use crate::InputAction as Action;
use crate::{GameState, InputAction as Action, inventory::{ActiveInventory, Inventory}};
#[derive(Component)]
pub struct Player {
@ -18,6 +18,8 @@ fn player_bundle(asset_server: &Res<AssetServer>) -> impl Bundle {
Sprite::from_image(image),
Transform::from_xyz(0f32, 0f32, 1f32),
Action::default_input_map(),
Inventory::new(UVec2::new(12, 8)),
ActiveInventory,
)
}
@ -27,15 +29,33 @@ pub fn setup_player(mut commands: Commands, asset_server: Res<AssetServer>) {
pub fn handle_input(
time: Res<Time>,
mut player: Query<(&Player, &ActionState<Action>, &mut Transform, &mut Sprite)>,
state: Res<State<GameState>>,
mut next_state: ResMut<NextState<GameState>>,
mut player: Query<(&Player, &mut ActionState<Action>, &mut Transform, &mut Sprite)>,
) {
let player = player.single_mut().expect("Player should be single");
let (Player {speed}, action_state, mut transform, mut sprite) = player;
let direction = action_state.clamped_value(&Action::Move);
match state.get() {
GameState::Running => {
let (Player {speed}, mut action_state, mut transform, mut sprite) = player;
transform.translation.x += direction * speed * time.delta_secs();
if direction != 0f32 {
sprite.flip_x = direction < 0f32;
if action_state.just_released(&Action::ToggleInventory) {
next_state.set(GameState::Inventory);
action_state.reset(&Action::ToggleInventory);
}
let direction = action_state.clamped_value(&Action::Move);
transform.translation.x += direction * speed * time.delta_secs();
if direction != 0f32 {
sprite.flip_x = direction < 0f32;
}
},
GameState::Inventory => {
let (_, mut action_state, _, _) = player;
if action_state.just_released(&Action::ToggleInventory) {
next_state.set(GameState::Running);
action_state.reset(&Action::ToggleInventory);
}
},
}
}