2012-07-07 39 views
0

有沒有辦法更新運行時插入的操縱桿數量,而不是始終調用remove_joystick(),然後install_joystick?這證明是非常緩慢的(從60 FPS到5左右)。只有請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); 
} 
+0

爲什麼你想這樣做每一幀?僅僅根據需要去做它會更有意義嗎? – 2012-07-07 17:58:00

+0

@NicolBolas定義「根據需要」。在我看來,需要插入的操縱桿是「每幀需要的」? – Casey 2012-07-07 18:12:42

+0

當他們插入電源時,你會做什麼?通常,PC遊戲可以讓用戶有機會根據自己的需要使用配置界面來設置控件。這通常是處理這種事情的時候。或者你可以停止使用過時的Allegro版本並升級到Allegro 5. – 2012-07-07 18:15:07

回答

2

4.x的系列沒有。 5.x系列確實如此。

您必須使用自定義特定於平臺的代碼(假設存在此類情況)來偵聽本機操作系統事件,並且只在檢測到更改時調用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文檔以瞭解如何使用它們。

+0

哦,poo ...那麼,有一個想法在運行時實現可選的操縱桿。在開始遊戲之前,用戶將不得不處理並插入。 – Casey 2012-07-07 18:05:52

+0

我已經添加了一些如何實現實時掃描的例子,但我建議將這些限制在配置或標題屏幕上。 – Matthew 2012-07-07 18:33:20