Контроллер XInput 360 не работает с cocos2d-x

Ello All,
Я довольно новичок в c ++, и я пытался заставить это работать дольше, чем я хочу признать. Поэтому я отказался от следующих ссылок и заставил контроллер работать в консольном приложении.

Вот результат
xbox360Controller.h
xbox360Controller.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 должным образом?

0

Решение

Во-первых, WindowProc — это функция обратного вызова, которая вызывается после отправки сообщения в окно из Windows.

Таким образом, если нет сообщения, эта функция не будет вызвана.

API-интерфейс XInput не является API-интерфейсом на основе сообщений, он не генерирует сообщения. Приложение требует, чтобы приложение считывало его состояние как можно чаще. Обычно это читается в каждом игровом цикле, непосредственно перед обработкой игровой логики. Кроме того, вы можете иметь отдельный поток для опроса состояния каждые 33 мс или около того.

Я бы порекомендовал вам взглянуть на работу XInput, концепцию программирования Windows и базовую концепцию архитектуры игрового движка.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]