use rand::Rng;
use sdl2::event::Event;
-use sdl2::EventPump;
+use sdl2::{EventPump, VideoSubsystem};
use sdl2::keyboard::Keycode;
use sdl2::pixels::Color;
use sdl2::render::BlendMode;
use sdl2::render::Canvas;
-use sdl2::video::Window;
+use sdl2::video::{SwapInterval, Window};
use ::{SCREEN_HEIGHT, SCREEN_WIDTH};
use boll::*;
#[derive(Default)]
pub struct AppBuilder {
resolution: Rect<u16>,
- fps: u8,
state: Option<Box<dyn AppState>>,
title: Option<String>,
}
self
}
- pub fn with_fps(mut self, fps: u8) -> Self {
- unimplemented!()
- // self.fps = fps;
- // self
- }
-
pub fn with_state(mut self, state: Box<dyn AppState>) -> Self {
self.state = Some(state);
self
self
}
- pub fn start(self) -> App {
+ pub fn build(self) -> Result<App, String> {
let context = sdl2::init().unwrap();
- sdl2::image::init(sdl2::image::InitFlag::PNG).unwrap();
- let window = context
- .video().unwrap()
+ sdl2::image::init(sdl2::image::InitFlag::PNG)?;
+ let video = context.video()?;
+
+ self.print_video_display_modes(&video);
+
+ let window = video
.window(&self.title.unwrap(), self.resolution.width.into(), self.resolution.height.into())
.position_centered()
+ // .fullscreen()
+ // .fullscreen_desktop()
.opengl()
.build().unwrap();
context.mouse().show_cursor(false);
canvas.clear();
canvas.present();
- let event_pump = context.event_pump().unwrap();
+ video.gl_set_swap_interval(SwapInterval::VSync)?;
+
+ let event_pump = context.event_pump()?;
let sprites = SpriteManager::new(canvas.texture_creator());
- App {
+ Ok(App {
canvas,
event_pump,
sprites,
state: self.state.unwrap_or(Box::new(ActiveState::new())),
- }
+ })
+ }
+
+ fn print_video_display_modes(&self, video: &VideoSubsystem) {
+ println!("video subsystem: {:?}", video);
+ println!("current_video_driver: {:?}", video.current_video_driver());
+ for display in 0..video.num_video_displays().unwrap() {
+ println!("=== display {} - {} ===", display, video.display_name(display).unwrap());
+ println!(" display_bounds: {:?}", video.display_bounds(display).unwrap());
+ println!(" num_display_modes: {:?}", video.num_display_modes(display).unwrap());
+ println!(" desktop_display_mode: {:?}", video.desktop_display_mode(display).unwrap());
+ println!(" current_display_mode: {:?}", video.current_display_mode(display).unwrap());
+ for mode in 0..video.num_display_modes(display).unwrap() {
+ println!(" {:2}: {:?}", mode, video.display_mode(display, mode).unwrap());
+ }
+ }
+ println!("swap interval: {:?}", video.gl_get_swap_interval());
}
}