diff --git a/Cargo.lock b/Cargo.lock index 38ceb09..e9a0030 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -935,7 +935,9 @@ dependencies = [ name = "framework" version = "0.1.0" dependencies = [ - "ndk-glue", + "anyhow", + "bass-sys", + "gfx-hal", "winit", ] @@ -943,7 +945,9 @@ dependencies = [ name = "framework-example-2048" version = "0.1.0" dependencies = [ + "anyhow", "framework", + "ndk-glue", ] [[package]] @@ -995,6 +999,16 @@ dependencies = [ "log", ] +[[package]] +name = "gfx-hal" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "18d0754f5b7a43915fd7466883b2d1bb0800d7cc4609178d0b27bf143b9e5123" +dependencies = [ + "bitflags", + "raw-window-handle", +] + [[package]] name = "gfx_core" version = "0.9.2" diff --git a/framework-example-2048/Cargo.toml b/framework-example-2048/Cargo.toml index c7630b8..b936831 100644 --- a/framework-example-2048/Cargo.toml +++ b/framework-example-2048/Cargo.toml @@ -8,4 +8,11 @@ edition = "2018" crate-type = ["lib", "cdylib"] [dependencies] +anyhow = "1.0.38" framework = { path = "../framework" } + +[target.'cfg(target_os = "android")'.dependencies] +ndk-glue = "0.2.1" + +[package.metadata.android] +apk_label = "2048" diff --git a/framework-example-2048/src/lib.rs b/framework-example-2048/src/lib.rs index e69de29..51c5d72 100644 --- a/framework-example-2048/src/lib.rs +++ b/framework-example-2048/src/lib.rs @@ -0,0 +1,13 @@ +use anyhow::Result; +use framework::Game; + +pub fn real_main() -> Result<()> { + let game = Game::init()?; + game.run(); + Ok(()) +} + +#[cfg_attr(target_os = "android", ndk_glue::main(backtrace = "on"))] +pub fn android_main() { + real_main(); +} diff --git a/framework-example-2048/src/main.rs b/framework-example-2048/src/main.rs index e7a11a9..c7510f2 100644 --- a/framework-example-2048/src/main.rs +++ b/framework-example-2048/src/main.rs @@ -1,3 +1,5 @@ +use framework_example_2048::real_main; + fn main() { - println!("Hello, world!"); + real_main(); } diff --git a/framework/Cargo.toml b/framework/Cargo.toml index cbef9c9..0ddc28b 100644 --- a/framework/Cargo.toml +++ b/framework/Cargo.toml @@ -5,7 +5,7 @@ authors = ["Michael Zhang "] edition = "2018" [dependencies] +anyhow = "1.0.38" +gfx-hal = "0.6.0" winit = { version = "0.24.0", features = ["web-sys"] } - -[target.'cfg(target_os = "android")'.dependencies] -ndk-glue = "0.2.1" +bass-sys = { path = "../bass-sys" } diff --git a/framework/src/game.rs b/framework/src/game.rs index d56fcd5..df96d44 100644 --- a/framework/src/game.rs +++ b/framework/src/game.rs @@ -1,3 +1,10 @@ +use anyhow::Result; +use winit::{ + event::{Event, WindowEvent}, + event_loop::{ControlFlow, EventLoop}, + window::{Window, WindowBuilder}, +}; + pub struct ObjectWrapper { id: usize, inner: Box, @@ -9,21 +16,38 @@ pub trait Object { fn draw(&self); } -pub struct Context { -} +pub struct Context {} pub struct Game { + event_loop: EventLoop<()>, + window: Window, objects: Vec, } impl Game { - pub fn run(mut self, func: F) - where - F: Fn(), - { - loop { - for object in self.objects.iter_mut() { + pub fn init() -> Result { + let event_loop = EventLoop::new(); + let window = WindowBuilder::new().build(&event_loop)?; + + Ok(Game { + objects: vec![], + event_loop, + window, + }) + } + + pub fn run(mut self) { + let window_id = self.window.id(); + self.event_loop.run(move |event, _, control_flow| { + *control_flow = ControlFlow::Wait; + + match event { + Event::WindowEvent { + event: WindowEvent::CloseRequested, + window_id, + } if window_id == window_id => *control_flow = ControlFlow::Exit, + _ => (), } - } + }); } } diff --git a/framework/src/lib.rs b/framework/src/lib.rs index 05a53e6..70674b3 100644 --- a/framework/src/lib.rs +++ b/framework/src/lib.rs @@ -2,8 +2,3 @@ mod game; mod renderer; pub use crate::game::Game; - -#[cfg_attr(target_os = "android", ndk_glue::main(backtrace = "on"))] -pub fn android_main() { - println!("hello, world!"); -}