feat: ✨ auto follow camera
This commit is contained in:
parent
dd0d1e8643
commit
c7e17a7c1d
6 changed files with 111 additions and 53 deletions
BIN
assets/water.png
Normal file
BIN
assets/water.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 407 B |
30
src/camera.rs
Normal file
30
src/camera.rs
Normal 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
25
src/lib.rs
Normal 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();
|
||||||
|
}
|
55
src/main.rs
55
src/main.rs
|
@ -1,57 +1,6 @@
|
||||||
use bevy::{
|
use fisher::start_game;
|
||||||
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 {}
|
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
println!("Hello, world!");
|
println!("Hello, world!");
|
||||||
|
start_game();
|
||||||
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;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
39
src/player.rs
Normal file
39
src/player.rs
Normal 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
15
src/water.rs
Normal 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,
|
||||||
|
));
|
||||||
|
}
|
||||||
|
}
|
Loading…
Add table
Add a link
Reference in a new issue