Linux-Joystick scheint in einem SDL-Spiel falsch kalibriert zu sein (Freespace 2 Open)

3995
Chris Boyle

Ich habe einen USB - Joystick (Saitek Cyborg 3D), die als auf meinem kürzlich installierten Ubuntu 9.04 - Box erscheint /dev/input/js0, und jstestzeigt Werte im Bereich von + -32767, wie ich erwarten würde. Ich habe gerade eine Kopie von FreeSpace Open ausgegraben, ein Spiel, das SDL verwendet und vor etwa einem Jahr problemlos an einer vorherigen Ubuntu-Installation gearbeitet hat, und der Joystick scheint sehr falsch kalibriert zu sein. Alle Achsen (X, Y, Verdrillung, Drosselung) scheinen mindestens 20% außerhalb des Zentrums zu liegen. Zumindest erreichen die X- und Y-Achse definitiv nicht ihren Endpunkt.

Eine relevante Nachricht auf der SDL-Mailingliste im Januar 2009 erhielt keine konkreten Antworten.

Hier ist joy-unix.cpp aus der Projektquelle . Ich führe den Trunk nicht ganz aus, aber wie Sie dem Revisionsprotokoll entnehmen können, sind in dieser Datei seit über 3 Jahren keine tatsächlichen Codeänderungen aufgetreten.

4

2 Antworten auf die Frage

5
Chris Boyle

Ich habe das Problem in d2x (einem Descent-Port) bemerkt, das ebenfalls SDL verwendet, also habe ich in SDL gesucht . testjoystickvon der SDL-Quelle zeigte auch das Problem. Betrachtet man den SDL-Linux-Joystick-Treiber, wird das Problem erwähnt. Suchen Sie joydev_patternin dieser Datei nach und Sie werden sehen, was sie tun. Suche nach calibrateund sie erwähnen dieses Problem. Grundsätzlich verwenden sie /dev/input/event6(oder was auch immer) den Vorzug vor /dev/input/js0, sofern nicht mit kompiliert --disable-input-events, selbst wenn man weiß, dass das Ereignisgerät nicht kalibriert werden kann (dh die eingestellte Kalibrierung js0wird ignoriert).

Nachdem alles, was gefunden wird, sucht Google, dass die Beteiligung configureOption zeigen, dass in den Kommentaren zu einem Linux Howto versteckt fs2_open, jemand dieses Problem eigentlich schon hat .

Ich habe diesen Fehler an Ubuntu gemeldet . Um dies zu umgehen, wählen Sie eine der folgenden Optionen aus:

  • Set SDL_JOYSTICK_DEVICE=/dev/input/js0(Sie können dies /etc/environmenteinfügen und neu starten, um es überall anzuwenden). Bearbeiten: SDL hat das evdevGerät immer noch als zweiten Joystick. Wenn Sie also in Spielen wie d2xdiesem standardmäßig auch auf den zweiten Joystick reagieren, rufen Sie den Optionsbildschirm auf und entfernen Sie diese zusätzlichen Bindungen.
  • Kompilieren Sie libSDL mit --disable-input-events.
  • rmmod evdev (Wahrscheinlich verlieren Sie ungewöhnliche Eingabegeräte).
Genau das gleiche Problem, genau der gleiche Joystick. Ihre erste Option hat wunderbar funktioniert. hat mir Stunden der Frustration erspart. CountMurphy vor 12 Jahren 0
1
jtb

Klingt, als müsste das Spiel mit den Min- / Max- / Mittelachsenwerten des Joysticks versehen werden. Die Standardwerte könnten 0/32768/65536 sein und nicht -32676/0/32760. Das ist offensichtlich um mehr als 20% günstiger, daher versucht es vielleicht irgendwann einmal, sich selbst zu kalibrieren. Es sieht auch so aus, als könnte der joytest2Konsolenbefehl Werte im Spiel anzeigen, die möglicherweise zusätzliche Einblicke bieten.

Von 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; } } 

Ich sehe eine Kalibrierungsfunktion ( joy_cheap_cal()at joy.cpp:454), aber es ist nicht sofort ersichtlich, von wo aus sie aufgerufen wird oder ob es andere Methoden im Spiel gibt, um die Achsenwerte neu zu kalibrieren. Ich liebe Freespace. Wenn ich nach Hause komme, lade ich den Code herunter und störe ein bisschen. Sie könnten auch versuchen, jscaleinfach nur zu laufen ?