2013-08-21 62 views
0

Ello All,
我對C++非常陌生,我一直試圖讓這個工作時間超過我的承認。所以我已經離開了下面的參考資料,並讓控制器在控制檯應用程序中工作。 XInput 360控制器不能與cocos2d-x一起工作

下面是結果 xbox360Controller.h xbox360Controller.cpp

從那裏,我試圖把它用了cocos2d-x工作使用steve tranby's post at the bottom of this thread(他補充說)並將其改編爲360手柄。

雖然我已經得到了鍵盤事件的工作 (這是標準的Windows輸入,因此不壞)

LRESULT CCEGLView::WindowProc(UINT message, WPARAM wParam, LPARAM lParam) 
{ 
    BOOL bProcessed = FALSE; 
    CCLog("Message sent = %d",message); 
    //note* only showing relavant sections of code for brevity 
    switch (message) 
    { 
     case WM_KEYDOWN: 
      if (wParam == VK_F1 || wParam == VK_F2) 
      { 
       CCDirector* pDirector = CCDirector::sharedDirector(); 
       if (GetKeyState(VK_LSHIFT) getKeypadDispatcher()->dispatchKeypadMSG(wParam == VK_F1 ? kTypeBackClicked : kTypeMenuClicked); 
       } 
      } 
      else if (wParam == VK_ESCAPE) 
      { 
       CCDirector::sharedDirector()->getKeypadDispatcher()->dispatchKeypadMSG(kTypeBackClicked); 
      } 
      else 
      { 
       CCDirector::sharedDirector()->getKeypadDispatcher()->dispatchKeypadDown(wParam); 
      } 

      if (m_lpfnAccelerometerKeyHook!=NULL) 
      { 
       (*m_lpfnAccelerometerKeyHook)(message,wParam,lParam); 
      } 
      break; 
     default: 
      if (m_wndproc) 
      { 
       m_wndproc(message, wParam, lParam, &bProcessed); 
       if (bProcessed) break; 
      } 
      return DefWindowProc(m_hWnd, message, wParam, lParam); 
    } 

    if (m_wndproc && !bProcessed) 
    { 
     m_wndproc(message, wParam, lParam, &bProcessed); 
    } 
    return 0; 

} 

我想不通的地方把控制器邏輯。 我在的WindowProc方法試圖 ,並意識到,沒有工作,因爲它只是 火災作爲回調的WindowProc事件我可能沒有正確的行話吧,對不起) 我已經最接近它得到的東西,激發往往不夠檢查是在點

static LRESULT CALLBACK _WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) 
{ 
    CCDirector* pDirector = CCDirector::sharedDirector(); 

    XboxController* player1 = new XboxController(GamePadIndex_One); 
    if(player1->IsConnected()) 
    { 
     player1->Update(); 
     for(int i =0;iState._buttons[i]==true) 
      { 
       //CCApplication::sharedApplication()->getKe 
       pDirector->getKeypadDispatcher()->dispatchKeypadDown(i); 
      } 
     } 
    } 
    delete player1; 

    if (s_pMainWindow && s_pMainWindow->getHWnd() == hWnd) 
    { 
     return s_pMainWindow->WindowProc(uMsg, wParam, lParam); 
    } 
    else 
    { 
     return DefWindowProc(hWnd, uMsg, wParam, lParam); 
    } 
} 

完整的代碼here 和源是在github上Here。 任何人都知道放置XboxController實例的正確位置,以便它能夠正確響應KeypadDown

回答

1

首先,WindowProc是一個回調函數,在從Windows向窗口發送消息之後調用。

所以,如果沒有消息,這個函數就不會被調用。

XInput api不是基於消息的api,它不會生成消息。它要求應用程序儘可能頻繁地閱讀其狀態。通常在每個遊戲循環中讀取它,就在遊戲邏輯處理之前。或者,你可以有一個單獨的線程來每33ms左右輪詢一次狀態。

我想推薦你看看XInput如何工作,Windows編程的概念以及遊戲引擎架構的基本概念。