almost
This commit is contained in:
BIN
assets/images/id_card_toolbar.png
Normal file
BIN
assets/images/id_card_toolbar.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 1.4 KiB |
@@ -6,4 +6,5 @@
|
|||||||
path: "meshes/library",
|
path: "meshes/library",
|
||||||
),
|
),
|
||||||
"id_card": File(path: "meshes/id_card.glb")
|
"id_card": File(path: "meshes/id_card.glb")
|
||||||
|
"id_card_toolbar": File(path: "images/id_card_toolbar.png"")
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -50,6 +50,8 @@ pub(crate) struct ConfigAssets {}
|
|||||||
pub(crate) struct ImageAssets {
|
pub(crate) struct ImageAssets {
|
||||||
#[asset(key = "lebron")]
|
#[asset(key = "lebron")]
|
||||||
pub(crate) king: Handle<Image>,
|
pub(crate) king: Handle<Image>,
|
||||||
|
#[asset(key = "id_card_toolbar")]
|
||||||
|
pub(crate) id_card: Handle<Image>,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(AssetCollection, Resource, Clone)]
|
#[derive(AssetCollection, Resource, Clone)]
|
||||||
|
|||||||
@@ -38,7 +38,6 @@ fn update_interaction_opportunities(
|
|||||||
let player = single!(player_query);
|
let player = single!(player_query);
|
||||||
|
|
||||||
for event in collision_events.read() {
|
for event in collision_events.read() {
|
||||||
dbg!(event);
|
|
||||||
let (e1, e2, started) = match event {
|
let (e1, e2, started) = match event {
|
||||||
CollisionEvent::Started(e1, e2, CollisionEventFlags::SENSOR) => (*e1, *e2, true),
|
CollisionEvent::Started(e1, e2, CollisionEventFlags::SENSOR) => (*e1, *e2, true),
|
||||||
CollisionEvent::Stopped(e1, e2, CollisionEventFlags::SENSOR) => (*e1, *e2, false),
|
CollisionEvent::Stopped(e1, e2, CollisionEventFlags::SENSOR) => (*e1, *e2, false),
|
||||||
@@ -47,21 +46,21 @@ fn update_interaction_opportunities(
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
let poss_target = match player {
|
let sensor = match player {
|
||||||
p if p == e1 => e2,
|
p if p == e1 => e2,
|
||||||
p if p == e2 => e1,
|
p if p == e2 => e1,
|
||||||
_ => continue,
|
_ => continue,
|
||||||
};
|
};
|
||||||
let mut ancestors = iter::once(poss_target).chain(parents.iter_ancestors(poss_target));
|
let mut ancestors = iter::once(sensor).chain(parents.iter_ancestors(sensor));
|
||||||
|
|
||||||
let Some(target) = ancestors.find_map(|entity| target_query.get(entity).ok()) else {
|
let Some(interactable) = ancestors.find_map(|entity| target_query.get(entity).ok()) else {
|
||||||
continue;
|
continue;
|
||||||
};
|
};
|
||||||
|
|
||||||
if started {
|
if started {
|
||||||
interaction_opportunity.0.replace(target);
|
interaction_opportunity.0.replace(interactable);
|
||||||
} else {
|
} else {
|
||||||
interaction_opportunity.0.take_if(|t| *t == target);
|
interaction_opportunity.0.take_if(|t| *t == interactable);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,14 +1,17 @@
|
|||||||
use bevy::{prelude::*, window::PrimaryWindow};
|
use bevy::prelude::*;
|
||||||
use bevy_egui::{EguiContext, EguiContexts, egui};
|
use bevy_egui::{EguiContexts, egui};
|
||||||
use std::default::Default;
|
use std::default::Default;
|
||||||
|
|
||||||
use crate::{GameState, util::single};
|
use crate::{GameState, asset_loading::ImageAssets, interaction::Interact, util::single};
|
||||||
|
|
||||||
use super::Player;
|
use super::Player;
|
||||||
|
|
||||||
#[derive(Component, Default, Debug)]
|
#[derive(Component, Default, Debug)]
|
||||||
pub struct Item(Option<Entity>);
|
pub struct Item(Option<Entity>);
|
||||||
|
|
||||||
|
#[derive(Component, Default, Debug)]
|
||||||
|
pub struct ItemIcon(Handle<Image>);
|
||||||
|
|
||||||
impl Item {
|
impl Item {
|
||||||
pub fn none() -> Self {
|
pub fn none() -> Self {
|
||||||
Default::default()
|
Default::default()
|
||||||
@@ -24,7 +27,13 @@ pub fn plugin(app: &mut App) {
|
|||||||
app.add_systems(Update, bottom_panel.run_if(in_state(GameState::Playing)));
|
app.add_systems(Update, bottom_panel.run_if(in_state(GameState::Playing)));
|
||||||
}
|
}
|
||||||
|
|
||||||
fn bottom_panel(mut egui_ctx: EguiContexts, item_query: Query<&Item, With<Player>>) {
|
fn bottom_panel(
|
||||||
|
mut egui_ctx: EguiContexts,
|
||||||
|
player_item_query: Query<&Item, With<Player>>,
|
||||||
|
item_query: Query<(&Name, &ItemIcon), With<Interact>>,
|
||||||
|
models: Res<Assets<Image>>,
|
||||||
|
gltf_assets: Res<ImageAssets>,
|
||||||
|
) {
|
||||||
egui::TopBottomPanel::bottom("inventory_toolbar")
|
egui::TopBottomPanel::bottom("inventory_toolbar")
|
||||||
.frame(egui::Frame {
|
.frame(egui::Frame {
|
||||||
fill: egui::Color32::from_rgba_premultiplied(0, 0, 0, 0),
|
fill: egui::Color32::from_rgba_premultiplied(0, 0, 0, 0),
|
||||||
@@ -52,12 +61,17 @@ fn bottom_panel(mut egui_ctx: EguiContexts, item_query: Query<&Item, With<Player
|
|||||||
ui.add_sized([50.0, 50.0], |ui: &mut egui::Ui| {
|
ui.add_sized([50.0, 50.0], |ui: &mut egui::Ui| {
|
||||||
// Display the item
|
// Display the item
|
||||||
ui.vertical_centered(|ui| {
|
ui.vertical_centered(|ui| {
|
||||||
|
let item = single!(player_item_query);
|
||||||
|
let item = item.0.and_then(|id| item_query.get(id).ok());
|
||||||
// Placeholder for texture - in a real app, load the texture
|
// Placeholder for texture - in a real app, load the texture
|
||||||
ui.label(egui::RichText::new("🔨").size(24.0));
|
ui.label(egui::RichText::new("🔨").size(24.0));
|
||||||
|
// let (name, icon) = item.map_or_else((Name::new(""), ), |(name, handle)|{
|
||||||
|
|
||||||
|
// });
|
||||||
|
|
||||||
// Item count (display only if > 1)
|
// Item count (display only if > 1)
|
||||||
ui.label(
|
ui.label(
|
||||||
egui::RichText::new("LOL")
|
egui::RichText::new("")
|
||||||
.color(egui::Color32::WHITE)
|
.color(egui::Color32::WHITE)
|
||||||
.size(12.0),
|
.size(12.0),
|
||||||
);
|
);
|
||||||
|
|||||||
Reference in New Issue
Block a user