feat: auto follow camera

This commit is contained in:
Ahmet Kaan Gümüş 2025-02-16 00:29:53 +03:00
parent dd0d1e8643
commit c7e17a7c1d
6 changed files with 111 additions and 53 deletions

30
src/camera.rs Normal file
View file

@ -0,0 +1,30 @@
use bevy::{core_pipeline::bloom::Bloom, prelude::*};
use crate::{player::Player, CAMERA_DECAY_RATE};
pub fn setup_camera(mut commands: Commands) {
commands.spawn((
Camera2d,
Camera {
hdr: true,
..default()
},
Bloom::NATURAL,
));
}
pub fn update_camera(
mut camera: Query<&mut Transform, (With<Camera2d>, Without<Player>)>,
player: Query<&Transform, (With<Player>, Without<Camera2d>)>,
time: Res<Time>,
) {
let mut camera = camera.get_single_mut().unwrap();
let player = player.get_single().unwrap();
let Vec3 { x, y, .. } = player.translation;
let direction = Vec3::new(x, y, camera.translation.z);
camera
.translation
.smooth_nudge(&direction, CAMERA_DECAY_RATE, time.delta_secs());
}

25
src/lib.rs Normal file
View file

@ -0,0 +1,25 @@
use bevy::{
app::{App, Startup, Update},
DefaultPlugins,
};
use camera::{setup_camera, update_camera};
use player::Player;
use water::Water;
mod camera;
mod player;
mod water;
pub const CHARACTER_SPEED: f32 = 300.0;
pub const CAMERA_DECAY_RATE: f32 = 3.0;
pub fn start_game() {
App::new()
.add_plugins(DefaultPlugins)
.add_systems(
Startup,
(setup_camera, Water::setup_water, Player::setup_player),
)
.add_systems(Update, (update_camera, Player::move_player))
.run();
}

View file

@ -1,57 +1,6 @@
use bevy::{
app::{App, Startup, Update},
asset::AssetServer,
image::Image,
input::ButtonInput,
prelude::{Camera2d, Commands, Component, KeyCode, Query, Res, Transform, With},
sprite::Sprite,
time::Time,
DefaultPlugins,
};
const CHARACTER_SPEED: f32 = 300.0;
#[derive(Debug, Component)]
struct Player {}
use fisher::start_game;
fn main() {
println!("Hello, world!");
App::new()
.add_plugins(DefaultPlugins)
.add_systems(Startup, load_character)
.add_systems(Update, move_character)
.run();
}
fn load_character(mut commands: Commands, asset_server: Res<AssetServer>) {
commands.spawn(Camera2d::default());
let image = asset_server.load::<Image>("character.png");
commands.spawn((
Sprite::from_image(image),
Transform::from_xyz(0.0, 0.0, 0.0),
Player {},
));
}
fn move_character(
time: Res<Time>,
mut character_transform: Query<&mut Transform, With<Player>>,
keyboard_input: Res<ButtonInput<KeyCode>>,
) {
let mut character_transform = character_transform.get_single_mut().unwrap();
let translation = CHARACTER_SPEED * time.delta_secs();
if keyboard_input.pressed(KeyCode::KeyW) {
character_transform.translation.y += translation;
}
if keyboard_input.pressed(KeyCode::KeyS) {
character_transform.translation.y -= translation;
}
if keyboard_input.pressed(KeyCode::KeyA) {
character_transform.translation.x -= translation;
}
if keyboard_input.pressed(KeyCode::KeyD) {
character_transform.translation.x += translation;
}
start_game();
}

39
src/player.rs Normal file
View file

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

15
src/water.rs Normal file
View file

@ -0,0 +1,15 @@
use bevy::prelude::*;
#[derive(Debug, Component)]
pub struct Water;
impl Water {
pub fn setup_water(mut commands: Commands, asset_server: Res<AssetServer>) {
let image = asset_server.load::<Image>("water.png");
commands.spawn((
Sprite::from_image(image),
Transform::from_xyz(500.0, 0.0, 0.0),
Water,
));
}
}