#wasmer #input #experimental #io #mouse-input #devices #draw

wasmer-experimental-io-devices-lib

方便使用实验性的 wasmer IO 设备的绑定

2个版本

0.1.1 2020年2月22日
0.1.0 2020年1月17日

#957硬件支持

每月 23 次下载

MIT 许可证

15KB
336

io_devices_lib Rust

用于构建使用Wasmer实验性IO设备的应用程序的Rust crate。 🔌

功能

  • 支持Wasmer帧缓冲区,因此您可以使用WASI模块绘制图形! 🖼️
  • 支持键盘和鼠标输入API,因此您可以检索和使用输入! ⌨️🐭

安装

wasmer-experimental-io-devices-lib = "0.1" 添加到您的 [dependencies] 在您的 Cargo.toml

快速入门

TODO(mark): 重新组织 io-devices-lib,以便当前的内容在 framebuffer 下命名空间

下面的程序演示了如何使用此API创建一个交互式帧缓冲区应用程序。

use std::iter;
use wasmer_experimental_io_devices_lib::{color::*, *};

const X_RES: u32 = 300;
const Y_RES: u32 = 300;

fn main() {
    // create a framebuffer instance with the specified resolution
    let mut fb_ctx = FrameBufferCtx::new(X_RES, Y_RES).unwrap();

    // declare some data
    let colors: Vec<RGBA> = vec![
        (255, 0, 0).into(),     // red
        (0, 255, 0).into(),     // green
        (0, 0, 255).into(),     // blue
        (255, 255, 0).into(),   // yellow
        (255, 255, 255).into(), // white
    ];

    let mut color_selector = 1;
    'mainloop: loop {
        // get input event iterator
        let iter = fb_ctx.get_input().unwrap();

        for ie in iter {
            match ie {
                InputEvent::WindowClosed | InputEvent::KeyPress(Key::Escape) => break 'mainloop,
                InputEvent::KeyPress(Key::Key1) => color_selector = 1,
                InputEvent::KeyPress(Key::Key2) => color_selector = 2,
                InputEvent::KeyPress(Key::Key3) => color_selector = 3,
                InputEvent::KeyPress(Key::Key4) => color_selector = 4,
                InputEvent::KeyPress(Key::Key5) => color_selector = 5,
                InputEvent::MouseEvent(x, y, et) => {
                    println!("{:?} at {}, {}", et, x, y);
                }
                _ => (),
            }
        }

        let color = colors[color_selector - 1];
        // draw all the pixels with the selected color
        fb_ctx
            .update_pixels(0, 0, iter::repeat(color).take((X_RES * Y_RES) as usize))
            .unwrap();

        fb_ctx.draw().unwrap();
        // std::thread::sleep_ms(16);
    }
}

在您的crate中,只需运行 cargo build --release --target=wasm32-wasi 进行编译。

使用 wasmer -V 检查您的wasmer版本,如果您尚未升级到版本0.12.0或更高版本,请运行 wasmer self-update

然后,运行 wasmer run --enable-experimental-io-devices target/wasm32-wasi/release/wasm-module-name.wasm

TODO: 添加截图

依赖关系

~2MB
~48K SLoC