doukutsu-rs/src/framework/context.rs

48 lines
1.6 KiB
Rust

use crate::framework::backend::{BackendRenderer, init_backend};
use crate::framework::error::GameResult;
use crate::framework::filesystem::Filesystem;
use crate::framework::gamepad::GamepadContext;
use crate::framework::graphics::VSyncMode;
use crate::framework::keyboard::KeyboardContext;
use crate::game::Game;
pub struct Context {
pub headless: bool,
pub size_hint: (u16, u16),
pub(crate) filesystem: Filesystem,
pub(crate) renderer: Option<Box<dyn BackendRenderer>>,
pub(crate) gamepad_context: GamepadContext,
pub(crate) keyboard_context: KeyboardContext,
pub(crate) real_screen_size: (u32, u32),
pub(crate) screen_size: (f32, f32),
pub(crate) screen_insets: (f32, f32, f32, f32),
pub(crate) vsync_mode: VSyncMode,
}
impl Context {
pub fn new() -> Context {
Context {
headless: false,
size_hint: (640, 480),
filesystem: Filesystem::new(),
renderer: None,
gamepad_context: GamepadContext::new(),
keyboard_context: KeyboardContext::new(),
real_screen_size: (320, 240),
screen_size: (320.0, 240.0),
screen_insets: (0.0, 0.0, 0.0, 0.0),
vsync_mode: VSyncMode::Uncapped,
}
}
pub fn run(&mut self, game: &mut Game) -> GameResult {
let backend = init_backend(self.headless, self.size_hint)?;
let mut event_loop = backend.create_event_loop(self)?;
self.renderer = Some(event_loop.new_renderer(self as *mut Context)?);
event_loop.run(game, self);
Ok(())
}
}