support cutscene camera

This commit is contained in:
2025-03-13 23:50:39 +01:00
parent 7281a46521
commit f8207f69b3
6 changed files with 83 additions and 1 deletions

60
src/cutscene.rs Normal file
View File

@@ -0,0 +1,60 @@
use crate::{DebugVisuals, tb_entities::CutsceneCamera};
use bevy::prelude::*;
#[derive(Event, Debug)]
pub struct StartCutscene(pub String);
#[derive(Resource, Debug, Default)]
enum CutsceneState {
#[default]
None,
Playing {
timer: Timer,
},
}
pub fn plugin(app: &mut App) {
app.init_resource::<CutsceneState>();
app.add_systems(Update, update);
app.add_observer(on_start_cutscene);
}
fn on_start_cutscene(
trigger: Trigger<StartCutscene>,
cutscenes: Query<(&Transform, &CutsceneCamera), Without<Camera>>,
mut res: ResMut<DebugVisuals>,
mut cutscene_state: ResMut<CutsceneState>,
mut cam: Query<&mut Transform, With<Camera>>,
) {
let cutscene = trigger.event().0.clone();
let Some((t, _)) = cutscenes
.iter()
.find(|(_, cutscene_camera)| cutscene == cutscene_camera.name)
else {
return;
};
res.cam_follow = false;
*cam.single_mut() = *t;
*cutscene_state = CutsceneState::Playing {
timer: Timer::from_seconds(2.0, TimerMode::Once),
};
}
fn update(
mut res: ResMut<DebugVisuals>,
mut cutscene_state: ResMut<CutsceneState>,
time: Res<Time>,
) {
if let CutsceneState::Playing { timer, .. } = &mut *cutscene_state {
timer.tick(time.delta());
if timer.finished() {
res.cam_follow = true;
*cutscene_state = CutsceneState::None;
}
}
}