Захват ввода джойстика в C или Java - PullRequest
2 голосов
/ 28 января 2012

Мне нужно захватить ввод данных с помощью C или Java (в зависимости от того, что проще).

Есть ответы на похожие вопросы, но все они используют C ++ или C #.

Программе нужно толькополучить направление и величину, на которую наклонен джойстик.Я использую Windows7, поэтому мне, вероятно, потребуется использовать winmm.dll, как объясняется здесь .
Буду признателен, если кто-нибудь сможет объяснить, как это сделать на C или Java.

Ответы [ 5 ]

2 голосов
/ 28 января 2012

Есть готовые библиотеки для обоих языков. Более важным вопросом будет язык, который вы будете использовать, или какой язык вы предпочитаете в первую очередь. Не обязательно имеет смысл добавлять код на C просто для того, чтобы добавить такую ​​функциональность в Java-программу. Аналогичным образом, вы не захотите вызывать Java из C, просто чтобы получить ввод с помощью джойстика.

Первый запрос в Google для "java джойстика" был этот . Еще не пробовал.

Что касается кода C ++ (и, скорее всего, C #), вы должны иметь возможность использовать тот же код в C, предполагая, что это чистый код Windows API (потому что он тоже в C). Так что у вас не должно возникнуть проблем с их адаптацией.

Edit: Относительно ответа, который вы указали: вы должны быть в состоянии использовать это решение 1: 1 в C (в Java вам придется писать код, по сути, делая то же самое). Но вместо того, чтобы объявлять все самостоятельно, просто #include <windows.h>, и вы должны быть готовы к работе (в C).

1 голос
/ 29 января 2012

Решение C # - это действительно чистый код Windows API!В C просто #include <windows.h> и вместо [DllImport("winmm.dll")] вы ссылаетесь на winmm.lib.Следующий пример должен прояснить это:

void printJoystickData()
{
   // The captured data will be written to the following struct:
   //typedef struct joyinfo_tag {
   //   UINT wXpos;
   //   UINT wYpos;
   //   UINT wZpos;
   //   UINT wButtons;
   //} JOYINFO,*PJOYINFO,*LPJOYINFO;
   JOYINFO joystickInfo;

   // The ID of the joystick you are using. If there is only one joystick use JOYSTICKID1.
   UINT joystickId = JOYSTICKID1;

   MMRESULT errorCode = joyGetPos(joystickId, &joystickInfo);
   switch(errorCode)
   {
       case JOYERR_NOERROR: // No error. joystickInfo now contains contains the captured data.
       {
           printf("The X position (left/right tilt) is %u\n", joystickInfo.wXpos);
           printf("The Y position (up/down tilt) is %u\n", joystickInfo.wYpos);
           printf("The Z position (usually the throttle) is %u\n", joystickInfo.wZpos);
           // These values range from 0 to 65536. 32768 is the centre position.

           // Test button 1. You can do the same for JOY_BUTTON2, JOY_BUTTON3 etc.
           // wButtons is a UNINT that is the OR of all pressed button flags.
           if(joystickInfo.wButtons & JOY_BUTTON1)
               printf("Button 1 was pressed.");

           break;
       }
       case JOYERR_PARMS: fprintf(stderr, "Invalid parameters to joyGetPos."); break;
       case JOYERR_NOCANDO: fprintf(stderr, " Failed to capture joystick input."); break;
       case JOYERR_UNPLUGGED: fprintf(stderr, "The joystick identified by joystickId isn't plugged in."); break;
       case MMSYSERR_NODRIVER: fprintf(stderr, "No (active) joystick driver available."); break;
   }
}

Библиотека Simple Directmedia Layer (предложенная blahdiblah) также выглядит многообещающе, но мне кажется, что код, приведенный выше, проще:* Для Java используйте Central Nexus Device API , как предложено Марио.Загрузка включает в себя документацию.

1 голос
/ 28 января 2012

Я рекомендую библиотеку Simple Directmedia Layer для решения на чистом C. Библиотека приятна в использовании, и их документация и примеры кода великолепны:

SDL_Joystick *joy;

// Initialize the joystick subsystem
SDL_InitSubSystem(SDL_INIT_JOYSTICK);

// Check for joystick
if(SDL_NumJoysticks()>0){
  // Open joystick
  joy=SDL_JoystickOpen(0);
  ...
0 голосов
/ 26 мая 2016

См. Этот URL для файлов Gamepad.c и Gamepad.h.https://github.com/elanthis/gamepad

Откройте джойстик, используя

STATE.fd = open(STATE.device, O_RDWR|O_NONBLOCK);

Определение структуры:

STATE - это объект структуры.// Он находится в файле Gamepad.h

open возвращает -1 при ошибке.Установите значение флага (определенное при объявлении переменных для джойстика), если оно успешно открыто.

Считайте ввод данных джойстика, используя

     (read(STATE[gamepad].fd, &je, sizeof(je)) > 0) 

Определение структуры: je является объектом структуры // Он находится в джойстике.h

je обновлен.je.type - одна из трех вещей, упомянутых в заголовочном файле joystick.h. Если нажата кнопка, то je.number - это целое число, которое обозначает номер кнопки, указанный производителем.Если палка перемещена, то число j обозначает спецификацию оси производителем.Величина присутствует в значении je.value, которое назначается соответствующей переменной флешки соответственно.

0 голосов
/ 28 января 2012

Образец, к которому вы привязали, на самом деле не использует ничего объектно-ориентированного, что означает, что вы можете довольно легко перенести его на C.

C поддерживает struct s так же, как C # (которые выделеныв стеке), так что это в основном копирование-вставка.

Единственное, что может сбить вас с толку - это атрибут [DllImport].Цель этого атрибута состоит в том, чтобы p / invoke (платформа вызывать) неуправляемая DLL из управляемого кода C #.Здесь вы должны использовать extern для доступа к Windows API.

...