Compare commits

..

1 Commits

Author SHA1 Message Date
973fa08ac9 ci: better build scripts 2025-06-17 11:48:09 -05:00
7 changed files with 77 additions and 37 deletions

View File

@@ -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",
]

7
build.ps1 Normal file
View File

@@ -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

View File

@@ -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

View File

@@ -6,7 +6,7 @@
<body>
<canvas id="canvas"></canvas>
<script type="text/javascript">
const Module = {
let Module = {
canvas: (function () {
// this is how we provide a canvas to our sdl2
return document.getElementById("canvas");
@@ -16,6 +16,6 @@
}]
};
</script>
<script src="rust-sdl2-wasm.js"></script>
<script src="Pac-Man.js"></script>
</body>
</html>

3
serve.ps1 Normal file
View File

@@ -0,0 +1,3 @@
& ./build.ps1
cd ./dist
python -m http.server

44
src/emscripten.rs Normal file
View File

@@ -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<F>(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::<F>, -1, 1);
}
unsafe extern "C" fn wrapper<F>()
where F: FnMut()
{
MAIN_LOOP_CALLBACK.with(|z| {
let closure = *z.borrow_mut() as *mut F;
(*closure)();
});
}
}
}

View File

@@ -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(); }
}