0

好的,我正在directx9中制作一个简单的相机移动程序。我从消息中获取输入,如下所示:

        LRESULT CALLBACK WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
    {
        switch (uMsg)
        {
        case WM_KEYDOWN:
            switch (wParam & 0x7F)
            {
                case 'W':
                    WDown = true;
                case 'A':
                    ADown = true;
                case 'S':
                    SDown = true;
                case 'D':
                    DDown = true;
            }
        case WM_KEYUP:
            switch (wParam & 0x7F)
            {

                    case 'W':
                        WDown = false;
                    case 'A':
                        ADown = false;
                    case 'S':
                        SDown = false;
                    case 'D':
                        DDown = false;
               }
           }
    }

    // Render Frame code:

    void Renderer::RenderOneFrame(bool w, bool a, bool s, bool d)
    {
    // Check Input
        if(w)
            m_camera.MoveForward(1);
        else if(a)
            m_camera.Strafe(-1);
        else if(s)
            m_camera.MoveForward(-1);
        else if(d)
            m_camera.Strafe(1);
    }

超级简单对吧?虽然我遗漏了很多其他代码,但它根本不会与这些布尔值混淆,因此不需要它们。好吧,现在问题来了。如果我使用此代码,它会完美运行。前是前,右是右,左是左,后是后。

问题是,我希望能够对角移动。所以,显而易见的答案是摆脱 else 对吗?嗯,我愿意。

但是,程序变得混乱!前进不前进!它没有做任何事情!左后退,后退到右!唯一正确的就是正确的!巧合的是,这是检查的最后一个输入!但是我一次按1个键,但它们仍然坏了!发生了什么?我破坏了视觉工作室吗?这个程序是否泄漏到另一个维度?到底是怎么回事?!?

4

1 回答 1

6

您是否忘记了开关盒上的“中断”?

例子:

LRESULT CALLBACK WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    switch (uMsg)
    {
    case WM_KEYDOWN:
        switch (wParam & 0x7F)
        {
            case 'W':
                WDown = true;
                break;
            case 'A':
                ADown = true;
                break;
            case 'S':
                SDown = true;
                break;
            case 'D':
                DDown = true;
                break;
        }
        break;
    case WM_KEYUP:
        switch (wParam & 0x7F)
        {

                case 'W':
                    WDown = false;
                    break;
                case 'A':
                    ADown = false;
                    break;
                case 'S':
                    SDown = false;
                    break;
                case 'D':
                    DDown = false;
                    break;
           }
       }
       break;
}

// Render Frame code:

void Renderer::RenderOneFrame(bool w, bool a, bool s, bool d)
{
// Check Input
    if(w)
        m_camera.MoveForward(1);
    if(a)
        m_camera.Strafe(-1);
    if(s)
        m_camera.MoveForward(-1);
    if(d)
        m_camera.Strafe(1);
}
于 2012-07-13T02:16:22.627 回答