mirror of
https://github.com/Xevion/rust-sdl2-emscripten.git
synced 2025-12-06 17:16:21 -06:00
61 lines
1.6 KiB
Rust
61 lines
1.6 KiB
Rust
use std::cell::RefCell;
|
|
use std::rc::Rc;
|
|
|
|
use sdl2::rect::Rect;
|
|
|
|
use pacman::main_loop;
|
|
|
|
// Resources
|
|
// https://developer.mozilla.org/en-US/docs/WebAssembly/Rust_to_Wasm
|
|
// https://puddleofcode.com/story/definitive-guide-to-rust-sdl2-and-emscriptem/
|
|
|
|
// To build locally:
|
|
// cargo run
|
|
|
|
// To build for the web:
|
|
// rustup target add asmjs-unknown-emscripten
|
|
// export EMCC_CFLAGS="-s USE_SDL=2"
|
|
// cargo build --target asmjs-unknown-emscripten && open index.html
|
|
fn main() {
|
|
let ctx = sdl2::init().unwrap();
|
|
let video_ctx = ctx.video().unwrap();
|
|
|
|
let window = match video_ctx
|
|
.window("Hello, Rust / SDL2 / WASM!", 640, 480)
|
|
.position_centered()
|
|
.opengl()
|
|
.build() {
|
|
Ok(window) => window,
|
|
Err(err) => panic!("failed to create window: {}", err)
|
|
};
|
|
|
|
let canvas = match window
|
|
.into_canvas()
|
|
.present_vsync()
|
|
.build() {
|
|
Ok(canvas) => canvas,
|
|
Err(err) => panic!("failed to create canvas: {}", err)
|
|
};
|
|
|
|
let rect = Rect::new(0, 0, 10, 10);
|
|
|
|
let ctx = Rc::new(RefCell::new(ctx));
|
|
let rect = Rc::new(RefCell::new(rect));
|
|
let canvas = Rc::new(RefCell::new(canvas));
|
|
|
|
#[cfg(target_family = "wasm")]
|
|
use pacman::emscripten;
|
|
|
|
#[cfg(target_family = "wasm")]
|
|
emscripten::set_main_loop_callback(main_loop(Rc::clone(&ctx), Rc::clone(&rect), Rc::clone(&canvas)));
|
|
|
|
#[cfg(not(target_family = "wasm"))]
|
|
{
|
|
use std::thread::sleep;
|
|
use std::time::Duration;
|
|
loop {
|
|
main_loop(Rc::clone(&ctx), Rc::clone(&rect), Rc::clone(&canvas))();
|
|
sleep(Duration::from_millis(10))
|
|
}
|
|
}
|
|
} |