2013-08-21 1 views
0

엘로 전체,
저는 C++에 새로 입문했습니다. 나는 이것을 인정하기 위해 오랫동안 노력하기 위해 노력해 왔습니다. 그래서 나는 다음의 심판에서 벗어나 콘트롤러에서 콘솔 앱으로 작업하도록했다. XInput 360 컨트롤러가 cocos2d-x와 작동하지 않습니다

xbox360 controller input with c using x input

  • Code proj article
  • xbox360Controller.h xbox360Controller.cpp

    가 거기에서 내가적인 Cocos2D-X와 함께 작동하도록 그걸 얻기 위해 노력하고있어 결과 01을 사용하여(그는에 추가) 및 360 게임 패드에 적용. 내가 작동 키패드 이벤트를받은 적이 있지만

    컨트롤러 로직을 넣어 어디 알아낼 수 없습니다

    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 이벤트에 콜백으로 만 화재 등을 didnt 작업 내가 한 가장 가까운 확인 자주 발사 뭔가를 얻었다는 점

    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 프로그래밍의 개념 및 게임 엔진 아키텍처의 기본 개념을 살펴볼 것을 권합니다.

    관련 문제