Linux-джойстик кажется неправильно откалиброванным в SDL-игре (Freespace 2 Open)

3485
Chris Boyle

У меня есть USB-джойстик (Saitek Cyborg 3D), который отображается на моем недавно установленном Ubuntu 9.04 как /dev/input/js0и jstestпоказывает значения в диапазоне + -32767, как и следовало ожидать. Я только что выкопал копию FreeSpace Open, игры, которая использует SDL и работала без проблем на предыдущей установке Ubuntu около года назад, и джойстик кажется очень неправильно откалиброванным. Все оси (X, Y, твист, дроссель) кажутся смещенными как минимум на 20%. Оси X и Y, по крайней мере, определенно не достигают своих конечных точек.

Соответствующее сообщение на СВД списка рассылки в январе 2009 года не получил никаких конкретных ответов.

Вот радость-unix.cpp из источника проекта. Я не совсем запускаю транк, но, как вы можете видеть из журнала ревизий, никаких изменений кода в этом файле не происходило более 3 лет.

4

2 ответа на вопрос

5
Chris Boyle

Я заметил проблему в d2x (порт спуска), который также использует SDL, поэтому я начал копаться в SDL. testjoystickиз источника SDL показал проблему также. Глядя на драйвер джойстика SDL Linux, проблема упоминается. Ищите joydev_patternв этом файле, и вы увидите, что они делают; искать, calibrateи они упоминают эту проблему. В основном они используют /dev/input/event6(или какой-либо из них) вместо /dev/input/js0, если не скомпилированы --disable-input-events, даже не зная, что устройство события не может быть откалибровано (т. Е. Установленная калибровка js0будет игнорироваться).

Обнаружив все это, поиски в Google, включающие эту configureопцию, показывают, что в комментариях к инструкции Linux скрыто fs2_open, что у кого-то уже была эта проблема .

Я сообщил об этой ошибке в Ubuntu. Чтобы обойти, выберите любой из:

  • Установите SDL_JOYSTICK_DEVICE=/dev/input/js0(вы можете вставить это /etc/environmentи перезагрузить, чтобы применить его везде). Изменить: SDL по-прежнему будет иметь evdevустройство в качестве второго джойстика, поэтому в играх, подобных d2xэтой, по умолчанию реагируют и на второй джойстик, перейдите на экран параметров и удалите эти дополнительные привязки.
  • Перекомпилируйте libSDL с помощью --disable-input-events.
  • rmmod evdev (вполне вероятно, что вы потеряете любые необычные устройства ввода у вас есть).
Точно такая же проблема, точно такой же джойстик. Ваш первый вариант работал прекрасно. сэкономил мне часы разочарования. CountMurphy 11 лет назад 0
1
jtb

Похоже, игра должна быть снабжена значениями min / max / center axis от джойстика. Значения по умолчанию могут быть 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()в joy.cpp:454), но не сразу видно, откуда она вызывается или есть ли в игре другие методы для повторной калибровки значений оси. Мне нравится Freespace, поэтому, когда я вернусь домой, я скачаю код и немного покопаюсь. Вы могли бы также попытаться бежать jscalтолько для хорошей меры?

Похожие вопросы