使用按键无法更新相机移动

时间:2013-06-14 09:30:49

标签: c++ opengl win32gui

我在根据按下的按键更新相机的位置时遇到问题。简单地说,我正试图让相机使用箭头键移动向左,向右,向前,向后。当程序运行时,摄像机将在正确的位置启动,此外,当按下某个键时,程序会注册该按键,但摄像机不会相应更新。

如果有的话,我看到了问题,因为动作没有在循环的else语句中执行(我的回转立方体所在的位置)。我最大的障碍是将按键的值压入循环,以便更新摄像机位置。关于下一步要去哪看的任何想法或建议?

以下代码如下:

Render.cpp

Render *renderDraw = new Render(renderWinWidth, renderWinHeight);
Camera *camera = new Camera();

void Render::renderScreen(Camera *cam)
    {
        ...
        gluLookAt(cam->getCameraX(), cam->getCameraY(), cam->getCameraZ(),
        objPos[0], objPos[1], objPos[2], VECTOR_UP[0], VECTOR_UP[1], VECTOR_UP[2]);
        ...
        glFlush();
    }

Camera.cpp

void Camera::setkeyPressed(WPARAM wParam, HWND hWnd, bool isPressed)
{
    keyPressed[wParam] = isPressed;

    switch(wParam)
        {
    case VK_UP:
        //MessageBox(hWnd, L"key up", L"Key pressed", MB_OK | MB_ICONASTERISK);
        newPos_ = getCameraX();
        newPos_ -= 2.0f;
        setCameraX(newPos_);
        break;
    case VK_DOWN:
        //MessageBox(hWnd, L"key down", L"Key pressed", MB_OK | MB_ICONASTERISK);
        newPos_ = getCameraX();
        newPos_ += 2.0f;
        setCameraX(newPos_);
        break;
    case VK_LEFT:
        //MessageBox(hWnd, L"key left", L"Key pressed", MB_OK | MB_ICONASTERISK);
        newPos_ = getCameraZ();
        newPos_ += 2.0f;
        setCameraZ(newPos_);
        break;
    case VK_RIGHT:
        //MessageBox(hWnd, L"key right", L"Key pressed", MB_OK | MB_ICONASTERISK);
        newPos_ = getCameraZ();
        newPos_ -= 2.0f;
        setCameraZ(newPos_);
        break;
        }
}

的main.cpp

BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
    {
        ...
        // Main Loop
        while (isRunning)
            {
               if (PeekMessage (&msg, hWnd, 0, 0, PM_REMOVE))
                {
                    if (msg.message == WM_QUIT)
                            isRunning = false;

                    TranslateMessage(&msg);
                    DispatchMessage(&msg);
                }
               else
                  {
                     renderDraw->renderScreen(camera); <-Contains gyrating cube
                     SwapBuffers(*hDC);
                  }
            }

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
        ....
        switch (message)
        {
        case WM_KEYDOWN:
            switch (wParam)
                {
                    camera->setkeyPressed(wParam, hWndChild, true);
                                    break;
                }
            break;
                     ....
        }
    }

2 个答案:

答案 0 :(得分:0)

您是否在while循环中处理关键事件?并不是while循环获得所有处理器时间而不允许您的应用程序听按键操作?

尝试此操作并在您不听键时渲染场景

while( uMsg.message != WM_QUIT )
{
    if( PeekMessage( &uMsg, NULL, 0, 0, PM_REMOVE ) )
    { 
        TranslateMessage( &uMsg );
        DispatchMessage( &uMsg );
    }
    else
        render();
}

查看directX示例,了解它们如何处理messsage循环中的关键事件。 openGL的逻辑应该是相同的。

答案 1 :(得分:0)

在渲染场景之前不会应用相机位置的变化,所以在Camera :: setKeyPressed中更新相机后,需要强制重绘。您应该可以通过在:: setkeyPressed

的末尾调用InvalidateRect()来完成此操作