Added a basic gamestate with a controlled mario
[kaka/rust-sdl-test.git] / src / core / app.rs
index 8c07417..62d7507 100644 (file)
@@ -1,5 +1,5 @@
 use boll::*;
-use common::{Point2D, Rect};
+use common::{Nanoseconds, Point2D, Rect};
 use core::controller::ControllerManager;
 use point; // defined in common, but loaded from main...
 use rand::Rng;
@@ -15,8 +15,6 @@ use sprites::SpriteManager;
 use std::f32::consts::PI;
 use time::PreciseTime;
 
-pub type Nanoseconds = u64;
-
 const FPS: u32 = 60;
 const NS_PER_FRAME: u32 = 1_000_000_000 / FPS;
 
@@ -47,7 +45,7 @@ impl AppBuilder {
         let context = sdl2::init().unwrap();
         sdl2::image::init(sdl2::image::InitFlag::PNG)?;
         let video = context.video()?;
-        self.print_video_display_modes(&video);
+        //self.print_video_display_modes(&video);
 
         let window = video
             .window(
@@ -86,6 +84,7 @@ impl AppBuilder {
         })
     }
 
+    #[allow(dead_code)]
     fn print_video_display_modes(&self, video: &VideoSubsystem) {
         println!("video subsystem: {:?}", video);
         println!("current_video_driver: {:?}", video.current_video_driver());
@@ -131,7 +130,7 @@ pub struct App {
     event_pump: EventPump,
     sprites: SpriteManager,
     state: Box<dyn AppState>,
-    ctrl_man: ControllerManager,
+    pub ctrl_man: ControllerManager,
 }
 
 impl App {
@@ -147,10 +146,12 @@ impl App {
     }
 
     pub fn start(&mut self) {
-        let mut frame_count: u64 = 0;
-        let mut fps_time = PreciseTime::now();
+        // let mut frame_count: u64 = 0;
+        // let mut fps_time = PreciseTime::now();
         let mut last_time = PreciseTime::now();
 
+       self.state.enter(&mut self.ctrl_man);
+
         'running: loop {
            if let Err(_) = self.handle_events() {
                break 'running;
@@ -163,14 +164,14 @@ impl App {
 
            self.render();
 
-            frame_count += 1;
-            if frame_count == FPS as u64 {
-                let duration = fps_time.to(PreciseTime::now()).num_nanoseconds().unwrap() as f64
-                    / 1_000_000_000.0;
-                // println!("fps: {}", frame_count as f64 / duration);
-                frame_count = 0;
-                fps_time = PreciseTime::now();
-            }
+            // frame_count += 1;
+            // if frame_count == FPS as u64 {
+            //     let duration = fps_time.to(PreciseTime::now()).num_nanoseconds().unwrap() as f64
+            //         / 1_000_000_000.0;
+            //     // println!("fps: {}", frame_count as f64 / duration);
+            //     frame_count = 0;
+            //     fps_time = PreciseTime::now();
+            // }
         }
 
         self.state.leave();
@@ -180,10 +181,6 @@ impl App {
         for event in self.event_pump.poll_iter() {
            self.ctrl_man.handle_event(&event);
             match event {
-               Event::ControllerButtonDown { .. } => {
-                   let c = self.ctrl_man.controllers[0].clone();
-                   c.borrow().rumble(1.0, 300);
-               }
                 Event::Quit { .. }
                 | Event::KeyDown {
                     keycode: Some(Keycode::Escape),
@@ -246,7 +243,7 @@ impl App {
                 } => {
                     println!("window focus lost")
                 }
-                _ => self.state.on_event(event),
+                _ => self.state.handle_event(event),
             }
         }
        Ok(())
@@ -261,10 +258,11 @@ impl App {
 }
 
 pub trait AppState {
+    fn enter(&mut self, ctrl_man: &mut ControllerManager);
+    fn leave(&mut self);
     fn update(&mut self, dt: Nanoseconds);
     fn render(&mut self, canvas: &mut Canvas<Window>, sprites: &mut SpriteManager);
-    fn leave(&self);
-    fn on_event(&mut self, event: Event);
+    fn handle_event(&mut self, event: Event);
 }
 
 type Bollar = Vec<Box<dyn Boll>>;
@@ -313,6 +311,8 @@ impl ActiveState {
 }
 
 impl AppState for ActiveState {
+    fn enter(&mut self, ctrl_man: &mut ControllerManager) {}
+
     fn update(&mut self, dt: Nanoseconds) {
         for b in &mut self.bolls {
             b.update();
@@ -430,11 +430,11 @@ impl AppState for ActiveState {
         }
     }
 
-    fn leave(&self) {
+    fn leave(&mut self) {
         println!("number of bolls: {}", self.bolls.len());
     }
 
-    fn on_event(&mut self, event: Event) {
+    fn handle_event(&mut self, event: Event) {
         match event {
             Event::KeyDown {
                 keycode: Some(Keycode::KpPlus),