diff --git a/snake-game/examples/time.rs b/snake-game/examples/time.rs new file mode 100644 index 0000000..c9f21d9 --- /dev/null +++ b/snake-game/examples/time.rs @@ -0,0 +1,121 @@ +//! An example that illustrates how Time is handled in ECS. + +use bevy::{app::AppExit, prelude::*}; + +use std::{ + io::{self, BufRead}, + time::Duration, +}; + +fn banner() { + println!("This example is meant to intuitively demonstrate how Time works in Bevy."); + println!(); + println!("Time will be printed in three different schedules in the app:"); + println!("- PreUpdate: real time is printed"); + println!("- FixedUpdate: fixed time step time is printed, may be run zero or multiple times"); + println!("- Update: virtual game time is printed"); + println!(); + println!("Max delta time is set to 5 seconds. Fixed timestep is set to 1 second."); + println!(); +} + +fn help() { + println!("The app reads commands line-by-line from standard input."); + println!(); + println!("Commands:"); + println!(" empty line: Run app.update() once on the Bevy App"); + println!(" q: Quit the app."); + println!(" f: Set speed to fast, 2x"); + println!(" n: Set speed to normal, 1x"); + println!(" s: Set speed to slow, 0.5x"); + println!(" p: Pause"); + println!(" u: Unpause"); +} + +fn runner(mut app: App) -> AppExit { + banner(); + help(); + let stdin = io::stdin(); + for line in stdin.lock().lines() { + if let Err(err) = line { + println!("read err: {err:#}"); + break; + } + match line.unwrap().as_str() { + "" => { + app.update(); + } + "f" => { + println!("FAST: setting relative speed to 2x"); + app.world_mut() + .resource_mut::>() + .set_relative_speed(2.0); + } + "n" => { + println!("NORMAL: setting relative speed to 1x"); + app.world_mut() + .resource_mut::>() + .set_relative_speed(1.0); + } + "s" => { + println!("SLOW: setting relative speed to 0.5x"); + app.world_mut() + .resource_mut::>() + .set_relative_speed(0.5); + } + "p" => { + println!("PAUSE: pausing virtual clock"); + app.world_mut().resource_mut::>().pause(); + } + "u" => { + println!("UNPAUSE: resuming virtual clock"); + app.world_mut().resource_mut::>().unpause(); + } + "q" => { + println!("QUITTING!"); + break; + } + _ => { + help(); + } + } + } + + AppExit::Success +} + +fn print_real_time(time: Res>) { + println!( + "PreUpdate: this is real time clock, delta is {:?} and elapsed is {:?}", + time.delta(), + time.elapsed() + ); +} + +fn print_fixed_time(time: Res