Linux-джойстик кажется неправильно откалиброванным в SDL-игре (Freespace 2 Open)
У меня есть USB-джойстик (Saitek Cyborg 3D), который отображается на моем недавно установленном Ubuntu 9.04 как /dev/input/js0
, а также jstest
показывает значения в диапазоне +-32767, как я и ожидал. Я только что выкопал копию FreeSpace Open, игры, которая использует SDL и работала без проблем на предыдущей установке Ubuntu около года назад, и джойстик кажется очень неправильно откалиброванным. Все оси (X, Y, твист, дроссель) кажутся смещенными как минимум на 20%. Оси X и Y, по крайней мере, определенно не достигают своих конечных точек.
Соответствующее сообщение в списке рассылки SDL в январе 2009 года не получило конкретных ответов.
Вот радость-unix.cpp из источника проекта. Я не совсем запускаю транк, но, как вы можете видеть из журнала ревизий, никаких изменений кода в этом файле не происходило более 3 лет.
2 ответа
Я заметил проблему в d2x (порт спуска), который также использует SDL, поэтому я начал копаться в SDL. testjoystick
из источника SDL показал проблему также. Глядя на драйвер джойстика 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
(вполне вероятно, потерять любые необычные устройства ввода у вас есть).
Похоже, игра должна быть снабжена значениями min / max / center axis от джойстика. Значения по умолчанию могут быть 0/32768/65536, а не -32676/0/32760, вы видите? Это более очевидно, что скидка более чем на 20%, поэтому, возможно, в какой-то момент он пытается выполнить автоматическую калибровку. Это также выглядит как joytest2
Команда console может отображать внутриигровые значения, которые могут дать некоторую дополнительную информацию.
От 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
просто для хорошей меры?