0

remove_joystick()thenを常に呼び出す以外に、実行時に接続されているジョイスティックの数を更新する方法はありinstall_joystickますか? これは非常に遅いことがわかります (60 FPS から約 5 FPS になります)。

Allegro 4.2 回答のみお願いします...

void Joystick::Update() {
    //If joystick input was lost, attempt to reacquire.
    if(GetNumJoysticks() == 0) {
        throw InputNotAvailableException("Joystick");
    }
    //If all joysticks were deleted remove input and do nothing.
    if(_numjoysticks == 0) {
        remove_joystick();
        return;
    }

    //Update state information
    if(poll_joystick() < 0) {
        throw InputNotAvailableException("Joystick");
    }
    for(int i = 0; i < _numButtons; ++i) {
        _prevButtons[i].b = _curButtons[i].b;
        _prevButtons[i].name = _curButtons[i].name;

        _curButtons[i].b = joy[_joyNumber].button[i].b;
        _curButtons[i].name = joy[_joyNumber].button[i].name;
    }
    for(int i = 0; i < _numSticks; ++i) {
        for(int j = 0; j < joy[_joyNumber].stick[i].num_axis; ++j) {
            _prevSticks[i].axis[j].name = _curSticks[i].axis[j].name;
            _prevSticks[i].axis[j].pos = _curSticks[i].axis[j].pos;
            _prevSticks[i].axis[j].d1 = _curSticks[i].axis[j].d1;
            _prevSticks[i].axis[j].d2 = _curSticks[i].axis[j].d2;

            _curSticks[i].axis[j].name = joy[_joyNumber].stick[i].axis[j].name;
            _curSticks[i].axis[j].pos = joy[_joyNumber].stick[i].axis[j].pos;
            _curSticks[i].axis[j].d1 = joy[_joyNumber].stick[i].axis[j].d1;
            _curSticks[i].axis[j].d2 = joy[_joyNumber].stick[i].axis[j].d2;
        }
        _prevSticks[i].flags = _curSticks[i].flags;
        _prevSticks[i].name = _curSticks[i].name;

        _curSticks[i].flags = joy[_joyNumber].stick[i].flags;
        _curSticks[i].name = joy[_joyNumber].stick[i].name;
    }
}
int Joystick::GetNumJoysticks() {
    remove_joystick();
    if(install_joystick(JOY_TYPE_DIRECTX)) {
        return 0;
    }
    return (num_joysticks);
}
4

1 に答える 1

2

4.x シリーズにはありません。5.x シリーズはそうです。

カスタム プラットフォーム固有のコード (そのようなものが存在すると仮定) を使用してネイティブ OS イベントをリッスンし、変更が検出されたときにのみ Allegro deinit/init 関数を呼び出すか、ユーザーが手動でジョイスティックの更新を開始する必要があります。

Linux では、inotify_add_watch()/dev/input で変更を確認できます。4.4 Allegro コードを見ると、Win32 関数joyGetNumDevs()joyGetPos(). 何かのようなもの:

int WIN_MAX_JOYSTICKS = joyGetNumDevs(); // this should never change
JOYINFO ji;
int pluggedin_count = 0;
for (int i = 0; i < WIN_MAX_JOYSTICKS; ++i)
  if (joyGetPos(i, &ji) == JOYERR_NOERROR) ++pluggedin_count;

if (pluggedin_count != last_pluggedin_count) /* reinit Allegro */

N秒ごとにそれを行う必要があります。

これらの joy* 関数は Windows 関数であるため、MSDN のドキュメントを読んで使用方法を学んでください。

于 2012-07-07T17:55:30.083 に答える