AirSim_SimJoyStick
这些文件实现了一个跨平台的游戏手柄输入系统,支持 Windows 和 Linux。
整体架构
1. DirectInputJoystick (Windows 专用)
- 头文件:
DirectInputJoystick.h
- 实现文件:
DirectInputJoyStick.cpp
主要功能:
- 使用 DirectInput API 处理游戏手柄输入
- 支持力反馈(自动居中、方向盘震动)
- 使用 PIMPL 模式隐藏实现细节
核心类结构:
struct Capabilities // 手柄能力(支持的轴和按钮)
struct JoystickState // 手柄状态(轴位置、按钮状态)
struct JoystickInfo // 手柄信息(设备 GUID、PID/VID)
关键特性:
- 力反馈效果(自动居中和震动)
- XInput 设备过滤
- 设备枚举和状态轮询
2. SimJoyStick (跨平台封装)
- 头文件:
SimJoyStick.h
- 实现文件:
SimJoyStick.cpp
主要功能:
- 提供统一的游戏手柄接口
- Windows 下使用 DirectInputJoystick
- Linux 下使用
/dev/input/js*
设备
核心特性:
struct AxisMap // 轴映射配置
struct AxisMaps // 所有轴的映射
struct State // 统一的手柄状态
平台特定实现
Windows 实现特点:
- 使用 DirectInput API
- 支持最多 4 个控制器
- 完整的力反馈支持
- 自动设备识别和映射
Linux 实现特点:
- 使用
/dev/input/js*
设备文件 - 非阻塞读取模式
- 基本的轴和按钮支持
- 力反馈功能待实现
轴映射系统
系统支持灵活的轴映射,特别是针对不同类型的设备:
- FrSky Taranis RC 控制器 (VID_0483&PID_5710)
- Flysky FS-SM100 USB 适配器 (VID_0401&PID_0401)
- Xbox 类型控制器 (其他设备)
每个轴可以配置:
- 映射到哪个物理轴
- 最小/最大值范围
- 方向(正常/反转/自动)
使用示例
SimJoyStick joystick;
SimJoyStick::State state;// 获取第一个手柄的状态
joystick.getJoyStickState(0, state);if (state.is_initialized && state.is_valid) {// 使用手柄数据float leftX = state.left_x;float leftY = state.left_y;// ...
}// 设置力反馈
joystick.setAutoCenter(0, 0.5); // 50% 自动居中强度
joystick.setWheelRumble(0, 0.8); // 80% 震动强度
设计亮点
- PIMPL 模式: 隐藏平台相关实现细节
- 跨平台支持: 统一的接口,不同的后端实现
- 设备自适应: 自动识别设备类型并应用合适的映射
- 可配置性: 灵活的轴映射和力反馈配置
- 错误处理: 完善的状态检查和错误信息
这个系统非常适合需要跨平台游戏手柄支持的应用程序,特别是模拟器和游戏开发场景。