1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
use crate::{ Error, Result, lifecycle::{Event, Window}, }; /// The structure responsible for managing the game loop state pub trait State: 'static { /// Create the state given the window and canvas fn new() -> Result<Self> where Self: Sized; /// Tick the State forward one frame /// /// Will happen at a fixed rate of 60 ticks per second under ideal conditions. Under non-ideal conditions, /// the game loop will do its best to still call the update at about 60 TPS. /// /// By default it does nothing fn update(&mut self, _window: &mut Window) -> Result<()> { Ok(()) } /// Process an incoming event /// /// By default it does nothing fn event(&mut self, _event: &Event, _window: &mut Window) -> Result<()> { Ok(()) } /// Draw the state to the screen /// /// Will happen as often as possible, only limited by vysnc and the configured draw rate. /// /// By default it draws a black screen fn draw(&mut self, window: &mut Window) -> Result<()> { window.clear(crate::graphics::Color::BLACK)?; Ok(()) } /// Log and report an error in some way /// /// There's no way to *recover from* the error at this stage, because error handling should take /// place at the error site. However, on the web especially, logging errors can be difficult, /// so this provides a way to log other than a panic. fn handle_error(error: Error) { #[cfg(target_arch = "wasm32")] { let message = format!("Unhandled error: {:?}", error); console!(error, message); } panic!("Unhandled error: {:?}", error); } }