Inventory screen and project organization
This commit is contained in:
parent
494e99a548
commit
b79bf00227
|
@ -1,15 +1,12 @@
|
|||
use bevy::prelude::*;
|
||||
use bevy_rapier3d::prelude::*;
|
||||
|
||||
use crate::{
|
||||
logic::core::player::{
|
||||
use crate::{logic::core::player::{
|
||||
player_movement::{
|
||||
move_player, PlayerLinearXZState, PlayerLinearYState, PlayerMovementInput,
|
||||
},
|
||||
player_values_state::PlayerValuesState,
|
||||
},
|
||||
ui::game::settings::SettingsScreenUIConfiguration,
|
||||
};
|
||||
}, ui::game::game_ui_state::GameUiState};
|
||||
|
||||
use super::markers::player::Player;
|
||||
|
||||
|
@ -28,7 +25,7 @@ pub fn capture_input(
|
|||
With<Player>,
|
||||
>,
|
||||
time: Res<Time>,
|
||||
settings_screen_config: Res<SettingsScreenUIConfiguration>,
|
||||
game_ui_state: Res<GameUiState>,
|
||||
player_values_state: Res<PlayerValuesState>,
|
||||
) {
|
||||
// Don't allocate on each frame. Instead Check if any of the inputs are being pressed and then allocate.
|
||||
|
@ -56,7 +53,7 @@ pub fn capture_input(
|
|||
back: keyboard_input.pressed(KeyCode::S),
|
||||
sprint: keyboard_input.pressed(KeyCode::ShiftLeft),
|
||||
};
|
||||
if settings_screen_config.settings_menu_shown {
|
||||
if game_ui_state.any_window() {
|
||||
move_player(
|
||||
PlayerMovementInput::default(),
|
||||
player_query,
|
||||
|
|
|
@ -0,0 +1,6 @@
|
|||
use bevy::ecs::component::Component;
|
||||
|
||||
|
||||
|
||||
#[derive(Component)]
|
||||
pub struct InventoryScreenUiMarker;
|
|
@ -5,3 +5,5 @@ pub mod holdable;
|
|||
pub mod interactable;
|
||||
pub mod muzzle_flash;
|
||||
pub mod player;
|
||||
pub mod inventory_screen;
|
||||
pub mod settings_screen;
|
|
@ -0,0 +1,4 @@
|
|||
use bevy::ecs::component::Component;
|
||||
|
||||
#[derive(Component)]
|
||||
pub struct SettingsScreenMarker;
|
|
@ -3,8 +3,7 @@ use bevy::{input::mouse::MouseMotion, prelude::*, window::CursorGrabMode};
|
|||
|
||||
use crate::{
|
||||
comps::core::markers::{camera::MainCamera, player::Player},
|
||||
ui::game::settings::SettingsScreenUIConfiguration,
|
||||
utils::rad_deg::radians_from_degrees,
|
||||
utils::rad_deg::radians_from_degrees, ui::game::game_ui_state::{GameUiState, GameUiWindow},
|
||||
};
|
||||
|
||||
use super::{player_movement::PlayerLinearXZState, player_values_state::PlayerValuesState};
|
||||
|
@ -76,24 +75,37 @@ pub fn follow_cursor_with_camera(
|
|||
keyboard_input: Res<Input<KeyCode>>,
|
||||
btn: Res<Input<MouseButton>>,
|
||||
time: Res<Time>,
|
||||
mut settings_screen_config: ResMut<SettingsScreenUIConfiguration>,
|
||||
mut game_ui_state: ResMut<GameUiState>,
|
||||
player_values_state: Res<PlayerValuesState>,
|
||||
) {
|
||||
if let Ok(mut window) = primary_window.get_single_mut() {
|
||||
if keyboard_input.just_pressed(KeyCode::Escape) {
|
||||
if settings_screen_config.settings_menu_shown {
|
||||
// Hide settings screen & Capture Cursor
|
||||
settings_screen_config.settings_menu_shown = false;
|
||||
if game_ui_state.any_window() {
|
||||
// Hide any UI screen & Capture Cursor
|
||||
game_ui_state.current_ui_window_shown = None;
|
||||
window.cursor.grab_mode = CursorGrabMode::Locked; // use `Locked` mode to keep the cursor in one place
|
||||
window.cursor.visible = false; // also hide the cursor
|
||||
} else {
|
||||
// Show Settings screen & Release Cursor
|
||||
settings_screen_config.settings_menu_shown = true;
|
||||
game_ui_state.current_ui_window_shown = Some(GameUiWindow::SettingsMenu);
|
||||
window.cursor.grab_mode = CursorGrabMode::None; // Release cursor
|
||||
window.cursor.visible = true; // Show cursor
|
||||
}
|
||||
}
|
||||
if settings_screen_config.settings_menu_shown {
|
||||
else if keyboard_input.just_pressed(KeyCode::Tab) {
|
||||
if game_ui_state.is_showing_window(GameUiWindow::InventoryMenu) {
|
||||
// Hide the inventory screen only
|
||||
game_ui_state.current_ui_window_shown = None;
|
||||
window.cursor.grab_mode = CursorGrabMode::Locked; // use `Locked` mode to keep the cursor in one place
|
||||
window.cursor.visible = false; // also hide the cursor
|
||||
} else {
|
||||
// Show Inventory screen & Release Cursor
|
||||
game_ui_state.current_ui_window_shown = Some(GameUiWindow::InventoryMenu);
|
||||
window.cursor.grab_mode = CursorGrabMode::None; // Release cursor
|
||||
window.cursor.visible = true; // Show cursor
|
||||
}
|
||||
}
|
||||
if game_ui_state.any_window() {
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
|
@ -19,7 +19,7 @@ use crate::{
|
|||
equipment::{Equipment, EquipmentChangeEvent},
|
||||
load_state::GameLoadState,
|
||||
},
|
||||
ui::game::{hud::hud::HudState, settings::SettingsScreenUIConfiguration},
|
||||
ui::game::{hud::hud::HudState, game_ui_state::GameUiState},
|
||||
utils::{self, rad_deg::radians_from_degrees},
|
||||
};
|
||||
|
||||
|
@ -28,7 +28,7 @@ pub struct CaptureHandUsageResourcesParams<'w> {
|
|||
mouse_buttons: Res<'w, Input<MouseButton>>,
|
||||
keyboard_input: Res<'w, Input<KeyCode>>,
|
||||
game_load_state: Res<'w, GameLoadState>,
|
||||
settings_screen_config: Res<'w, SettingsScreenUIConfiguration>,
|
||||
game_ui_state: Res<'w, GameUiState>,
|
||||
meshes: ResMut<'w, Assets<Mesh>>,
|
||||
materials: ResMut<'w, Assets<StandardMaterial>>,
|
||||
animation_clips: Res<'w, Assets<AnimationClip>>,
|
||||
|
@ -70,7 +70,7 @@ pub fn capture_hand_usage(
|
|||
|
||||
// Equipping gun
|
||||
// Validate player has primary item, and secondary item in inventory
|
||||
if !resources.settings_screen_config.settings_menu_shown {
|
||||
if !resources.game_ui_state.any_window() {
|
||||
if resources.keyboard_input.just_pressed(KeyCode::Key1) {
|
||||
if let Some(primary_item) = player_query.single().1.get_primary() {
|
||||
if let Some(primary_firearm) = primary_item.get_firearm() {
|
||||
|
@ -142,7 +142,7 @@ pub fn capture_hand_usage(
|
|||
} else {
|
||||
// Player is not in a reload animation
|
||||
if resources.keyboard_input.just_pressed(KeyCode::R)
|
||||
&& !resources.settings_screen_config.settings_menu_shown
|
||||
&& !resources.game_ui_state.any_window()
|
||||
{
|
||||
// Start reload animation
|
||||
for (animation_player_entity, mut animation_player) in
|
||||
|
@ -172,7 +172,7 @@ pub fn capture_hand_usage(
|
|||
}
|
||||
// AIMING IN/OUT
|
||||
if resources.mouse_buttons.pressed(MouseButton::Right)
|
||||
&& !resources.settings_screen_config.settings_menu_shown
|
||||
&& !resources.game_ui_state.any_window()
|
||||
{
|
||||
let rotation_lerp_quat = hand_transform.rotation.lerp(
|
||||
firearm_data.final_aimed_rotation,
|
||||
|
@ -205,7 +205,7 @@ pub fn capture_hand_usage(
|
|||
|
||||
// SHOOTING & RECOIL
|
||||
if resources.mouse_buttons.pressed(MouseButton::Left)
|
||||
&& !resources.settings_screen_config.settings_menu_shown
|
||||
&& !resources.game_ui_state.any_window()
|
||||
{
|
||||
if player_firing_info.full_auto_timer.finished() {
|
||||
if magazine_data.rounds_shot < magazine_data.max_capacity {
|
||||
|
@ -284,6 +284,7 @@ pub fn interact_action(
|
|||
rapier_context: Res<RapierContext>,
|
||||
mut hud_state: ResMut<HudState>,
|
||||
mut pickup_item_event_writer: EventWriter<PickupItemEvent>,
|
||||
game_ui_state: Res<GameUiState>,
|
||||
) {
|
||||
for (player_entity, transform) in player_query.iter() {
|
||||
for global_transform in camera_query.iter() {
|
||||
|
@ -303,7 +304,7 @@ pub fn interact_action(
|
|||
if interactable_entity == entity {
|
||||
hud_state.interaction_clue_shown = true;
|
||||
hud_state.interaction_clue_text = interactable.to_string();
|
||||
if keyboard_input.just_pressed(KeyCode::F) {
|
||||
if keyboard_input.just_pressed(KeyCode::F) && !game_ui_state.any_window() {
|
||||
// TODO: Move this key to Controls state global
|
||||
match interactable {
|
||||
Interactable::Holdable => todo!(),
|
||||
|
|
|
@ -0,0 +1,33 @@
|
|||
use bevy::prelude::*;
|
||||
|
||||
#[derive(Debug, Reflect, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)]
|
||||
pub enum GameUiWindow {
|
||||
InventoryMenu,
|
||||
EscapeMenu,
|
||||
SettingsMenu,
|
||||
}
|
||||
|
||||
#[derive(Resource, Reflect)]
|
||||
#[reflect(Resource)]
|
||||
pub struct GameUiState {
|
||||
pub current_ui_window_shown: Option<GameUiWindow>,
|
||||
pub fps_counter_enabled: bool,
|
||||
}
|
||||
|
||||
impl Default for GameUiState {
|
||||
fn default() -> Self {
|
||||
Self { current_ui_window_shown: None, fps_counter_enabled: true }
|
||||
}
|
||||
}
|
||||
|
||||
impl GameUiState {
|
||||
pub fn is_showing_window(&self, window: GameUiWindow) -> bool {
|
||||
match self.current_ui_window_shown {
|
||||
Some(current_ui_window) => window == current_ui_window,
|
||||
None => false,
|
||||
}
|
||||
}
|
||||
pub fn any_window(&self) -> bool {
|
||||
self.current_ui_window_shown.is_some()
|
||||
}
|
||||
}
|
|
@ -1,6 +1,6 @@
|
|||
use bevy::prelude::*;
|
||||
|
||||
use crate::ui::game::settings::SettingsScreenUIConfiguration;
|
||||
use crate::ui::game::game_ui_state::GameUiState;
|
||||
|
||||
use super::hud::HudState;
|
||||
|
||||
|
@ -37,14 +37,14 @@ pub fn setup_interact_clue(mut commands: Commands) {
|
|||
pub fn update_interact_clue(
|
||||
//mut commands: Commands,
|
||||
interact_clue: Res<HudState>,
|
||||
settings_screen_config: Res<SettingsScreenUIConfiguration>,
|
||||
game_ui_state: Res<GameUiState>,
|
||||
mut query: Query<(&mut Visibility, &mut Text), With<InteractClueHudMarker>>,
|
||||
) {
|
||||
if !settings_screen_config.is_changed() && !interact_clue.is_changed() {
|
||||
if !game_ui_state.is_changed() && !interact_clue.is_changed() {
|
||||
return;
|
||||
}
|
||||
for (mut vis, mut text) in query.iter_mut() {
|
||||
if settings_screen_config.settings_menu_shown {
|
||||
if game_ui_state.any_window() {
|
||||
*vis = Visibility::Hidden;
|
||||
return;
|
||||
}
|
||||
|
|
|
@ -1,3 +1,4 @@
|
|||
pub mod hud;
|
||||
pub mod interact_clue;
|
||||
pub mod plugin;
|
||||
pub mod fps_counter;
|
||||
|
|
|
@ -2,7 +2,7 @@ use bevy::prelude::*;
|
|||
|
||||
use crate::ui::game::hud::hud::HudState;
|
||||
|
||||
use super::interact_clue::{setup_interact_clue, update_interact_clue};
|
||||
use super::{interact_clue::{setup_interact_clue, update_interact_clue}, fps_counter};
|
||||
|
||||
pub struct HudOverlayPlugin;
|
||||
|
||||
|
@ -12,5 +12,7 @@ impl Plugin for HudOverlayPlugin {
|
|||
app.register_type::<HudState>();
|
||||
app.add_systems(Startup, setup_interact_clue);
|
||||
app.add_systems(Update, update_interact_clue);
|
||||
app.add_systems(Startup, fps_counter::setup_fps_counter);
|
||||
app.add_systems(Update,fps_counter::tick_fps_counter);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,9 +1,79 @@
|
|||
use bevy::prelude::*;
|
||||
use bevy::{prelude::*, ui::FocusPolicy};
|
||||
|
||||
use crate::{comps::core::markers::inventory_screen::InventoryScreenUiMarker, ui::game::game_ui_state::{GameUiState, GameUiWindow}};
|
||||
|
||||
//use crate::comps::core::events::loot_container::LootContainerEvent;
|
||||
|
||||
/// # Inventory Screen
|
||||
/// Should contain player inventory and if player is looting something as well
|
||||
pub fn setup_inventory_screen(mut _commands: Commands) {}
|
||||
pub fn setup_inventory_screen(mut commands: Commands) {
|
||||
// Background
|
||||
let background_id = commands
|
||||
.spawn((
|
||||
NodeBundle {
|
||||
style: Style {
|
||||
display: Display::Flex,
|
||||
width: Val::Percent(100.0),
|
||||
height: Val::Percent(100.0),
|
||||
justify_content: JustifyContent::Center,
|
||||
padding: UiRect::percent(3.0, 3.0, 3.0, 3.0),
|
||||
align_items: AlignItems::Center,
|
||||
flex_direction: FlexDirection::Row,
|
||||
..Default::default()
|
||||
},
|
||||
visibility: Visibility::Hidden,
|
||||
background_color: BackgroundColor(Color::rgba(0.0, 0.0, 0.0, 0.9)),
|
||||
focus_policy: FocusPolicy::Block,
|
||||
..Default::default()
|
||||
},
|
||||
Name::new("Inventory Screen"),
|
||||
))
|
||||
.insert(InventoryScreenUiMarker).id();
|
||||
// Left panel
|
||||
let left_panel_id = commands.spawn(
|
||||
NodeBundle {
|
||||
style: Style {
|
||||
display: Display::Flex,
|
||||
width: Val::Percent(50.0),
|
||||
height: Val::Percent(100.0),
|
||||
align_items: AlignItems::Center,
|
||||
justify_content: JustifyContent::Center,
|
||||
padding: UiRect::all(Val::Percent(5.0)),
|
||||
flex_direction: FlexDirection::Column,
|
||||
..Default::default()
|
||||
},
|
||||
..Default::default()
|
||||
}
|
||||
).set_parent(background_id).id();
|
||||
// Right panel
|
||||
let right_panel_id = commands.spawn(
|
||||
NodeBundle {
|
||||
style: Style {
|
||||
display: Display::Flex,
|
||||
width: Val::Percent(50.0),
|
||||
height: Val::Percent(100.0),
|
||||
align_items: AlignItems::Center,
|
||||
justify_content: JustifyContent::Center,
|
||||
padding: UiRect::all(Val::Percent(5.0)),
|
||||
flex_direction: FlexDirection::Column,
|
||||
..Default::default()
|
||||
},
|
||||
..Default::default()
|
||||
}
|
||||
).set_parent(background_id).id();
|
||||
|
||||
pub fn update_inventory_screen(mut _commands: Commands) {}
|
||||
}
|
||||
|
||||
pub fn update_inventory_screen(
|
||||
mut commands: Commands,
|
||||
game_ui_state: Res<GameUiState>,
|
||||
mut inventory_screen_query: Query<&mut Visibility, With<InventoryScreenUiMarker>>,
|
||||
) {
|
||||
for mut visibility in inventory_screen_query.iter_mut() {
|
||||
if game_ui_state.is_showing_window(GameUiWindow::InventoryMenu) {
|
||||
*visibility = Visibility::Visible;
|
||||
} else {
|
||||
*visibility = Visibility::Hidden;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -1,7 +1,6 @@
|
|||
//! Game UI means all the UI that will be part of the actual game
|
||||
pub mod fps_counter;
|
||||
pub mod hud;
|
||||
pub mod inventory;
|
||||
pub mod plugin;
|
||||
pub mod game_ui_state;
|
||||
pub mod settings;
|
||||
pub mod settings_screen;
|
||||
|
|
|
@ -1,9 +1,7 @@
|
|||
use bevy::prelude::*;
|
||||
|
||||
use crate::ui::game::settings::GameConfiguration;
|
||||
|
||||
use super::{
|
||||
fps_counter, hud, inventory, settings::SettingsScreenUIConfiguration, settings_screen,
|
||||
hud, inventory, game_ui_state::GameUiState, settings,
|
||||
};
|
||||
|
||||
pub struct MainGameUIPlugin;
|
||||
|
@ -12,23 +10,7 @@ impl Plugin for MainGameUIPlugin {
|
|||
fn build(&self, app: &mut App) {
|
||||
app.add_plugins(hud::plugin::HudOverlayPlugin);
|
||||
app.add_plugins(inventory::plugin::InventoryMenuPlugin);
|
||||
app.insert_resource(GameConfiguration::default());
|
||||
app.insert_resource(SettingsScreenUIConfiguration::default());
|
||||
app.add_systems(
|
||||
Startup,
|
||||
(
|
||||
settings_screen::setup_settings_screen,
|
||||
fps_counter::setup_fps_counter,
|
||||
inventory::menu::setup_inventory_screen,
|
||||
),
|
||||
);
|
||||
app.add_systems(
|
||||
Update,
|
||||
(
|
||||
settings_screen::toggle_settings_screen,
|
||||
settings_screen::handle_settings_button_click,
|
||||
fps_counter::tick_fps_counter,
|
||||
),
|
||||
);
|
||||
app.add_plugins(settings::plugin::SettingsMenuPlugin);
|
||||
app.insert_resource(GameUiState::default());
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,29 +0,0 @@
|
|||
use bevy::prelude::*;
|
||||
|
||||
#[derive(Resource, Reflect)]
|
||||
#[reflect(Resource)]
|
||||
pub struct SettingsScreenUIConfiguration {
|
||||
pub settings_menu_shown: bool,
|
||||
}
|
||||
|
||||
impl Default for SettingsScreenUIConfiguration {
|
||||
fn default() -> Self {
|
||||
Self {
|
||||
settings_menu_shown: false,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Resource, Reflect)]
|
||||
#[reflect(Resource)]
|
||||
pub struct GameConfiguration {
|
||||
pub fps_counter_enabled: bool,
|
||||
}
|
||||
|
||||
impl Default for GameConfiguration {
|
||||
fn default() -> Self {
|
||||
Self {
|
||||
fps_counter_enabled: true,
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,9 +1,6 @@
|
|||
use bevy::{app::AppExit, prelude::*, ui::FocusPolicy};
|
||||
|
||||
use super::settings::SettingsScreenUIConfiguration;
|
||||
|
||||
#[derive(Component)]
|
||||
pub struct SettingsScreenMarker;
|
||||
use crate::{comps::core::markers::settings_screen::SettingsScreenMarker, ui::game::game_ui_state::{GameUiState, GameUiWindow}};
|
||||
|
||||
#[derive(Component)]
|
||||
pub enum SettingsScreenActions {
|
||||
|
@ -95,14 +92,14 @@ pub fn setup_settings_screen(mut commands: Commands) {
|
|||
}
|
||||
|
||||
pub fn toggle_settings_screen(
|
||||
settings: Res<SettingsScreenUIConfiguration>,
|
||||
game_ui_state: Res<GameUiState>,
|
||||
mut settings_screen_query: Query<(&mut Visibility, &mut Style), With<SettingsScreenMarker>>,
|
||||
) {
|
||||
if settings.is_changed() {
|
||||
if game_ui_state.is_changed() {
|
||||
for (mut settings_screen_visibility, mut settings_screen_style) in
|
||||
settings_screen_query.iter_mut()
|
||||
{
|
||||
if settings.settings_menu_shown {
|
||||
if game_ui_state.is_showing_window(GameUiWindow::SettingsMenu) {
|
||||
*settings_screen_visibility = Visibility::Visible;
|
||||
settings_screen_style.display = Display::Flex;
|
||||
} else {
|
||||
|
@ -116,7 +113,7 @@ pub fn toggle_settings_screen(
|
|||
pub fn handle_settings_button_click(
|
||||
query: Query<(&Interaction, &SettingsScreenActions), Changed<Interaction>>,
|
||||
mut exit: EventWriter<AppExit>,
|
||||
mut settings: ResMut<SettingsScreenUIConfiguration>,
|
||||
mut game_ui_state: ResMut<GameUiState>,
|
||||
mut mouse_buttons: ResMut<Input<MouseButton>>,
|
||||
) {
|
||||
for (interaction, action) in query.iter() {
|
||||
|
@ -129,7 +126,7 @@ pub fn handle_settings_button_click(
|
|||
}
|
||||
SettingsScreenActions::Resume => {
|
||||
// RESUME GAME
|
||||
settings.settings_menu_shown = false;
|
||||
game_ui_state.current_ui_window_shown = None;
|
||||
mouse_buttons.release(MouseButton::Left);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,2 @@
|
|||
pub mod plugin;
|
||||
pub mod menu;
|
|
@ -0,0 +1,13 @@
|
|||
use bevy::app::{Plugin, Startup, Update};
|
||||
|
||||
use super::menu;
|
||||
|
||||
|
||||
pub struct SettingsMenuPlugin;
|
||||
|
||||
impl Plugin for SettingsMenuPlugin {
|
||||
fn build(&self, app: &mut bevy::prelude::App) {
|
||||
app.add_systems(Startup, menu::setup_settings_screen);
|
||||
app.add_systems(Update, (menu::toggle_settings_screen, menu::handle_settings_button_click));
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue