added cooking timer indicator, and burger indicator for inventory
This commit is contained in:
112
src/main.rs
112
src/main.rs
@@ -1,4 +1,4 @@
|
||||
use bevy::prelude::*;
|
||||
use bevy::{light::NotShadowCaster, prelude::*};
|
||||
|
||||
fn main() {
|
||||
App::new()
|
||||
@@ -6,7 +6,14 @@ fn main() {
|
||||
.add_systems(Startup, setup)
|
||||
.add_systems(
|
||||
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();
|
||||
}
|
||||
@@ -41,6 +48,14 @@ struct Player {
|
||||
holding: Item,
|
||||
progress: f32,
|
||||
}
|
||||
#[derive(Component)]
|
||||
struct ProgressBar {
|
||||
width: f32,
|
||||
player_height: f32,
|
||||
}
|
||||
|
||||
#[derive(Component)]
|
||||
struct PlayerBurgerIndicator;
|
||||
|
||||
#[derive(Component)]
|
||||
struct MoveTarget {
|
||||
@@ -119,6 +134,25 @@ fn setup(
|
||||
MoveTarget {
|
||||
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
|
||||
@@ -211,9 +245,11 @@ fn fryer_cook(
|
||||
fryer: Query<(&Fryer, &Transform)>,
|
||||
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 {
|
||||
continue;
|
||||
return;
|
||||
}
|
||||
for (fryer, fryer_transform) in fryer.iter() {
|
||||
let distance = player_transform.translation - fryer_transform.translation;
|
||||
@@ -228,18 +264,79 @@ fn fryer_cook(
|
||||
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(
|
||||
mut customer: Query<(&mut Customer, &mut MoveTarget, &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 {
|
||||
continue;
|
||||
return;
|
||||
}
|
||||
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 {
|
||||
continue;
|
||||
}
|
||||
@@ -248,8 +345,7 @@ fn customer_serve(
|
||||
if distance.length() < customer_data.range {
|
||||
player_data.holding = Item::None;
|
||||
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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user