use instant::Instant; use lyra_ecs::{Component, World}; use lyra_reflect::Reflect; use crate::{plugin::Plugin, game::GameStages}; #[derive(Clone, Copy, Component, Default, Reflect)] pub struct DeltaTime(f32, #[reflect(skip)] Option); impl From for DeltaTime { fn from(value: f32) -> Self { DeltaTime(value, None) } } impl std::ops::Deref for DeltaTime { type Target = f32; fn deref(&self) -> &Self::Target { &self.0 } } impl std::ops::DerefMut for DeltaTime { fn deref_mut(&mut self) -> &mut Self::Target { &mut self.0 } } /// A system that updates the [`DeltaTime``] resource. /// /// The resource is updated in the [`GameStages::First`] stage. pub fn delta_time_system(world: &mut World) -> anyhow::Result<()> { let now = Instant::now(); let mut delta = world.get_resource_mut::(); delta.0 = delta.1.unwrap_or(now).elapsed().as_secs_f32(); delta.1 = Some(now); Ok(()) } pub struct DeltaTimePlugin; impl Plugin for DeltaTimePlugin { fn setup(&self, game: &mut crate::game::Game) { game.world_mut().add_resource(DeltaTime(0.0, None)); game.add_system_to_stage(GameStages::First, "delta_time", delta_time_system, &[]); } }