Linux 操纵杆在 SDL 游戏中似乎校准错误(Freespace 2 Open)

Linux 操纵杆在 SDL 游戏中似乎校准错误(Freespace 2 Open)

我有一个 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只是为了好用?

相关内容