From e4e734c308b899df36d02071ac13f86abba5f7b5 Mon Sep 17 00:00:00 2001 From: Fabien JUIF Date: Fri, 24 Nov 2023 09:11:14 +0100 Subject: [PATCH 1/5] :sparkles: camera / look at --- camera/src/lib.rs | 108 ++++++++++++++++++++++++++++++++++++++++------ src/main.rs | 4 +- 2 files changed, 97 insertions(+), 15 deletions(-) diff --git a/camera/src/lib.rs b/camera/src/lib.rs index 4fc909d..ed2997f 100644 --- a/camera/src/lib.rs +++ b/camera/src/lib.rs @@ -1,13 +1,22 @@ use bevy::{ app::{PostStartup, Update}, - ecs::system::ResMut, + asset::Assets, + ecs::{ + bundle::Bundle, + component::Component, + system::{Commands, Res, ResMut}, + }, gizmos::{gizmos::Gizmos, GizmoConfig}, - math::Vec2, + math::{Vec2, Vec3}, prelude::{ - App, Bundle, Camera2dBundle, Component, Entity, Plugin, PostUpdate, Query, Transform, With, - Without, + default, App, Camera2dBundle, Entity, Plugin, PostUpdate, Query, Transform, With, Without, + }, + render::{ + color::Color, + mesh::{shape, Mesh}, }, - render::color::Color, + sprite::{ColorMaterial, MaterialMesh2dBundle}, + time::Time, }; #[derive(Component)] @@ -17,17 +26,28 @@ pub struct Target; pub struct Camera { target: Entity, // TODO: find a way to have multiple targets per camera, but also being able to have multi cameras (n-n) dead_zone: Vec2, + target_prev_translation: Vec3, + // look at this position, this is the player + velocity + factor + // it allow us to place the camera a bit ahead of time + look_at: Vec3, } impl Camera { pub fn new(target: Entity, dead_zone: Vec2) -> Self { - Self { target, dead_zone } + Self { + target, + dead_zone, + target_prev_translation: Vec3::ZERO, + look_at: Vec3::ZERO, + } } pub fn new_default(target: Entity) -> Self { Self { target, dead_zone: Vec2::new(30.0, 15.0), + target_prev_translation: Vec3::ZERO, + look_at: Vec3::ZERO, } } } @@ -64,10 +84,10 @@ impl Plugin for CameraPlugin { } fn center( - mut query_camera: Query<(&mut Transform, &Camera), Without>, + mut query_camera: Query<(&mut Transform, &mut Camera), Without>, query_targets: Query<(&Transform, Entity), With>, ) { - for (mut camera_transform, camera) in &mut query_camera { + for (mut camera_transform, mut camera) in &mut query_camera { for (target_transform, target_entity) in &query_targets { if camera.target != target_entity { continue; @@ -77,6 +97,8 @@ fn center( if camera.target == target_entity { camera_transform.translation.x = target_transform.translation.x; camera_transform.translation.y = target_transform.translation.y; + camera.target_prev_translation = target_transform.translation; + camera.look_at = target_transform.translation; break; } } @@ -84,15 +106,23 @@ fn center( } fn cameraman( - mut query_camera: Query<(&mut Transform, &Camera), Without>, + mut query_camera: Query<(&mut Transform, &mut Camera), Without>, query_targets: Query<(&Transform, Entity), With>, + time: Res