ci: better build scripts

This commit is contained in:
2023-07-25 11:59:07 -05:00
parent 4a1f565f72
commit 973fa08ac9
7 changed files with 77 additions and 37 deletions

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