feat: begin on stamina

Former-commit-id: d4d8c9a8e6ed2fb5483465a70a10c612be2823dc
This commit is contained in:
Muhammad Nauman Raza 2023-12-06 22:45:32 +00:00
parent 6fb06a102e
commit f9fb6c21da
6 changed files with 69 additions and 38 deletions

Binary file not shown.

Before

Width:  |  Height:  |  Size: 715 B

After

Width:  |  Height:  |  Size: 756 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 KiB

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 375 B

After

Width:  |  Height:  |  Size: 403 B

View file

@ -55,12 +55,22 @@ fn main() {
.init_resource::<UiState>() .init_resource::<UiState>()
.init_resource::<OpenWindows>() .init_resource::<OpenWindows>()
.add_systems(Startup, (setup, setup_ui)) .add_systems(Startup, (setup, setup_ui))
.add_systems(Update, (render_ui, movement, camera_follow)) .add_systems(Update, (render_ui, movement, camera_follow, player_regen))
.run(); .run();
} }
// Bevy engine setup // Bevy engine setup
fn setup(mut commands: Commands, asset_server: Res<AssetServer>) { fn setup(mut commands: Commands, asset_server: Res<AssetServer>) {
commands.spawn(SpriteBundle {
texture: asset_server.load("player/player-4x.png"),
transform: Transform {
scale: Vec3::splat(0.2),
..default()
},
..default()
});
// Spawn the 2D camera
commands.spawn(Camera2dBundle { commands.spawn(Camera2dBundle {
camera: Camera { camera: Camera {
hdr: true, hdr: true,
@ -69,34 +79,26 @@ fn setup(mut commands: Commands, asset_server: Res<AssetServer>) {
tonemapping: Tonemapping::TonyMcMapface, tonemapping: Tonemapping::TonyMcMapface,
..default() ..default()
}); });
commands.spawn(
SpriteBundle { // Spawn the player
commands
.spawn(SpriteBundle {
texture: asset_server.load("player/player-4x.png"), texture: asset_server.load("player/player-4x.png"),
transform: Transform { transform: Transform {
scale: Vec3::splat(0.2), scale: Vec3::splat(0.2),
..default() ..default()
}, },
..default() ..default()
}); })
commands.spawn(( .insert(Player {
SpriteBundle {
texture: asset_server.load("player/player-4x.png"),
transform: Transform {
scale: Vec3::splat(0.2),
..default()
},
..default()
},
Player {
movement_speed: 512., movement_speed: 512.,
rotation_speed: f32::to_radians(360.), rotation_speed: f32::to_radians(360.),
health: 10., health: 1.,
health_max: 10., health_max: 10.,
stamina: 10., stamina: 1.,
stamina_max: 10., stamina_max: 10.,
defence: 40., defence: 40.,
}, });
));
} }

View file

@ -18,13 +18,25 @@ pub struct Player {
pub fn movement( pub fn movement(
time: Res<Time>, time: Res<Time>,
keys: Res<Input<KeyCode>>, keys: Res<Input<KeyCode>>,
mut player: Query<(&Player, &mut Transform)>, mut player_query: Query<(&mut Player, &mut Transform), With<Player>>,
) { ) {
let (player, mut transform) = player.single_mut(); let (mut player, mut transform) = player_query.single_mut();
let mut rotation_factor = 0.; let mut rotation_factor = 0.;
let mut movement_factor = 0.; let mut movement_factor = 0.;
let mut blink_factor = 0.;
let mut lock: bool = false;
if keys.pressed(KeyCode::Space) && lock == false {
lock = true;
movement_factor = 5.;
if player.stamina > 0. {
player.stamina -= 0.05;
}
if player.stamina < 0. {
player.stamina = 0.;
}
}
if keys.pressed(KeyCode::W) { if keys.pressed(KeyCode::W) {
movement_factor += 1.; movement_factor += 1.;
@ -38,9 +50,8 @@ pub fn movement(
rotation_factor -= 1.; rotation_factor -= 1.;
} }
if keys.pressed(KeyCode::Space) { // Initialise the movement distance variable (to bring it into scope)
blink_factor += 4.; let movement_distance: f32;
}
if keys.pressed(KeyCode::Up) { if keys.pressed(KeyCode::Up) {
transform.rotation = Quat::from_rotation_z((0_f32).to_radians()); transform.rotation = Quat::from_rotation_z((0_f32).to_radians());
@ -62,15 +73,12 @@ pub fn movement(
// Get the player's *forward* vector // Get the player's *forward* vector
let movement_direction = transform.rotation * Vec3::Y; let movement_direction = transform.rotation * Vec3::Y;
// Initialise the movement distance variable (to bring it into scope) if lock != true {
let movement_distance: f32;
if blink_factor == 0. {
movement_distance = movement_factor * player.movement_speed * time.delta_seconds(); movement_distance = movement_factor * player.movement_speed * time.delta_seconds();
// Change the player rotation around the Z-axis only if not blinking // Change the player rotation around the Z-axis only if not blinking
transform.rotate_z(rotation_factor * player.rotation_speed * time.delta_seconds()); transform.rotate_z(rotation_factor * player.rotation_speed * time.delta_seconds());
} else { } else {
movement_distance = blink_factor * player.movement_speed * 0.01; movement_distance = player.stamina * movement_factor * player.movement_speed * time.delta_seconds();
} }
// Update the player translation with the translation // Update the player translation with the translation
@ -90,3 +98,15 @@ pub fn camera_follow(
camera_transform.translation.y = pos.y; camera_transform.translation.y = pos.y;
} }
} }
pub fn player_regen(mut player_query: Query<&mut Player, With<Player>>, time: Res<Time>) {
let mut player = player_query.single_mut();
if player.stamina < 1. {
if player.stamina < 0. {
player.stamina = 0.;
player.stamina += 0.1 * time.delta_seconds();
} else {
player.stamina += 0.1 * time.delta_seconds();
}
}
}

View file

@ -39,10 +39,10 @@ pub fn render_ui(
mut windows: Query<&mut Window>, mut windows: Query<&mut Window>,
mut ui_state: ResMut<UiState>, mut ui_state: ResMut<UiState>,
mut open_windows: ResMut<OpenWindows>, mut open_windows: ResMut<OpenWindows>,
mut query: Query<&Player>, mut player_query: Query<&mut Player, With<Player>>,
) { ) {
// Query the player information and put it into scope // Query the player information and put it into scope
let player = query.single_mut(); let player = player_query.single_mut();
let window = windows.single_mut(); let window = windows.single_mut();
let window_width = window.resolution.width(); let window_width = window.resolution.width();
@ -101,6 +101,7 @@ pub fn render_ui(
ui.add_space(window_height / 22.); ui.add_space(window_height / 22.);
}); });
}); });
egui::CentralPanel::default() egui::CentralPanel::default()
.frame(egui::containers::Frame { .frame(egui::containers::Frame {
fill: egui::Color32::TRANSPARENT, fill: egui::Color32::TRANSPARENT,
@ -111,20 +112,28 @@ pub fn render_ui(
ui.visuals_mut().menu_rounding = egui::Rounding::ZERO; ui.visuals_mut().menu_rounding = egui::Rounding::ZERO;
ui.visuals_mut().selection.bg_fill = purple; ui.visuals_mut().selection.bg_fill = purple;
let health = // Show player stats
egui::widgets::ProgressBar::new(player.health).desired_width(window_width / 10.);
let stamina =
egui::widgets::ProgressBar::new(player.stamina).desired_width(window_width / 10.);
egui::Grid::new("Stats") egui::Grid::new("Stats")
.spacing(egui::Vec2::new(20., 10.)) .spacing(egui::Vec2::new(20., 10.))
.show(ui, |ui| { .show(ui, |ui| {
let health_bar = egui::widgets::ProgressBar::new(player.health)
.desired_width(window_width / 10.);
let mut stamina_bar = egui::widgets::ProgressBar::new(player.stamina)
.desired_width(window_width / 10.);
// Show the stamina bar to be empty if the player has no stamina
if player.stamina <= 0. {
stamina_bar =
stamina_bar.fill(egui::Color32::from_rgba_unmultiplied(0, 0, 0, 0));
};
// Show the progress bars!
ui.label(egui::RichText::new("Health").color(purple)); ui.label(egui::RichText::new("Health").color(purple));
ui.add(health); ui.add(health_bar);
ui.end_row(); ui.end_row();
ui.label(egui::RichText::new("Stamina").color(purple)); ui.label(egui::RichText::new("Stamina").color(purple));
ui.add(stamina); ui.add(stamina_bar);
ui.end_row(); ui.end_row();
}); });
}); });