Interactable clue UI and trigger plus interaction on key press F
This commit is contained in:
parent
ac119eb60a
commit
7685caf99f
@ -5,7 +5,6 @@ use crate::setup::equipment::Equipment;
|
|||||||
#[derive(Clone, Default, Reflect)]
|
#[derive(Clone, Default, Reflect)]
|
||||||
pub struct PlayerData {
|
pub struct PlayerData {
|
||||||
pub equipment: Equipment,
|
pub equipment: Equipment,
|
||||||
pub is_looking_at_interactable: bool,
|
|
||||||
}
|
}
|
||||||
#[derive(Component, Reflect)]
|
#[derive(Component, Reflect)]
|
||||||
pub struct Player(pub PlayerData);
|
pub struct Player(pub PlayerData);
|
||||||
|
@ -3,7 +3,7 @@ use bevy_rapier3d::prelude::*;
|
|||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
comps::core::markers::{firearm::{FirearmData, MagazineData}, holdable::InPlayerHands, player::{PlayerHand, Player}, camera::MainCamera, interactable::Interactable},
|
comps::core::markers::{firearm::{FirearmData, MagazineData}, holdable::InPlayerHands, player::{PlayerHand, Player}, camera::MainCamera, interactable::Interactable},
|
||||||
logic::core::guns::{player_firing::PlayerFiringInfo, shoot::shoot_bullet}, utils::rad_deg::radians_from_degrees, setup::{animations::AllFirearmAnimations, load_state::GameLoadState, equipment::{EquipmentChangeEvent, Equipment}}, ui::game::settings::SettingsScreenUIConfiguration,
|
logic::core::guns::{player_firing::PlayerFiringInfo, shoot::shoot_bullet}, utils::rad_deg::radians_from_degrees, setup::{animations::AllFirearmAnimations, load_state::GameLoadState, equipment::{EquipmentChangeEvent, Equipment}}, ui::game::{settings::SettingsScreenUIConfiguration, hud::hud::HudState},
|
||||||
};
|
};
|
||||||
|
|
||||||
pub fn capture_hand_usage(
|
pub fn capture_hand_usage(
|
||||||
@ -162,32 +162,39 @@ pub fn capture_hand_usage(
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#[allow(unused)]
|
|
||||||
/// Method that is run when player hits interact button.
|
/// Method that is run when player hits interact button.
|
||||||
/// Should raycast where the player is looking and scan for interactable
|
/// Should raycast where the player is looking and scan for interactable
|
||||||
pub fn interact_action(
|
pub fn interact_action(
|
||||||
mut commands: Commands,
|
//mut commands: Commands,
|
||||||
mut player_query: Query<(&GlobalTransform, &Transform), (With<Player>)>,
|
player_query: Query<&Transform, (With<Player>, Without<MainCamera>)>,
|
||||||
|
camera_query: Query<&GlobalTransform, (With<MainCamera>, Without<Player>)>,
|
||||||
interactables_query: Query<(Entity, &Interactable)>,
|
interactables_query: Query<(Entity, &Interactable)>,
|
||||||
keyboard_input: Res<Input<KeyCode>>,
|
keyboard_input: Res<Input<KeyCode>>,
|
||||||
rapier_context: Res<RapierContext>,
|
rapier_context: Res<RapierContext>,
|
||||||
|
mut hud_state: ResMut<HudState>,
|
||||||
) {
|
) {
|
||||||
for (global_transform, transform) in player_query.iter_mut() {
|
for transform in player_query.iter() {
|
||||||
let ray_pos = global_transform.translation();
|
for global_transform in camera_query.iter() {
|
||||||
let ray_dir = transform.forward() * 2.0; // TODO: Move this into global Resource state
|
let ray_pos = global_transform.translation();
|
||||||
let max_toi = 4.0;
|
let ray_dir = transform.forward() * 2.0; // TODO: Move this into global Resource state
|
||||||
let solid = true;
|
let max_toi = 4.0;
|
||||||
|
let solid = true;
|
||||||
if let Some((entity, toi)) = rapier_context.cast_ray(
|
|
||||||
ray_pos, ray_dir, max_toi, solid, QueryFilter::only_fixed()
|
if let Some((entity, _toi)) = rapier_context.cast_ray(
|
||||||
) {
|
ray_pos, ray_dir, max_toi, solid, QueryFilter::only_fixed()
|
||||||
for (interactable_entity, interactable) in interactables_query.iter() {
|
) {
|
||||||
if interactable_entity == entity {
|
for (interactable_entity, _interactable) in interactables_query.iter() {
|
||||||
if keyboard_input.just_pressed(KeyCode::F) { // TODO: Move this key to Controls state global
|
if interactable_entity == entity {
|
||||||
println!("Interacted with interactable");
|
hud_state.interaction_clue_shown = true;
|
||||||
|
if keyboard_input.just_pressed(KeyCode::F) { // TODO: Move this key to Controls state global
|
||||||
|
println!("Interacted with interactable");
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
hud_state.interaction_clue_shown = false;
|
||||||
}
|
}
|
8
src/ui/game/hud/hud.rs
Normal file
8
src/ui/game/hud/hud.rs
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
use bevy::prelude::*;
|
||||||
|
|
||||||
|
#[derive(Resource, Reflect, Default)]
|
||||||
|
#[reflect(Resource)]
|
||||||
|
pub struct HudState {
|
||||||
|
pub interaction_clue_shown: bool,
|
||||||
|
|
||||||
|
}
|
59
src/ui/game/hud/interact_clue.rs
Normal file
59
src/ui/game/hud/interact_clue.rs
Normal file
@ -0,0 +1,59 @@
|
|||||||
|
use bevy::{prelude::*, ui::FocusPolicy};
|
||||||
|
|
||||||
|
use crate::ui::game::settings::SettingsScreenUIConfiguration;
|
||||||
|
|
||||||
|
use super::hud::HudState;
|
||||||
|
|
||||||
|
#[derive(Component)]
|
||||||
|
pub struct InteractClueHudMarker;
|
||||||
|
|
||||||
|
pub fn setup_interact_clue(mut commands: Commands) {
|
||||||
|
commands.spawn((
|
||||||
|
NodeBundle {
|
||||||
|
style: Style {
|
||||||
|
display: Display::Flex,
|
||||||
|
width: Val::Percent(100.0),
|
||||||
|
height: Val::Percent(100.0),
|
||||||
|
justify_content: JustifyContent::Center,
|
||||||
|
align_items: AlignItems::Center,
|
||||||
|
..Default::default()
|
||||||
|
},
|
||||||
|
visibility: Visibility::Hidden,
|
||||||
|
background_color: BackgroundColor(Color::NONE),
|
||||||
|
focus_policy: FocusPolicy::Pass,
|
||||||
|
..Default::default()
|
||||||
|
}, Name::new("Interaction Clue Background"),
|
||||||
|
InteractClueHudMarker)
|
||||||
|
).with_children(|parent| {
|
||||||
|
parent.spawn((TextBundle {
|
||||||
|
text: Text::from_section("Loot", TextStyle {
|
||||||
|
font_size: 12.0, color: Color::WHITE, ..Default::default()
|
||||||
|
}).with_alignment(TextAlignment::Center),
|
||||||
|
..Default::default()
|
||||||
|
}, Name::new("Interaction Clue text"),
|
||||||
|
));
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn update_interact_clue(
|
||||||
|
//mut commands: Commands,
|
||||||
|
interact_clue: Res<HudState>,
|
||||||
|
settings_screen_config: Res<SettingsScreenUIConfiguration>,
|
||||||
|
mut query: Query<&mut Visibility, With<InteractClueHudMarker>>
|
||||||
|
) {
|
||||||
|
if !settings_screen_config.is_changed() && !interact_clue.is_changed() {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
for mut vis in query.iter_mut() {
|
||||||
|
if settings_screen_config.settings_menu_shown {
|
||||||
|
*vis = Visibility::Hidden;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if interact_clue.interaction_clue_shown {
|
||||||
|
*vis = Visibility::Visible;
|
||||||
|
} else {
|
||||||
|
*vis = Visibility::Hidden;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
3
src/ui/game/hud/mod.rs
Normal file
3
src/ui/game/hud/mod.rs
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
pub mod interact_clue;
|
||||||
|
pub mod plugin;
|
||||||
|
pub mod hud;
|
17
src/ui/game/hud/plugin.rs
Normal file
17
src/ui/game/hud/plugin.rs
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
use bevy::prelude::*;
|
||||||
|
|
||||||
|
use crate::ui::game::hud::hud::HudState;
|
||||||
|
|
||||||
|
use super::interact_clue::{setup_interact_clue, update_interact_clue};
|
||||||
|
|
||||||
|
|
||||||
|
pub struct HudOverlayPlugin;
|
||||||
|
|
||||||
|
impl Plugin for HudOverlayPlugin {
|
||||||
|
fn build(&self, app: &mut App) {
|
||||||
|
app.insert_resource(HudState::default());
|
||||||
|
app.register_type::<HudState>();
|
||||||
|
app.add_systems(Startup, setup_interact_clue);
|
||||||
|
app.add_systems(Update, update_interact_clue);
|
||||||
|
}
|
||||||
|
}
|
@ -3,4 +3,5 @@ pub mod plugin;
|
|||||||
pub mod fps_counter;
|
pub mod fps_counter;
|
||||||
pub mod settings;
|
pub mod settings;
|
||||||
pub mod settings_screen;
|
pub mod settings_screen;
|
||||||
pub mod inventory;
|
pub mod inventory;
|
||||||
|
pub mod hud;
|
@ -2,12 +2,13 @@ use bevy::prelude::*;
|
|||||||
|
|
||||||
use crate::ui::game::settings::GameConfiguration;
|
use crate::ui::game::settings::GameConfiguration;
|
||||||
|
|
||||||
use super::{fps_counter, settings_screen, settings::SettingsScreenUIConfiguration, inventory};
|
use super::{fps_counter, settings_screen, settings::SettingsScreenUIConfiguration, inventory, hud};
|
||||||
|
|
||||||
pub struct MainGameUIPlugin;
|
pub struct MainGameUIPlugin;
|
||||||
|
|
||||||
impl Plugin for MainGameUIPlugin {
|
impl Plugin for MainGameUIPlugin {
|
||||||
fn build(&self, app: &mut App) {
|
fn build(&self, app: &mut App) {
|
||||||
|
app.add_plugins(hud::plugin::HudOverlayPlugin);
|
||||||
app.insert_resource(GameConfiguration::default());
|
app.insert_resource(GameConfiguration::default());
|
||||||
app.insert_resource(SettingsScreenUIConfiguration::default());
|
app.insert_resource(SettingsScreenUIConfiguration::default());
|
||||||
app.add_systems(Startup, (
|
app.add_systems(Startup, (
|
||||||
|
Loading…
Reference in New Issue
Block a user