XInput 360控制器无法与cocos2d-x一起工作

XInput 360 controller not working with cocos2d-x

本文关键字:cocos2d-x 一起 工作 控制器 XInput      更新时间:2023-10-16

Ello All,
我对c++还很陌生,我试图让它发挥作用的时间比我愿意承认的要长。所以我离开了下面的参考,让控制器在控制台应用程序中工作。

  • xbox360控制器输入,c使用x输入
  • 代码项目项目
  • MSDN

结果如下xbox360控制器.hxbox360控制器.cpp

从那里开始,我试图使用史蒂夫·特兰比在本线程底部的帖子(他添加到中)将其与cocos2d-x一起使用,并将其应用于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);
    }
}

完整的代码在这里来源在github这里。有人知道放置XboxController实例的正确位置,以便它正确响应KeypadDown吗?

首先,WindowProc是一个回调函数,在从Windows向窗口发送消息后调用它。

所以,如果没有消息,这个函数就不会被调用。

XInput api不是基于消息的api,它不生成消息。它要求应用程序尽可能频繁地读取其状态。通常,它在每个游戏循环中读取,就在处理游戏逻辑之前。或者,您可以有一个单独的线程,每隔33ms左右轮询一次状态

我建议你看看XInput是如何工作的,Windows编程的概念,以及游戏引擎架构的基本概念。