0

こんにちは、
私は C++ にかなり慣れていないので、認めようと思っているよりも長い間、これを機能させようとしてきました。そのため、次の参照から離れて、コントローラーをコンソール アプリで動作させるようにしました。

これが結果 です xbox360Controller.h xbox360Controller.cpp

そこから、このスレッドの下部にある steve tranby の投稿(彼は に追加) を使用して 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 Hereにあります。適切に応答するために、XboxController インスタンスを配置する適切な場所を知っている人はいKeypadDownますか?

4

1 に答える 1

1

まず、WindowProc は、Windows からウィンドウにメッセージが送信された後に呼び出されるコールバック関数です。

したがって、メッセージがない場合、この関数は呼び出されません。

XInput API はメッセージ ベースの API ではなく、メッセージを生成しません。アプリはできるだけ頻繁に状態を読み取る必要があります。通常、ゲーム ロジックが処理される直前に、すべてのゲーム ループで読み込まれます。別の方法として、33ms ごとに状態をポーリングする別のスレッドを用意することもできます。

XInput の仕組み、Windows プログラミングの概念、およびゲーム エンジン アーキテクチャの基本概念を確認することをお勧めします。

于 2013-08-21T05:21:22.370 に答える