diff --git a/.cargo/config.toml b/.cargo/config.toml index 04ce860..a1accff 100644 --- a/.cargo/config.toml +++ b/.cargo/config.toml @@ -1,28 +1,4 @@ [target.wasm32-unknown-emscripten] rustflags = [ - "-C", - "link-arg=-s", - "-C", - "link-arg=FULL_ES2", - "-C", - "link-arg=-s", - "-C", - "link-arg=FULL_ES3", - "-C", - "link-arg=-s", - "-C", - "link-arg=USE_SDL=2", - "-C", - "link-arg=-s", - "-C", - "link-arg=MAX_WEBGL_VERSION=2 ", - "-C", - "link-arg=-s", - "-C", - "link-arg=MIN_WEBGL_VERSION=2", - "-C", - "link-arg=-s", - "-C", - "link-arg=ERROR_ON_UNDEFINED_SYMBOLS=0", # for ignoring some egl symbols. needed for wgpu - + "--use-preload-plugins --preload-file assets -s USE_SDL=2 -s USE_SDL_IMAGE=2 -s ASSERTIONS=1", ] \ No newline at end of file diff --git a/build.ps1 b/build.ps1 new file mode 100644 index 0000000..03d8676 --- /dev/null +++ b/build.ps1 @@ -0,0 +1,7 @@ +& cargo build --target=wasm32-unknown-emscripten --release + +mkdir -p dist -Force + +cp ./target/wasm32-unknown-emscripten/release/Pac_Man.wasm ./dist +cp ./target/wasm32-unknown-emscripten/release/Pac-Man.js ./dist +cp index.html dist \ No newline at end of file diff --git a/build.sh b/build.sh index 53e4853..bc6c232 100755 --- a/build.sh +++ b/build.sh @@ -5,6 +5,6 @@ cargo build --target=wasm32-unknown-emscripten --release mkdir -p dist -cp target/wasm32-unknown-emscripten/release/rust_sdl2_wasm.wasm dist -cp target/wasm32-unknown-emscripten/release/rust-sdl2-wasm.js dist +cp target/wasm32-unknown-emscripten/release/Pac_Man.wasm dist +cp target/wasm32-unknown-emscripten/release/Pac-Man.js dist cp index.html dist \ No newline at end of file diff --git a/index.html b/index.html index afe8f80..7ea43b4 100644 --- a/index.html +++ b/index.html @@ -6,7 +6,7 @@ - + \ No newline at end of file diff --git a/serve.ps1 b/serve.ps1 new file mode 100644 index 0000000..0516bed --- /dev/null +++ b/serve.ps1 @@ -0,0 +1,3 @@ +& ./build.ps1 +cd ./dist +python -m http.server \ No newline at end of file diff --git a/src/emscripten.rs b/src/emscripten.rs new file mode 100644 index 0000000..c594a6d --- /dev/null +++ b/src/emscripten.rs @@ -0,0 +1,44 @@ +// taken from https://github.com/Gigoteur/PX8/blob/master/src/px8/emscripten.rs +#[cfg(target_os = "emscripten")] +pub mod emscripten { + use std::cell::RefCell; + use std::ptr::null_mut; + use std::os::raw::{c_int, c_void, c_char, c_float}; + use std::ffi::{CStr, CString}; + + #[allow(non_camel_case_types)] + type em_callback_func = unsafe extern "C" fn(); + + extern "C" { + // void emscripten_set_main_loop(em_callback_func func, int fps, int simulate_infinite_loop) + pub fn emscripten_set_main_loop(func: em_callback_func, + fps: c_int, + simulate_infinite_loop: c_int); + + pub fn emscripten_cancel_main_loop(); + pub fn emscripten_pause_main_loop(); + pub fn emscripten_get_now() -> c_float; + } + + thread_local!(static MAIN_LOOP_CALLBACK: RefCell<*mut c_void> = RefCell::new(null_mut())); + + pub fn set_main_loop_callback(callback: F) + where F: FnMut() + { + MAIN_LOOP_CALLBACK + .with(|log| { *log.borrow_mut() = &callback as *const _ as *mut c_void; }); + + unsafe { + emscripten_set_main_loop(wrapper::, -1, 1); + } + + unsafe extern "C" fn wrapper() + where F: FnMut() + { + MAIN_LOOP_CALLBACK.with(|z| { + let closure = *z.borrow_mut() as *mut F; + (*closure)(); + }); + } + } +} \ No newline at end of file diff --git a/src/main.rs b/src/main.rs index 3736ee0..5dbae2c 100644 --- a/src/main.rs +++ b/src/main.rs @@ -5,6 +5,9 @@ use sdl2::keyboard::{Keycode, Mod}; use std::time::Duration; use crate::constants::{WINDOW_WIDTH, WINDOW_HEIGHT}; +#[cfg(target_os = "emscripten")] +pub mod emscripten; + mod constants; mod board; mod game; @@ -19,27 +22,34 @@ pub fn main() { .expect("Could not initialize window"); let mut canvas = window.into_canvas().build().expect("Could not build canvas"); - let texture_creator= canvas.texture_creator(); + let texture_creator = canvas.texture_creator(); let map_texture = texture_creator.load_texture("assets/map.png").expect("Could not load pacman texture"); canvas.copy(&map_texture, None, None).expect("Could not render texture on canvas"); let mut event_pump = sdl_context.event_pump().expect("Could not get SDL EventPump"); - 'main: loop { + let mut main_loop = || { for event in event_pump.poll_iter() { match event { Event::Quit { .. } | - Event::KeyDown { keycode: Some(Keycode::Q), .. } => { - break 'main; - } - event @ Event::KeyDown { .. } => { + Event::KeyDown { keycode: Some(Keycode::Q), .. } => break, + event @ Event::KeyDown { .. } => { println!("{:?}", event); - }, + } _ => {} } } canvas.present(); ::std::thread::sleep(Duration::from_millis(10)); - } + }; + + #[cfg(target_os = "emscripten")] + use emscripten::{emscripten}; + + #[cfg(target_os = "emscripten")] + emscripten::set_main_loop_callback(main_loop); + + #[cfg(not(target_os = "emscripten"))] + loop { main_loop(); } } \ No newline at end of file