X-Git-Url: http://dolda2000.com/gitweb/?a=blobdiff_plain;f=src%2Fapp.rs;h=c8f8665cb63b759c174df73ac214474e197868ba;hb=95e3e10de390930a0f26317dae544f4a2c1bda2e;hp=746f98db7abd6befe4cff45aa577f01eeb77c81a;hpb=a4088bfb5219aeb929cdfc0f874d7bb95b1031cd;p=kaka%2Frust-sdl-test.git diff --git a/src/app.rs b/src/app.rs index 746f98d..c8f8665 100644 --- a/src/app.rs +++ b/src/app.rs @@ -1,16 +1,29 @@ +use rand::Rng; +use sdl2::event::Event; use sdl2::EventPump; +use sdl2::keyboard::Keycode; use sdl2::pixels::Color; use sdl2::render::BlendMode; use sdl2::render::Canvas; use sdl2::video::Window; use {SCREEN_HEIGHT, SCREEN_WIDTH}; +use boll::*; +use common::Point2D; use sprites::SpriteManager; +use NS_PER_FRAME; + +macro_rules! point { // because I don't know how to import it from common.rs ... + ( $x:expr, $y:expr ) => { Point2D { x:$x, y:$y } }; +} + +pub type Nanoseconds = u64; pub struct App { pub canvas: Canvas, pub event_pump: EventPump, pub sprites: SpriteManager, + pub state: Box, } impl App { @@ -34,6 +47,7 @@ impl App { canvas, event_pump, sprites, + state: Box::new(ActiveState::new()), } } @@ -43,3 +57,84 @@ impl App { } } } + +pub trait AppState { + fn update(&mut self, dt: Nanoseconds); + fn render(&self, canvas: &mut Canvas); + fn leave(&self); + fn on_event(&mut self, event: Event); +} + +type Bollar = Vec>; + +pub struct ActiveState { + bolls: Bollar, + boll_size: u32, +} + +impl ActiveState { + fn new() -> ActiveState { + ActiveState { + bolls: Bollar::new(), + boll_size: 1, + } + } + + fn change_boll_count(&mut self, delta: i32) { + if delta > 0 { + for _i in 0..delta { + self.add_boll(); + } + } else if delta < 0 { + for _i in 0..delta { + self.bolls.pop(); + } + } + } + + fn add_boll(&mut self) { + let mut rng = rand::thread_rng(); + self.bolls.push(Box::new(SquareBoll { + pos: point!(rng.gen_range(0, SCREEN_WIDTH) as f64, rng.gen_range(0, SCREEN_HEIGHT) as f64), + vel: point!(rng.gen_range(-2.0, 2.0), rng.gen_range(-2.0, 2.0)), + })); + } +} + +impl AppState for ActiveState { + fn update(&mut self, dt: Nanoseconds) { + for mut b in &mut self.bolls { + b.update(); + } + + match dt { + ns if ns < (NS_PER_FRAME - 90_0000) as u64 => { self.change_boll_count(100) } + ns if ns > (NS_PER_FRAME + 90_0000) as u64 => { self.change_boll_count(-100) } + _ => {} + } + } + + fn render(&self, canvas: &mut Canvas) { + for mut b in &self.bolls { + b.draw(canvas, self.boll_size); + } + } + + fn leave(&self) { + println!("number of bolls: {}", self.bolls.len()); + } + + fn on_event(&mut self, event: Event) { + match event { + Event::KeyDown { keycode: Some(Keycode::KpPlus), .. } => { self.boll_size = std::cmp::min(self.boll_size + 1, 32) } + Event::KeyDown { keycode: Some(Keycode::KpMinus), .. } => { self.boll_size = std::cmp::max(self.boll_size - 1, 1) } + Event::MouseMotion { x, y, .. } => { + self.bolls.push(Box::new(CircleBoll::new( + point!(x as f64, y as f64), + point!(0.0, 0.0), + ))) + } + _ => {} + } + } +}