feat: ui

This commit is contained in:
Ahmet Kaan Gümüş 2025-02-16 03:35:13 +03:00
parent cca4b205f5
commit 2b0edc9c50
5 changed files with 157 additions and 42 deletions

View file

@ -2,29 +2,34 @@ use bevy::{core_pipeline::bloom::Bloom, prelude::*};
use crate::{player::Player, CAMERA_DECAY_RATE}; use crate::{player::Player, CAMERA_DECAY_RATE};
pub fn setup_camera(mut commands: Commands) { #[derive(Debug, Component)]
commands.spawn(( pub struct UserCamera;
Camera2d,
Camera { impl UserCamera {
hdr: true, pub fn setup(mut commands: Commands) {
..default() commands.spawn((
}, Camera2d,
Bloom::NATURAL, Camera {
)); hdr: true,
} ..default()
},
pub fn update_camera( Bloom::NATURAL,
mut camera: Query<&mut Transform, (With<Camera2d>, Without<Player>)>, ));
player: Query<&Transform, (With<Player>, Without<Camera2d>)>, }
time: Res<Time>,
) { pub fn update(
let mut camera = camera.get_single_mut().unwrap(); mut camera: Query<&mut Transform, (With<Camera2d>, Without<Player>)>,
let player = player.get_single().unwrap(); player: Query<&Transform, (With<Player>, Without<Camera2d>)>,
time: Res<Time>,
let Vec3 { x, y, .. } = player.translation; ) {
let direction = Vec3::new(x, y, camera.translation.z); let mut camera = camera.get_single_mut().unwrap();
let player = player.get_single().unwrap();
camera
.translation let Vec3 { x, y, .. } = player.translation;
.smooth_nudge(&direction, CAMERA_DECAY_RATE, time.delta_secs()); let direction = Vec3::new(x, y, camera.translation.z);
camera
.translation
.smooth_nudge(&direction, CAMERA_DECAY_RATE, time.delta_secs());
}
} }

View file

@ -1,13 +1,16 @@
use bevy::{ use bevy::{
app::{App, Startup, Update}, app::{App, Startup, Update},
diagnostic::FrameTimeDiagnosticsPlugin,
DefaultPlugins, DefaultPlugins,
}; };
use camera::{setup_camera, update_camera}; use camera::UserCamera;
use player::Player; use player::Player;
use ui::{FPSText, FishCounterText, KeybindingsText};
use water::Water; use water::Water;
mod camera; mod camera;
mod player; mod player;
mod ui;
mod water; mod water;
pub const CHARACTER_SPEED: f32 = 300.0; pub const CHARACTER_SPEED: f32 = 300.0;
@ -17,10 +20,27 @@ pub const FISHING_AREA_RADIUS: f32 = 100.0;
pub fn start_game() { pub fn start_game() {
App::new() App::new()
.add_plugins(DefaultPlugins) .add_plugins(DefaultPlugins)
.add_plugins(FrameTimeDiagnosticsPlugin)
.add_systems( .add_systems(
Startup, Startup,
(setup_camera, Water::setup_water, Player::setup_player), (
FPSText::setup,
UserCamera::setup,
Water::setup,
Player::setup,
FishCounterText::setup,
KeybindingsText::setup,
),
)
.add_systems(
Update,
(
FPSText::update,
UserCamera::update,
Player::r#move,
Water::fishing,
FishCounterText::update,
),
) )
.add_systems(Update, (update_camera, Player::move_player, Water::fishing))
.run(); .run();
} }

View file

@ -3,37 +3,39 @@ use bevy::prelude::*;
use crate::CHARACTER_SPEED; use crate::CHARACTER_SPEED;
#[derive(Debug, Component)] #[derive(Debug, Component)]
pub struct Player; pub struct Player {
pub fish_count: usize,
}
impl Player { impl Player {
pub fn setup_player(mut commands: Commands, asset_server: Res<AssetServer>) { pub fn setup(mut commands: Commands, asset_server: Res<AssetServer>) {
let image = asset_server.load::<Image>("character.png"); let image = asset_server.load::<Image>("character.png");
commands.spawn(( commands.spawn((
Sprite::from_image(image), Sprite::from_image(image),
Transform::from_xyz(0.0, 0.0, 0.0), Transform::from_xyz(0.0, 0.0, 0.0),
Player, Player { fish_count: 0 },
)); ));
} }
pub fn move_player( pub fn r#move(
time: Res<Time>, time: Res<Time>,
mut character_transform: Query<&mut Transform, With<Player>>, mut player_query: Query<&mut Transform, With<Player>>,
keyboard_input: Res<ButtonInput<KeyCode>>, keyboard_input: Res<ButtonInput<KeyCode>>,
) { ) {
let mut character_transform = character_transform.get_single_mut().unwrap(); let mut player = player_query.get_single_mut().unwrap();
let translation = CHARACTER_SPEED * time.delta_secs(); let translation = CHARACTER_SPEED * time.delta_secs();
if keyboard_input.pressed(KeyCode::KeyW) { if keyboard_input.pressed(KeyCode::KeyW) {
character_transform.translation.y += translation; player.translation.y += translation;
} }
if keyboard_input.pressed(KeyCode::KeyS) { if keyboard_input.pressed(KeyCode::KeyS) {
character_transform.translation.y -= translation; player.translation.y -= translation;
} }
if keyboard_input.pressed(KeyCode::KeyA) { if keyboard_input.pressed(KeyCode::KeyA) {
character_transform.translation.x -= translation; player.translation.x -= translation;
} }
if keyboard_input.pressed(KeyCode::KeyD) { if keyboard_input.pressed(KeyCode::KeyD) {
character_transform.translation.x += translation; player.translation.x += translation;
} }
} }
} }

