在Rust wasm-bindgen中如何通过navigator.getGamepads()获取手柄按键状态?
解析web_sys游戏手柄对象并检测按键状态
你可以通过wasm-bindgen提供的类型转换方法,把JsValue转换为web_sys::Gamepad对象,之后就能读取手柄按键状态了。具体步骤如下:
- 过滤无效手柄对象:
get_gamepads()返回的数组中,未连接手柄的位置会是null或undefined,需要先过滤掉这些无效值。 - 类型转换:使用
JsValue::dyn_into::<web_sys::Gamepad>()将有效的JsValue转为Gamepad实例,该方法会返回Result,方便处理转换失败的情况。 - 读取按键状态:通过
Gamepad::buttons()获取按键列表,遍历每个GamepadButton对象,调用pressed()方法判断按键是否被按下。
修改后的完整代码示例:
use wasm_bindgen::JsCast; use web_sys::{Gamepad, GamepadButton, Window}; fn check_gamepad_buttons() { let window: Window = web_sys::window().expect("全局window对象不存在"); let navigator = window.navigator(); // 获取游戏手柄数组 let gamepads = navigator.get_gamepads().expect("获取游戏手柄失败"); for gp_value in gamepads.iter() { // 过滤null/undefined的无效值 if gp_value.is_null() || gp_value.is_undefined() { continue; } // 将JsValue转换为Gamepad对象 let gamepad: Gamepad = gp_value.dyn_into().expect("转换为Gamepad对象失败"); // 获取按键列表并遍历 let buttons = gamepad.buttons(); for (index, button_value) in buttons.iter().enumerate() { let button: GamepadButton = button_value.dyn_into().expect("转换为GamepadButton对象失败"); if button.pressed() { println!("手柄{}的第{}号按键被按下", gamepad.index(), index); } } } }
关键说明
JsCasttrait:dyn_into方法来自这个trait,需要手动引入(use wasm_bindgen::JsCast;),它提供了JS类型之间的安全转换能力。- 空值处理:必须过滤
null/undefined,否则转换会失败。 - 按键遍历:
GamepadButtonList支持iter()遍历,每个元素同样需要转为GamepadButton对象才能读取状态。
内容的提问来源于stack exchange,提问作者user2880156
相关产品推荐
相关产品推荐

