Я пытался написать объект для использования класса Joystick из библиотеки SDL2 с NodeJS с использованием модуля FFI, но продолжаю сталкиваться с проблемами. Кажется, он работает, как и ожидалось, примерно в 50% случаев, но в других случаях программа утверждает, что не может найти подключенный джойстик (используя SDL_GetError ()).
Вот пример кода:
// Constructor...
function Joystick(deviceId){
this.joystickPointer = ref.refType('pointer');
this.SDL = ffi.Library("SDL2.dll", {
"SDL_Init": ["Uint32", ["string"]],
"SDL_Quit": ["void", []],
"SDL_JoystickOpen": ["pointer", ["int"]],
"SDL_NumJoysticks": ["int", []],
"SDL_JoystickName": ["string", [this.joystickPointer]],
"SDL_JoystickNumButtons": ["int", [this.joystickPointer]],
"SDL_JoystickGetButton": ["Uint8", [this.joystickPointer, "int"]],
"SDL_JoystickNumAxes": ["int", [this.joystickPointer]],
"SDL_JoystickGetAxis": ["int16", [this.joystickPointer, "int"]],
"SDL_JoystickGetAttached": ["bool", [this.joystickPointer]],
"SDL_JoystickClose": ["void", [this.joystickPointer]],
"SDL_JoystickUpdate": ["void", []],
"SDL_GetError": ["string", []]
});
// Setup
this.deviceId = deviceId || 0;
this.SDL.SDL_Init("SDL_INIT_JOYSTICK");
this.joystickObject = this.SDL.SDL_JoystickOpen(this.deviceId);
// Poll Joystick
this.deviceCount = this.SDL.SDL_NumJoysticks();
this.buttons = this.SDL.SDL_JoystickNumButtons(this.joystickObject);
this.name = this.SDL.SDL_JoystickName(this.joystickObject);
// Cleanup
this.SDL.SDL_JoystickClose(this.joystickObject);
this.SDL.SDL_Quit();
return false;
}
var testJoystick = new Joystick(0);
console.log(testJoystick.name);
Когда это не удается, SDL_GetError () выдает мне следующее сообщение об ошибке:
"Joystick hasn't been opened yet"
Есть идеи?
Я подозреваю, что в приведенном выше коде было слишком много проблем, чтобы заставить его работать как положено.
В итоге я придумал другое решение …
Я нашел статическую библиотеку ввода более низкого уровня — http://forums.tigsource.com/index.php?topic=10675.0 — написал скелетную библиотеку поверх нее, связал ее, затем применил ее …
Он прекрасно работает и намного, намного легче, чем SDL …
Придется положить его на GIT или Bitbucket в течение следующих нескольких дней.
Других решений пока нет …