Я пытаюсь соединить SDL2
с Node.js
с помощью Rust
, для этого я использую Neon-Bindings . Мне удалось реализовать очень простой класс в Rust, который открывает окно, и этот класс доступен для Node.js. Я должен использовать класс, иначе SDL2
не будет иметь подходящего видеодрайвера ( см. Эту проблему ). Это моя реализация Rust
:
#[macro_use]
extern crate neon;
extern crate sdl2;
use neon::context::Context;
use neon::types::JsUndefined;
pub struct Canvas();
declare_types! {
pub class JsCanvas for Canvas {
init(mut _cx) {
Ok(Canvas())
}
method open(mut cx) {
let sdl_context = sdl2::init()
.or_else(|err| cx.throw_error(err.to_string()))?;
let video_subsystem = sdl_context.video()
.or_else(|err| cx.throw_error(err.to_string()))?;
let _window = video_subsystem
.window("Game", 900, 700)
.resizable()
.build()
.or_else(|err| cx.throw_error(err.to_string()))?;
let mut event_pump = sdl_context.event_pump().or_else(|err| cx.throw_error(err.to_string()))?;
'main: loop {
for event in event_pump.poll_iter() {
match event {
sdl2::event::Event::Quit { .. } => break 'main,
_ => {}
}
}
// render window contents here
}
Ok(JsUndefined::new().upcast())
}
}
}
register_module!(mut cx, {
cx.export_class::<JsCanvas>("Canvas")?;
Ok(())
});
И я могу использовать это в JavaScript вот так:
// My Rust implementation exposed to Node.js as native node extension
const { Canvas } = require("../native");
const canvas = new Canvas();
console.log("foo");
canvas.open();
console.log("bar");
Это работает, я вижу окно. Проблема, с которой я столкнулся с этой реализацией, заключается в том, что вызов canvas.open();
полностью блокируется.
Т.е. console.log("foo");
регистрирует "foo"
, затем открывается окно, и больше ничего не происходит. Только когда я выхожу из окна, выполняется console.log("bar");
.
Я хотел бы иметь возможность открывать окно и чтобы Node продолжал выполнять код после вызова, чтобы открыть окно. Было бы здорово, если бы я мог сделать это
const { Canvas } = require("../native");
const canvas = new Canvas();
// logs "foo"
console.log("foo");
// opens the window
canvas.open();
// gets executed right away
console.log("bar");
// other stuff
setTimeout(() => {}, 10000);
// closes the window
canvas.close();