pub trait MainLoopRoot {
// Required methods
fn get_fps(&self) -> f32;
fn frame(&mut self);
fn render_frame(&mut self);
// Provided methods
fn sleep_and_get_input_data(&self, fps: f32, elapsed: Duration) -> bool { ... }
fn main_loop(&mut self) { ... }
}Expand description
This is an alternative way to handle the gameloop, separate from fps_gameloop!. It takes on a more object-oriented approach - here, everything related to the game is stored inside a single struct which implements MainLoopRoot.
Check out the game-loop-root.rs example, a version of quick-start.rs rewritten using MainLoopRoot
Required Methods§
Sourcefn get_fps(&self) -> f32
fn get_fps(&self) -> f32
Return the FPS at which the main loop should run. A constant like 60.0 or 30.0 is sufficient
Sourcefn frame(&mut self)
fn frame(&mut self)
This is where the main logic of your game should go - handling input, moving objects, handling collisions, etc.
Sourcefn render_frame(&mut self)
fn render_frame(&mut self)
All rendering code (drawing, printing to the screen, etc.) should be called in here. If the bool value returned by MainLoopRoot::sleep_and_get_input_data() is true, this won’t run and nothing should be printed to the screen
§Example
Here’s an example of what a render_frame trait implementation might look like, assuming your root struct has a view: View property for your main view
// --inside impl MainLoopRoot for Game--
fn render_frame(&mut self) {
self.view.clear();
// Draw every enemy in a vector of `Enemies` (all of which would implement `CanDraw`)
for enemy in &self.enemies {
self.view.draw(enemy);
}
self.view.draw(&self.player);
self.view.display_render().unwrap();
}Provided Methods§
Sourcefn sleep_and_get_input_data(&self, fps: f32, elapsed: Duration) -> bool
fn sleep_and_get_input_data(&self, fps: f32, elapsed: Duration) -> bool
The function used to sleep for the appropriate amount based on the value returned by get_fps. Uses gameloop::sleep_fps by default and will return None for the InputDataType. If the return value is true, render_frame will not be called on the next frame
Sourcefn main_loop(&mut self)
fn main_loop(&mut self)
The main loop function of the main loop root. This shouldn’t be overriden. See the MainLoopRoot documentation for more info
impl MainLoopRoot for Game {
fn get_fps(&self) -> f32 { 30.0 }
fn frame(&mut self) {
// --snip--
}
fn render_frame(&mut self) {
// --snip--
}
}
let mut game = Game::new(); // `Game` implements `MainLoopRoot`. Its `new` method sets up all the game objects
game.main_loop();