在上篇文章中跑通了流程, 用手柄在浏览器上面玩热血系列, 但是暂时没找到比较适合nes-rust的封装库, 所以就自己先简单实现了一个
rust wasm web使用手柄玩红白机小游戏-热血足球 - 知乎 ()
npm地址
//e-
demo1,使用手柄移动小球
e- demo
demo2 监控所有手柄的按键和遥感状态
e- demo
ts小技巧
ts实现类型的去空值热血无赖手柄设置,如果直接使用函数在类型系统中是不会去除空类型的热血无赖手柄设置, 需要使用一个类型断言的技巧
// const a: (number | null)[]
const a = [1, null, 2];
// const b: (number | null)[]
const b = a.filter((i) => !!i);
// const c: number[]
const c = a.filter((i): i is number => !!i);
特点
nes-rust的输入和dom事件很像, 接收的是一个按键的down和up事件, 但是的api只有一个状态, 按下或者松开, 以及0-1的力度值, 这个就要求需要记录上一次的状态值, 然后和现在的状态进行对比来确定事件, 比如上一次是初始状态, 现在是按下态, 那么就应该发送down事件, 另外还需要能够自定义读取数据的频率, 默认60帧
使用方式
可以只监听按键变化的事件, 或者每帧都接收数据, 回调函数中会接收到所有按键的状态以及力度信息
import { GamePad, Event } from "e-gamepad";
const fps = 60;
const pad = new GamePad({ fps });
pad.on(Event.Down, (data) => {
// ...
});
pad.onAll((data) => {
// ...
});