2013-06-14 3 views
0

눌려진 키를 기반으로 카메라 위치를 업데이트하는 데 문제가 있습니다. 간단히 말하면, 카메라를 화살표 키를 사용하여 왼쪽, 오른쪽, 앞으로, 뒤로 으로 이동하려고합니다. 프로그램이 실행되면 카메라가 정확한 위치에서 시작되고, 또한 키가 눌러지면 프로그램은 키가 눌려 졌음을 등록하지만 카메라는 이에 따라 업데이트하지 않습니다.키가 작동하지 않는 카메라 움직임 업데이트

무엇이든지, 루프의 else 문 (내 gyrating 큐브가있는 곳) 내에서 작업이 수행되지 않는 문제가 있습니다. 가장 큰 장애물은 루프의 키 값을 가져 와서 카메라 위치를 업데이트 할 수 있도록하는 것입니다. 다음에 어디서 볼 것인가에 대한 아이디어 나 제안은 없습니까?

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; 
        .... 
     } 
    } 
+0

알 수 없습니다. 귀하의 프로그램이 Windows 메시지 루프 또는 메인 루프를 실행합니까?. getMessage 또는 peekMessage를 사용하고 있습니까? –

+0

@LefterisE PeekMessage를 사용하고 있습니다. 'else'내 애니메이션 (회전 큐브)은 제대로 업데이트되지만 InitInstance에 WPARAM이 없으므로 키 이벤트를 루프 내에 등록하는 데 문제가 있습니다. 나는 그것을 업데이트했다 PeekMessage – SpicyWeenie

+0

DispatchMessage는 적절한 WPARAM으로 WndProc을 호출 할 것입니다. –

답변

0

while 루프에서 키 이벤트를 처리하고 있습니까? 그리고 응용 프로그램이 키 누름을 듣지 않아도 while 루프가 모든 프로세서 시간을 얻지 못합니까? 당신은 그들이 님에게 메일 루프에서 키 이벤트를 처리하는 방법 만보고 키에 다이렉트 X의 예에서

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

봐 듣지 않을 때

이 시도하고 장면을 렌더링합니다. 논리는 OpenGL에서 동일해야합니다.

0

장면을 렌더링 할 때까지 카메라 위치의 변경 사항이 적용되지 않으므로 Camera :: setKeyPressed에서 카메라를 업데이트 한 후 강제로 다시 그려야합니다. :: setkeyPressed 끝에서 InvalidateRect()를 호출하여이 작업을 수행 할 수 있어야합니다.

관련 문제