O joystick do Linux parece calibrado incorretamente em um jogo do SDL (Freespace 2 Open) [closed]

4

Eu tenho um joystick USB (Saitek Cyborg 3D) que aparece na minha caixa Ubuntu 9.04 recentemente instalada como /dev/input/js0 , e jstest está mostrando valores no intervalo + -32767 como seria de esperar. Eu acabei de desenterrar uma cópia do FreeSpace Open , um jogo que usa SDL e funcionou sem problemas em uma instalação anterior do Ubuntu cerca de um ano atrás e o joystick parece muito mal calibrado. Todos os eixos (X, Y, twist, throttle) parecem estar pelo menos 20% fora do centro. Os eixos X e Y, pelo menos, definitivamente não estão atingindo seus pontos finais.

Uma mensagem relevante no SDL lista de discussão em janeiro de 2009 não recebeu respostas concretas.

Aqui está joy-unix.cpp da fonte do projeto. Eu não estou executando o trunk, mas como você pode ver no log de revisão, nenhuma mudança real de código ocorreu naquele arquivo por mais de 3 anos.

    
por Chris Boyle 04.08.2009 / 12:16

2 respostas

5

Eu notei o problema em d2x (uma porta de descida), que também usa o SDL, então fui pesquisar no SDL. testjoystick da fonte do SDL também mostrou o problema. Olhando para o driver de joystick SDL linux , o problema é mencionado. Pesquise joydev_pattern nesse arquivo e você verá o que eles estão fazendo; procure por calibrate e eles mencionam esse problema. Basicamente, eles usam /dev/input/event6 (ou o que for) em preferência a /dev/input/js0 , a menos que compilado com --disable-input-events , mesmo sabendo que o dispositivo de evento não pode ser calibrado (isto é, o conjunto de calibragem em js0 será ignorado). p>

Encontrando tudo isso, as pesquisas do Google que envolvem essa opção configure revelam isso escondido nos comentários de um tutorial do Linux para fs2_open , alguém já teve esse problema .

Eu tenho relatado este bug para o Ubuntu. Para contornar, escolha qualquer um dos:

  • Defina SDL_JOYSTICK_DEVICE=/dev/input/js0 (você pode colocar isso em /etc/environment e reinicializar para aplicá-lo em todos os lugares). Editar: O SDL ainda terá o dispositivo evdev como segundo joystick, portanto, em jogos como d2x que respondem ao segundo joystick também por padrão, acesse a tela de opções e remova essas ligações extras .
  • Recompile libSDL com --disable-input-events .
  • rmmod evdev (muito provavelmente perderá qualquer dispositivo de entrada incomum que você tenha).
por 07.08.2009 / 10:40
1

Parece que o jogo precisa ser fornecido com os valores de eixo mínimo / máximo / central do joystick. Os valores padrão podem ser 0/32768/65536 em vez de -32676/0/32760 que você está vendo? Isso é mais obviamente muito mais do que 20% de desconto, então talvez esteja tentando calibrar automaticamente em algum momento. Também parece que o comando do console joytest2 pode mostrar valores no jogo que podem fornecer algumas informações adicionais.

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

Eu vejo uma função de calibração ( joy_cheap_cal() at joy.cpp:454 ), mas não é imediatamente óbvio de onde isso é chamado, ou se há outros métodos dentro do jogo para recalibrar os valores dos eixos. Eu amo o Freespace, então quando eu chegar em casa eu vou baixar o código e cutucar um pouco. Você também pode tentar executar jscal apenas por uma boa medida?

    
por 04.08.2009 / 18:30