pub struct Sim {
pub world: World,
pub step: Duration,
pub time_scale: f32,
pub max_steps: u32,
/* private fields */
}Expand description
Fixed-step sim state. Game registers systems,
feeds wall time with step, reads world for the snapshot.
Fields§
§world: WorldEntity/component store. Game crates add their own components here.
step: DurationFixed step size. Default 60 Hz.
Each tick adds this to SimTime. Set before first step.
time_scale: f32Sim speed multiplier. Zero or negative pauses the sim; a non-finite value runs at normal speed.
max_steps: u32Max ticks per step call. Default 8.
Caps catch-up after hitches. Excess wall time is dropped.
Clamped to a minimum of 1 so the sim keeps moving.
Implementations§
Source§impl Sim
impl Sim
pub fn new(step: Duration) -> Self
Sourcepub fn with_default_step() -> Self
pub fn with_default_step() -> Self
60 Hz fixed-step sim.
Sourcepub fn add_system<M>(&mut self, system: impl IntoSystem<(), (), M>) -> &mut Self
pub fn add_system<M>(&mut self, system: impl IntoSystem<(), (), M>) -> &mut Self
Register a system into the per-step schedule.
Sourcepub fn add_chained_systems<M>(
&mut self,
systems: impl IntoScheduleConfigs<ScheduleSystem, M>,
) -> &mut Self
pub fn add_chained_systems<M>( &mut self, systems: impl IntoScheduleConfigs<ScheduleSystem, M>, ) -> &mut Self
Register systems with a fixed execution order.
Use one (a, b, c).chain() tuple for pipelines that need order.
Sourcepub fn add_state<S: States>(&mut self, initial: S) -> &mut Self
pub fn add_state<S: States>(&mut self, initial: S) -> &mut Self
Register a state set with its initial value.
Call once per state type, before on_enter/on_exit/on_transition.
Transitions are applied at the head of each step, before the main
schedule, so gameplay never observes a half-switched state.
Sourcepub fn on_enter<S, M>(
&mut self,
state: S,
systems: impl IntoScheduleConfigs<ScheduleSystem, M>,
) -> &mut Selfwhere
S: States,
pub fn on_enter<S, M>(
&mut self,
state: S,
systems: impl IntoScheduleConfigs<ScheduleSystem, M>,
) -> &mut Selfwhere
S: States,
Systems that run when state is entered.
Panics if add_state was not called for this state set first.
Sourcepub fn on_exit<S, M>(
&mut self,
state: S,
systems: impl IntoScheduleConfigs<ScheduleSystem, M>,
) -> &mut Selfwhere
S: States,
pub fn on_exit<S, M>(
&mut self,
state: S,
systems: impl IntoScheduleConfigs<ScheduleSystem, M>,
) -> &mut Selfwhere
S: States,
Systems that run when state is exited.
Sourcepub fn on_transition<S, M>(
&mut self,
exited: S,
entered: S,
systems: impl IntoScheduleConfigs<ScheduleSystem, M>,
) -> &mut Selfwhere
S: States,
pub fn on_transition<S, M>(
&mut self,
exited: S,
entered: S,
systems: impl IntoScheduleConfigs<ScheduleSystem, M>,
) -> &mut Selfwhere
S: States,
Systems that run on the exited -> entered edge.
Sourcepub fn set_state<S: States>(&mut self, next: S) -> &mut Self
pub fn set_state<S: States>(&mut self, next: S) -> &mut Self
Request a state change, equivalent to writing NextState<S> from a
system. Panics if the state set was not registered.
Sourcepub fn step(&mut self, dt: Duration) -> u32
pub fn step(&mut self, dt: Duration) -> u32
Advance by dt wall time. Returns ticks run.
Small dt banks for later. Large dt runs up to max_steps
ticks, then drops leftover whole steps. Example:
let steps = sim.step(frame_dt);pub fn step_with( &mut self, dt: Duration, after_tick: impl FnMut(&mut World), ) -> u32
Sourcepub fn alpha(&self) -> f32
pub fn alpha(&self) -> f32
Blend factor accumulator / step, clamped to 0..1.
Zero step returns 0.0. For render blending between snapshots: keep
the previous snapshot and lerp toward the current one by this alpha
(NT motion at 30 Hz sim on 144 Hz display needs it; without it every
fast mover judders on 4-5 identical frames then jumps).
Auto Trait Implementations§
impl !Freeze for Sim
impl !RefUnwindSafe for Sim
impl !UnwindSafe for Sim
impl Send for Sim
impl Sync for Sim
impl Unpin for Sim
impl UnsafeUnpin for Sim
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
impl<T> ConditionalSend for Twhere
T: Send,
Source§impl<T> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
Source§fn into_any(self: Box<T>) -> Box<dyn Any>
fn into_any(self: Box<T>) -> Box<dyn Any>
Box<dyn Trait> (where Trait: Downcast) to Box<dyn Any>, which can then be
downcast into Box<dyn ConcreteType> where ConcreteType implements Trait.Source§fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
Rc<Trait> (where Trait: Downcast) to Rc<Any>, which can then be further
downcast into Rc<ConcreteType> where ConcreteType implements Trait.Source§fn as_any(&self) -> &(dyn Any + 'static)
fn as_any(&self) -> &(dyn Any + 'static)
&Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &Any’s vtable from &Trait’s.Source§fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
&mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &mut Any’s vtable from &mut Trait’s.