Simplify code

This commit is contained in:
2024-04-14 01:49:53 -05:00
parent b752e97db8
commit 10d9db6e95
3 changed files with 64 additions and 72 deletions

View File

@@ -9,7 +9,7 @@ jobs:
pages: write
id-token: write
steps:
- uses: actions/checkout@v2 # repo checkout
- uses: actions/checkout@v2
- uses: mymindstorm/setup-emsdk@v11
with:

View File

@@ -1,50 +0,0 @@
use std::cell::RefCell;
use std::process;
use std::rc::Rc;
use sdl2::event::Event;
use sdl2::keyboard::Keycode;
use sdl2::pixels::Color;
use sdl2::rect::Rect;
use sdl2::render::WindowCanvas;
use sdl2::Sdl;
#[cfg(target_family = "wasm")]
pub mod emscripten;
static BLACK: Color = Color::RGB(0, 0, 0);
static WHITE: Color = Color::RGB(255, 255, 255);
pub fn main_loop(ctx: Rc<RefCell<Sdl>>, rect: Rc<RefCell<Rect>>, canvas: Rc<RefCell<WindowCanvas>>) -> impl FnMut() {
let mut events = ctx.borrow_mut().event_pump().unwrap();
move || {
for event in events.poll_iter() {
match event {
Event::Quit {..} | Event::KeyDown {keycode: Some(Keycode::Escape), ..} => {
process::exit(1);
},
Event::KeyDown { keycode: Some(Keycode::Left), ..} => {
rect.borrow_mut().x -= 10;
},
Event::KeyDown { keycode: Some(Keycode::Right), ..} => {
rect.borrow_mut().x += 10;
},
Event::KeyDown { keycode: Some(Keycode::Up), ..} => {
rect.borrow_mut().y -= 10;
},
Event::KeyDown { keycode: Some(Keycode::Down), ..} => {
rect.borrow_mut().y += 10;
},
_ => {}
}
}
let _ = canvas.borrow_mut().set_draw_color(BLACK);
let _ = canvas.borrow_mut().clear();
let _ = canvas.borrow_mut().set_draw_color(WHITE);
let _ = canvas.borrow_mut().fill_rect(rect.borrow().clone());
let _ = canvas.borrow_mut().present();
}
}

View File

@@ -1,40 +1,35 @@
use std::cell::RefCell;
use std::process;
use std::rc::Rc;
use sdl2::event::Event;
use sdl2::keyboard::Keycode;
use sdl2::pixels::Color;
use sdl2::rect::Rect;
use pacman::main_loop;
static BLACK: Color = Color::RGB(0, 0, 0);
static WHITE: Color = Color::RGB(255, 255, 255);
// 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
let window = match video_ctx
.window("Hello, Rust / SDL2 / WASM!", 640, 480)
.position_centered()
.opengl()
.build() {
.build()
{
Ok(window) => window,
Err(err) => panic!("failed to create window: {}", err)
Err(err) => panic!("failed to create window: {}", err),
};
let canvas = match window
.into_canvas()
.present_vsync()
.build() {
let canvas = match window.into_canvas().present_vsync().build() {
Ok(canvas) => canvas,
Err(err) => panic!("failed to create canvas: {}", err)
Err(err) => panic!("failed to create canvas: {}", err),
};
let rect = Rect::new(0, 0, 10, 10);
@@ -43,19 +38,66 @@ fn main() {
let rect = Rc::new(RefCell::new(rect));
let canvas = Rc::new(RefCell::new(canvas));
let mut events = ctx.borrow_mut().event_pump().unwrap();
let mut main_loop = move || {
for event in events.poll_iter() {
match event {
Event::Quit { .. }
| Event::KeyDown {
keycode: Some(Keycode::Escape),
..
} => {
process::exit(1);
}
Event::KeyDown {
keycode: Some(Keycode::Left),
..
} => {
rect.borrow_mut().x -= 10;
}
Event::KeyDown {
keycode: Some(Keycode::Right),
..
} => {
rect.borrow_mut().x += 10;
}
Event::KeyDown {
keycode: Some(Keycode::Up),
..
} => {
rect.borrow_mut().y -= 10;
}
Event::KeyDown {
keycode: Some(Keycode::Down),
..
} => {
rect.borrow_mut().y += 10;
}
_ => {}
}
}
let _ = canvas.borrow_mut().set_draw_color(BLACK);
let _ = canvas.borrow_mut().clear();
let _ = canvas.borrow_mut().set_draw_color(WHITE);
let _ = canvas.borrow_mut().fill_rect(rect.borrow().clone());
let _ = canvas.borrow_mut().present();
};
#[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)));
emscripten::set_main_loop_callback(main_loop);
#[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))();
main_loop();
sleep(Duration::from_millis(10))
}
}
}
}