X-Git-Url: http://dolda2000.com/gitweb/?a=blobdiff_plain;f=src%2Fcore%2Fapp.rs;h=99b24ac3a57785fea6e2427e26c930db7bbe002a;hb=6566d7e5467888e41b18dbaaa52d6a8636ce8e21;hp=8c07417181f2d1c79558e5c43b2729d5825bce9f;hpb=ca99d4d7fc9e8e2dde6c4174797196f5c5a4b7e3;p=kaka%2Frust-sdl-test.git diff --git a/src/core/app.rs b/src/core/app.rs index 8c07417..99b24ac 100644 --- a/src/core/app.rs +++ b/src/core/app.rs @@ -1,21 +1,17 @@ use boll::*; use common::{Point2D, Rect}; use core::controller::ControllerManager; +use core::render::Renderer; use point; // defined in common, but loaded from main... use rand::Rng; use sdl2::event::{Event, WindowEvent}; -use sdl2::gfx::primitives::DrawRenderer; use sdl2::keyboard::Keycode; -use sdl2::pixels::Color; use sdl2::rect::Rect as SDLRect; -use sdl2::render::{BlendMode, Canvas}; -use sdl2::video::{FullscreenType, SwapInterval, Window}; +use sdl2::video::SwapInterval; use sdl2::{EventPump, VideoSubsystem}; use sprites::SpriteManager; use std::f32::consts::PI; -use time::PreciseTime; - -pub type Nanoseconds = u64; +use time::{Duration, Instant, prelude::*}; const FPS: u32 = 60; const NS_PER_FRAME: u32 = 1_000_000_000 / FPS; @@ -47,7 +43,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( @@ -63,29 +59,25 @@ impl AppBuilder { .unwrap(); context.mouse().show_cursor(false); - let mut canvas = window.into_canvas().build().unwrap(); - canvas.set_blend_mode(BlendMode::Add); - canvas.set_draw_color(Color::RGB(0, 0, 0)); - canvas.clear(); - canvas.present(); + let canvas = window.into_canvas().build().unwrap(); + let sprites = SpriteManager::new(canvas.texture_creator()); + let screen = canvas.output_size().unwrap(); + let renderer = Renderer::new(canvas); video.gl_set_swap_interval(SwapInterval::VSync)?; let event_pump = context.event_pump()?; - let sprites = SpriteManager::new(canvas.texture_creator()); - let screen = canvas.output_size().unwrap(); - let ctrl = context.game_controller()?; - ctrl.set_event_state(true); Ok(App { - canvas, + renderer, event_pump, sprites, state: self.state.unwrap_or_else(|| Box::new(ActiveState::new(screen))), - ctrl_man: ControllerManager::new(ctrl, context.haptic()?), + ctrl_man: ControllerManager::new(context.joystick()?, context.haptic()?), }) } + #[allow(dead_code)] fn print_video_display_modes(&self, video: &VideoSubsystem) { println!("video subsystem: {:?}", video); println!("current_video_driver: {:?}", video.current_video_driver()); @@ -127,11 +119,11 @@ impl AppBuilder { } pub struct App { - canvas: Canvas, + renderer: Renderer, event_pump: EventPump, sprites: SpriteManager, state: Box, - ctrl_man: ControllerManager, + pub ctrl_man: ControllerManager, } impl App { @@ -147,30 +139,22 @@ impl App { } pub fn start(&mut self) { - let mut frame_count: u64 = 0; - let mut fps_time = PreciseTime::now(); - let mut last_time = PreciseTime::now(); + let mut last_time = Instant::now(); + + self.state.enter(&mut self.ctrl_man); 'running: loop { if let Err(_) = self.handle_events() { break 'running; } - let duration = - last_time.to(PreciseTime::now()).num_nanoseconds().unwrap() as Nanoseconds; - last_time = PreciseTime::now(); + let duration = Instant::now() - last_time; + last_time = Instant::now(); + + self.ctrl_man.update(duration); self.state.update(duration); 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(); - } } self.state.leave(); @@ -180,10 +164,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), @@ -195,14 +175,7 @@ impl App { keycode: Some(Keycode::F11), .. } => { - match self.canvas.window().fullscreen_state() { - FullscreenType::Off => self - .canvas - .window_mut() - .set_fullscreen(FullscreenType::Desktop), - _ => self.canvas.window_mut().set_fullscreen(FullscreenType::Off), - } - .unwrap(); + self.renderer.toggle_fullscreen(); } Event::Window { win_event: WindowEvent::Resized(x, y), @@ -246,25 +219,25 @@ impl App { } => { println!("window focus lost") } - _ => self.state.on_event(event), + _ => self.state.handle_event(event), } } Ok(()) } fn render(&mut self) { - self.canvas.set_draw_color(Color::RGB(0, 0, 0)); - self.canvas.clear(); - self.state.render(&mut self.canvas, &mut self.sprites); - self.canvas.present(); + self.renderer.clear(); + self.state.render(&mut self.renderer, &mut self.sprites); + self.renderer.present(); } } pub trait AppState { - fn update(&mut self, dt: Nanoseconds); - fn render(&mut self, canvas: &mut Canvas, sprites: &mut SpriteManager); - fn leave(&self); - fn on_event(&mut self, event: Event); + fn enter(&mut self, ctrl_man: &ControllerManager); + fn leave(&mut self); + fn update(&mut self, dt: Duration); + fn render(&mut self, renderer: &mut Renderer, sprites: &SpriteManager); + fn handle_event(&mut self, event: Event); } type Bollar = Vec>; @@ -313,19 +286,21 @@ impl ActiveState { } impl AppState for ActiveState { - fn update(&mut self, dt: Nanoseconds) { + fn enter(&mut self, _ctrl_man: &ControllerManager) {} + + fn update(&mut self, dt: Duration) { for 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), + ns if ns < (NS_PER_FRAME - 90_0000).nanoseconds() => self.change_boll_count(100), + ns if ns > (NS_PER_FRAME + 90_0000).nanoseconds() => self.change_boll_count(-100), _ => {} } } - fn render(&mut self, canvas: &mut Canvas, sprites: &mut SpriteManager) { + fn render(&mut self, renderer: &mut Renderer, sprites: &SpriteManager) { /* draw square of blocks */ { let blocks = 20; let size = 32; @@ -335,15 +310,14 @@ impl AppState for ActiveState { ); let block = sprites.get("block"); for i in 0..blocks { - canvas - .copy( + renderer + .blit( block, None, SDLRect::new((i) * size + offset.x, offset.y, size as u32, size as u32), - ) - .unwrap(); - canvas - .copy( + ); + renderer + .blit( block, None, SDLRect::new( @@ -352,10 +326,9 @@ impl AppState for ActiveState { size as u32, size as u32, ), - ) - .unwrap(); - canvas - .copy( + ); + renderer + .blit( block, None, SDLRect::new( @@ -364,10 +337,9 @@ impl AppState for ActiveState { size as u32, size as u32, ), - ) - .unwrap(); - canvas - .copy( + ); + renderer + .blit( block, None, SDLRect::new( @@ -376,8 +348,7 @@ impl AppState for ActiveState { size as u32, size as u32, ), - ) - .unwrap(); + ); } } @@ -390,8 +361,8 @@ impl AppState for ActiveState { let radius = 110.0 + size as f32 * 0.5; let angle = (self.mario_angle as f32 - 90.0) * PI / 180.0; let offset2 = point!((angle.cos() * radius) as i32, (angle.sin() * radius) as i32); - canvas - .copy_ex( + renderer + .blit_ex( sprites.get("mario"), None, SDLRect::new( @@ -404,37 +375,28 @@ impl AppState for ActiveState { sdl2::rect::Point::new(size / 2, size / 2), false, false, - ) - .unwrap(); + ); self.mario_angle = (self.mario_angle + 1.0) % 360.0; } /* draw circles and ellipses*/ { let p = point!((self.screen.width / 2) as i16, (self.screen.height / 2) as i16); - canvas - .circle(p.x, p.y, 100, Color::RGB(255, 255, 255)) - .unwrap(); - canvas - .aa_circle(p.x, p.y, 110, Color::RGB(255, 255, 255)) - .unwrap(); - canvas - .ellipse(p.x, p.y, 50, 100, Color::RGB(255, 255, 255)) - .unwrap(); - canvas - .aa_ellipse(p.x, p.y, 110, 55, Color::RGB(255, 255, 255)) - .unwrap(); + renderer.circle(p, 100, (255, 255, 255)); + renderer.circle(p, 110, (255, 255, 255)); + renderer.ellipse(p, (50, 100), (255, 255, 255)); + renderer.ellipse(p, (110, 55), (255, 255, 255)); } for b in &self.bolls { - b.draw(canvas, self.boll_size); + b.draw(renderer, self.boll_size); } } - 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),