neo_babylon/
basic_game.rs

1use std::cell::RefCell;
2use std::collections::HashSet;
3use std::rc::Rc;
4
5use js_sys::Reflect;
6use wasm_bindgen::prelude::Closure;
7
8use crate::constants::*;
9use crate::core::*;
10
11pub trait BasicGame {
12    fn get_scene(&self) -> Rc<RefCell<Scene>>;
13    fn update(&self, _delta_time: f64) {}
14    fn key_up(&self, _key_code: u8) {}
15    fn key_down(&self, _key_code: u8) {}
16    fn get_keys(&self) -> Rc<RefCell<HashSet<u8>>>;
17}
18
19pub fn run_basic_game<T>() -> Rc<RefCell<T>>
20where
21    T: 'static + BasicGame + Default,
22{
23    let t = Rc::new(RefCell::new(T::default()));
24    let t1 = Rc::clone(&t);
25    t.borrow().get_scene().borrow().add_before_render_observable(Closure::new(move || {
26        let g = t1.borrow();
27        let scene = g.get_scene();
28        let delta_time = scene.borrow().get_delta_time() / 1000.0;
29        t1.borrow().update(delta_time);
30    }));
31
32    let t2 = Rc::clone(&t);
33    t.borrow().get_scene().borrow().add_keyboard_observable(Closure::new(move |e1, _e2| {
34        let event_type = Reflect::get(&e1, &"type".into()).unwrap();
35        let key_code = Reflect::get(&e1, &"event".into()).unwrap();
36        let key_code = Reflect::get(&key_code, &"inputIndex".into()).unwrap_or_default();
37        if event_type == KEYDOWN {
38            t2.borrow().key_down(key_code.as_f64().unwrap() as u8);
39            t2.borrow().get_keys().borrow_mut().insert(key_code.as_f64().unwrap() as u8);
40        }
41        if event_type == KEYUP {
42            t2.borrow().key_up(key_code.as_f64().unwrap() as u8);
43            t2.borrow().get_keys().borrow_mut().remove(&(key_code.as_f64().unwrap() as u8));
44        }
45    }));
46
47    t
48}