Game Maker Studio 2中Xbox One手柄检测到但无输入问题求助
解决Xbox One手柄在GameMaker中无响应的问题
看起来你已经做了不少排查工作——手柄能被识别但输入没反应,GC手柄却正常,这确实有点棘手。结合你用的是Xbox One手柄而课程用的是360手柄,我整理了几个针对性的解决方案:
1. 先确认手柄的轴/按键是否真的有输入输出
首先添加调试代码,看看GameMaker是否能读取到手柄的实际输入值,这能帮你快速定位是映射问题还是其他隐藏问题:
// 在controller input代码块中添加调试输出 if gamepad_is_connected(_dev) { // 打印左摇杆X轴的实时数值 show_debug_message("Left Stick X: " + string(gamepad_axis_value(_dev, gp_axislh))); // 打印A键的按下状态 show_debug_message("A Button Pressed: " + string(gamepad_button_check_pressed(_dev, gp_face1))); var _deadzone = 0.3; // 原有输入逻辑代码... }
运行游戏后查看输出窗口的调试信息:
- 如果轴值一直显示为
0,说明轴映射存在错误; - 如果按键状态始终是
false,说明按键常量和手柄实际按键不匹配。
2. 修正Xbox One手柄的轴/按键映射
部分GameMaker版本中,Xbox One手柄的轴/按键预定义常量可能和Xbox 360有差异,你可以直接用索引代替预定义常量来测试:
替换轴映射(用索引代替gp_axislh等常量)
if gamepad_is_connected(_dev) { var _deadzone = 0.3; // 左摇杆X轴对应索引0 left = gamepad_axis_value(_dev, 0) < -_deadzone; right = gamepad_axis_value(_dev, 0) > _deadzone; // 左摇杆Y轴对应索引1 up = gamepad_axis_value(_dev, 1) < -_deadzone; down = gamepad_axis_value(_dev, 1) > _deadzone; // 按键用索引测试:A键通常是索引0,B键是1,右肩键是5 attack = gamepad_button_check_pressed(_dev, 1); // B键对应attack jump = gamepad_button_check_pressed(_dev, 0); // A键对应jump jump_held = gamepad_button_check(_dev, 0); block = gamepad_button_check(_dev, 5); // 右肩键对应block }
如果修改后手柄有反应,说明你当前GameMaker版本的预定义常量和Xbox One手柄的实际映射不匹配,后续可以根据测试出的索引重新定义自己的常量。
3. 调整死区设置
Xbox One手柄的摇杆输出精度可能和360手柄不同,你当前设置的0.3死区可能过高,导致轻微的摇杆移动被系统忽略。试试调小死区到0.2甚至0.15:
var _deadzone = 0.2;
4. 检查驱动和固件
- 确保Windows系统安装了最新的Xbox One手柄驱动(可以通过设备管理器更新,或者安装Xbox Accessories应用);
- 用Xbox Accessories应用更新手柄的固件,旧固件可能会导致兼容性问题。
5. 动态获取手柄设备索引
虽然你检测到设备0是Xbox One手柄,但有时候系统可能会重新分配设备索引。试试动态获取手柄设备,避免硬编码_dev=0:
var _dev = -1; // 遍历所有设备,找到Xbox One手柄 for(var i = 0; i < gamepad_get_device_count(); i++) { if(gamepad_is_connected(i) && string_pos("XInput STANDARD GAMEPAD", gamepad_get_description(i)) != 0) { _dev = i; break; } } if(_dev != -1) { // 手柄输入逻辑代码... }
内容的提问来源于stack exchange,提问作者Frédéric Bourdeau
相关产品推荐
相关产品推荐