86
src/ui.rs Normal file
View file

@ -0,0 +1,86 @@
use bevy::{
diagnostic::{DiagnosticsStore, FrameTimeDiagnosticsPlugin},
prelude::*,
};
use crate::player::Player;
#[derive(Debug, Component)]
pub struct FPSText;
impl FPSText {
pub fn setup(mut commands: Commands) {
commands.spawn((
Text::new("FPS Uninitialized"),
TextLayout::new_with_justify(JustifyText::Center),
Node {
position_type: PositionType::Absolute,
..default()
},
FPSText,
));
}
pub fn update(
diagnostics: Res<DiagnosticsStore>,
mut fps_text_query: Query<&mut Text, With<FPSText>>,
) {
if let Some(fps) = diagnostics.get(&FrameTimeDiagnosticsPlugin::FPS) {
if let Some(fps) = fps.smoothed() {
if let Ok(mut fps_text) = fps_text_query.get_single_mut() {
*fps_text = format!("FPS = {:.2}", fps).into();
}
}
}
}
}
#[derive(Debug, Component)]
pub struct FishCounterText;
impl FishCounterText {
pub fn setup(mut commands: Commands) {
commands.spawn((
Text2d::new("Fish Count = 0"),
TextLayout::new_with_justify(JustifyText::Center),
Transform::from_xyz(0.0, 0.0, 1.0),
FishCounterText,
));
}
pub fn update(
mut fish_counter_text_transform_query: Query<
&mut Transform,
(With<FishCounterText>, Without<Player>),
>,
mut fish_counter_text_query: Query<&mut Text2d, With<FishCounterText>>,
player_transform_query: Query<&Transform, (With<Player>, Without<FishCounterText>)>,
player_query: Query<&Player, With<Player>>,
) {
let mut fish_counter_text_transform =
fish_counter_text_transform_query.get_single_mut().unwrap();
let mut fish_counter_text = fish_counter_text_query.get_single_mut().unwrap();
let player = player_query.get_single().unwrap();
let player_position = player_transform_query.get_single().unwrap();
let mut new_fish_counter_text_position = player_position.translation.truncate().extend(1.0);
new_fish_counter_text_position.x += 50.0;
new_fish_counter_text_position.y += 50.0;
fish_counter_text_transform.translation = new_fish_counter_text_position;
*fish_counter_text = format!("Fish Count = {}", player.fish_count).into();
}
}
#[derive(Debug, Component)]
pub struct KeybindingsText;
impl KeybindingsText {
pub fn setup(mut commands: Commands) {
commands.spawn((
Text2d::new("Press E When You Are Near To Lake"),
TextLayout::new_with_justify(JustifyText::Center),
Transform::from_xyz(0.0, -300.0, 1.0),
));
}
}

View file

@ -6,7 +6,7 @@ use crate::{player::Player, FISHING_AREA_RADIUS};
pub struct Water; pub struct Water;
impl Water { impl Water {
pub fn setup_water(mut commands: Commands, asset_server: Res<AssetServer>) { pub fn setup(mut commands: Commands, asset_server: Res<AssetServer>) {
let image = asset_server.load::<Image>("water.png"); let image = asset_server.load::<Image>("water.png");
let sprite = Sprite::from_image(image); let sprite = Sprite::from_image(image);
commands.spawn((sprite.clone(), Transform::from_xyz(500.0, 0.0, -1.0), Water)); commands.spawn((sprite.clone(), Transform::from_xyz(500.0, 0.0, -1.0), Water));
@ -14,11 +14,13 @@ impl Water {
} }
pub fn fishing( pub fn fishing(
player_query: Query<&Transform, With<Player>>, player_transform_query: Query<&Transform, With<Player>>,
mut player_query: Query<&mut Player, With<Player>>,
water_query: Query<&Transform, With<Water>>, water_query: Query<&Transform, With<Water>>,
keyboard: Res<ButtonInput<KeyCode>>, keyboard: Res<ButtonInput<KeyCode>>,
) { ) {
let player_transform = player_query.get_single().unwrap(); let player_transform = player_transform_query.get_single().unwrap();
let mut player = player_query.get_single_mut().unwrap();
for water_query in &water_query { for water_query in &water_query {
let distance = player_transform let distance = player_transform
@ -27,7 +29,7 @@ impl Water {
if distance < FISHING_AREA_RADIUS { if distance < FISHING_AREA_RADIUS {
if keyboard.just_pressed(KeyCode::KeyE) { if keyboard.just_pressed(KeyCode::KeyE) {
println!("You caught a fish"); player.fish_count += 1;
} }
} }
} }