added cooking timer indicator, and burger indicator for inventory

This commit is contained in:
2026-01-02 21:33:08 +00:00
parent 0b3158ca25
commit 7cdbe2e2f6

View File

@@ -1,4 +1,4 @@
use bevy::prelude::*; use bevy::{light::NotShadowCaster, prelude::*};
fn main() { fn main() {
App::new() App::new()
@@ -6,7 +6,14 @@ fn main() {
.add_systems(Startup, setup) .add_systems(Startup, setup)
.add_systems( .add_systems(
Update, Update,
(handle_click, move_to_target, fryer_cook, customer_serve), (
handle_click,
move_to_target,
fryer_cook,
customer_serve,
update_progress_bar,
update_burger_indicators,
),
) )
.run(); .run();
} }
@@ -41,6 +48,14 @@ struct Player {
holding: Item, holding: Item,
progress: f32, progress: f32,
} }
#[derive(Component)]
struct ProgressBar {
width: f32,
player_height: f32,
}
#[derive(Component)]
struct PlayerBurgerIndicator;
#[derive(Component)] #[derive(Component)]
struct MoveTarget { struct MoveTarget {
@@ -119,6 +134,25 @@ fn setup(
MoveTarget { MoveTarget {
position: Vec3::new(0.0, 0.0, 0.0), position: Vec3::new(0.0, 0.0, 0.0),
}, },
// Burger indicator
children![(
SceneRoot(asset_server.load("models/burger.glb#Scene0")),
Transform::from_xyz(0.0, 7.1, 0.0).with_scale(Vec3::splat(0.9)),
Visibility::Hidden,
PlayerBurgerIndicator,
)],
));
// ProgressBar
commands.spawn((
Mesh3d(meshes.add(Cuboid::new(4.0, 0.5, 0.1))),
MeshMaterial3d(materials.add(Color::srgb(0.0, 1.0, 0.0))),
Transform::from_xyz(0.0, 0.0, 0.0),
ProgressBar {
width: 1.0,
player_height: 4.0,
},
NotShadowCaster,
)); ));
// Customer // Customer
@@ -211,9 +245,11 @@ fn fryer_cook(
fryer: Query<(&Fryer, &Transform)>, fryer: Query<(&Fryer, &Transform)>,
time: Res<Time>, time: Res<Time>,
) { ) {
for (mut player_data, player_transform) in player.iter_mut() { let Ok((mut player_data, player_transform)) = player.single_mut() else {
return;
};
if player_data.holding == Item::Burger { if player_data.holding == Item::Burger {
continue; return;
} }
for (fryer, fryer_transform) in fryer.iter() { for (fryer, fryer_transform) in fryer.iter() {
let distance = player_transform.translation - fryer_transform.translation; let distance = player_transform.translation - fryer_transform.translation;
@@ -228,18 +264,79 @@ fn fryer_cook(
player_data.progress = 0.0; player_data.progress = 0.0;
} }
} }
}
fn update_progress_bar(
player: Query<(&Player, &Transform), Without<ProgressBar>>,
mut progress_bar: Query<(&mut Transform, &mut Visibility, &ProgressBar)>,
camera: Query<&Transform, (With<Camera3d>, Without<ProgressBar>, Without<Player>)>,
) {
let Ok((player, player_transform)) = player.single() else {
return;
};
let Ok((mut bar_transform, mut visibility, bar_data)) = progress_bar.single_mut() else {
return;
};
let Ok(camera_transform) = camera.single() else {
return;
};
let progress_percent = (player.progress / 100.0).clamp(0.0, 1.0);
// Update above player
bar_transform.translation = player_transform.translation + Vec3::Y * bar_data.player_height;
// Billboard effect
let to_camera = (camera_transform.translation - bar_transform.translation).normalize();
let angle = to_camera.z.atan2(to_camera.x);
bar_transform.rotation = Quat::from_rotation_y(angle + std::f32::consts::FRAC_PI_2);
bar_transform.scale.x = bar_data.width * progress_percent;
if progress_percent == 0.0 || progress_percent == 1.0 {
*visibility = Visibility::Hidden;
} else {
*visibility = Visibility::Visible;
} }
} }
fn update_burger_indicators(
player: Query<&Player>,
mut burger: Query<(&mut Visibility, &mut Transform), With<PlayerBurgerIndicator>>,
time: Res<Time>,
) {
let Ok(player_data) = player.single() else {
return;
};
let Ok((mut burger_vis, mut burger_transform)) = burger.single_mut() else {
return;
};
// Rotate burger
burger_transform.rotate_y(time.delta_secs());
// Show/hide based on inventory
*burger_vis = if player_data.holding == Item::Burger {
Visibility::Visible
} else {
Visibility::Hidden
};
}
fn customer_serve( fn customer_serve(
mut customer: Query<(&mut Customer, &mut MoveTarget, &Transform)>, mut customer: Query<(&mut Customer, &mut MoveTarget, &Transform)>,
mut player: Query<(&mut Player, &Transform)>, mut player: Query<(&mut Player, &Transform)>,
) { ) {
for (mut player_data, player_transform) in player.iter_mut() { let Ok((mut player_data, player_transform)) = player.single_mut() else {
return;
};
if player_data.holding == Item::None { if player_data.holding == Item::None {
continue; return;
} }
for (mut customer_data, mut customer_target, customer_transform) in customer.iter_mut() { for (mut customer_data, mut customer_target, customer_transform) in customer.iter_mut() {
if customer_data.served {
continue;
}
if player_data.holding != customer_data.order { if player_data.holding != customer_data.order {
continue; continue;
} }
@@ -248,8 +345,7 @@ fn customer_serve(
if distance.length() < customer_data.range { if distance.length() < customer_data.range {
player_data.holding = Item::None; player_data.holding = Item::None;
customer_data.served = true; customer_data.served = true;
customer_target.position = Vec3::new(20.0, 0.0, 0.0); customer_target.position = Vec3::new(100.0, 0.0, 0.0);
}
} }
} }
} }