结果如下 xbox360Controller.h xbox360Controller.cpp
从那里我试图使用steve tranby's post at the bottom of this thread(他添加到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);
}
}
完整代码为here
而来源是github Here。
任何人都知道放置XboxController实例的正确位置,以便它能够正确响应KeypadDown
吗?
答案 0 :(得分:1)
首先,WindowProc是一个回调函数,在从Windows发送到窗口的消息之后调用它。
因此,如果没有消息,则不会调用此函数。
XInput api不是基于消息的api,它不会生成消息。它要求应用程序尽可能频繁地读取其状态。通常在每个游戏循环中读取,就在游戏逻辑处理之前。或者,您可以使用一个单独的线程来每隔33ms左右轮询状态。
我建议你看看XInput是如何工作的,Windows编程的概念,以及游戏引擎架构的基本概念。