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() {
|
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);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user