You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在Rust wasm-bindgen中如何通过navigator.getGamepads()获取手柄按键状态?

解析web_sys游戏手柄对象并检测按键状态

你可以通过wasm-bindgen提供的类型转换方法,把JsValue转换为web_sys::Gamepad对象,之后就能读取手柄按键状态了。具体步骤如下:

  1. 过滤无效手柄对象:get_gamepads()返回的数组中,未连接手柄的位置会是null或undefined,需要先过滤掉这些无效值。
  2. 类型转换:使用JsValue::dyn_into::<web_sys::Gamepad>()将有效的JsValue转为Gamepad实例,该方法会返回Result,方便处理转换失败的情况。
  3. 读取按键状态:通过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);
            }
        }
    }
}

关键说明

  • JsCast trait:dyn_into方法来自这个trait,需要手动引入(use wasm_bindgen::JsCast;),它提供了JS类型之间的安全转换能力。
  • 空值处理:必须过滤null/undefined,否则转换会失败。
  • 按键遍历:GamepadButtonList支持iter()遍历,每个元素同样需要转为GamepadButton对象才能读取状态。

内容的提问来源于stack exchange,提问作者user2880156

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 07:10:19