我有一个 USB 操纵杆(Saitek Cyborg 3D),它在我最近安装的 Ubuntu 9.04 盒子上显示为/dev/input/js0
,并且jstest
显示的值在 +-32767 范围内,正如我所期望的那样。我刚刚挖出了一份自由空间开放,一款使用 SDL 的游戏,在大约一年前安装的 Ubuntu 上运行没有问题,操纵杆似乎校准得很差。所有轴(X、Y、扭转、油门)似乎至少偏离中心 20%。X 轴和 Y 轴至少肯定没有到达它们的端点。
A相关讯息2009 年 1 月在 SDL 邮件列表上提出的这个问题,并没有得到具体的答复。
这是joy-unix.cpp来自项目源代码。我还没有完全运行主干,但正如您从那里的修订日志中看到的那样,3 年来该文件没有发生任何实际的代码更改。
答案1
我注意到问题d2x(Descent 移植版),它也使用 SDL,所以我深入研究了 SDL。SDLtestjoystick
源代码也显示了这个问题。查看SDL Linux 操纵杆驱动程序,问题已提及。在该文件中搜索joydev_pattern
,您将看到他们在做什么;搜索calibrate
,他们确实提到了这个问题。基本上,他们/dev/input/event6
优先使用(或任何一种)/dev/input/js0
,除非使用编译--disable-input-events
,即使知道事件设备无法校准(即,设置的校准js0
将被忽略)。
找到所有这些后,在 Google 上搜索涉及该选项的内容后,configure
发现在 Linux howto 的评论中隐藏着fs2_open
有人确实已经遇到过这个问题。
我有报告此错误到 Ubuntu。要解决此问题,请选择以下任一方法:
- 设置
SDL_JOYSTICK_DEVICE=/dev/input/js0
(您可以将其放入/etc/environment
并重新启动以使其在所有地方应用)。编辑:SDL 仍将该evdev
设备作为第二个操纵杆,因此在类似的游戏中,d2x
默认情况下也会响应第二个操纵杆,请访问选项屏幕并删除那些额外的绑定。 - 使用 重新编译 libSDL
--disable-input-events
。 rmmod evdev
(很可能会丢失您拥有的任何不寻常的输入设备)。
答案2
听起来游戏需要从操纵杆提供最小/最大/中心轴值。默认值可能是 0/32768/65536,而不是您看到的 -32676/0/32760?这显然比 20% 的偏差要大得多,所以也许它在某个时候试图自动校准。控制台命令似乎还joytest2
可以显示游戏内值,这可能会提供一些额外的见解。
从joy_init()
:
// Fake a calibration
if (joy_num_sticks > 0) {
for (i=0; i<JOY_NUM_AXES; i++) {
joystick.axis_center[i] = 32768;
joystick.axis_min[i] = 0;
joystick.axis_max[i] = 65536;
}
}
我看到了一个校准函数(joy_cheap_cal()
at joy.cpp:454
),但不清楚它是从哪里调用的,或者游戏中是否有其他方法可以重新校准轴值。我喜欢 Freespace,所以当我回到家时,我会下载代码并稍微研究一下。您也可以尝试运行一下,jscal
只是为了好用?