2012-07-11 5 views
3

2D (타일 기반) 장면을 렌더링하고 키 누르기를 등록합니다. 화살표 키를 누르면 카메라가 움직입니다. keypresses 잘 등록되어 있지만 다른 창으로 바꿀 때까지 돌아갈 때까지 내 장면 업데이트되지 않습니다.화면 새로 고침 고정

문제의 원인에 대한 단서를 제공해 줄 수 있습니까?

추신. 내가 리눅스, 개발 OpenGLglut (freeglut)의 도움으로 응용 프로그램을 개발하고 있어요.

내 렌더링 기능 :

void render() { 
    glClear(GL_COLOR_BUFFER_BIT); 
    glLoadIdentity(); 

    if (s_map) 
    for (int i = s_iCameraX; i < sc_iTilesY + s_iCameraY && i < s_map->usiHeight; i++) 
    { 
     for (int j = s_iCameraY; j < sc_iTilesX + s_iCameraX && j < s_map->usiWidth; j++) 
     { 
      short val = s_map->data[i][j];    
      if (val == 0x0010) glBindTexture(GL_TEXTURE_2D, texture[0]); 
      else if (val == 0x0020) glBindTexture(GL_TEXTURE_2D, texture[1]); 

      glBegin(GL_QUADS); 
       glTexCoord2f(0.0f, 0.0f); glVertex2f(j-s_iCameraX, i-s_iCameraY); 
       glTexCoord2f(1.0f, 0.0f); glVertex2f(j-s_iCameraX+1.0f, i-s_iCameraY); 
       glTexCoord2f(1.0f, 1.0f); glVertex2f(j-s_iCameraX+1.0f, i-s_iCameraY+1.0f); 
       glTexCoord2f(0.0f, 1.0f); glVertex2f(j-s_iCameraX, i-s_iCameraY+1.0f); 
      glEnd(); 
     } 
    } 

glutSwapBuffers(); 
} 

내 특수 키 처리 기능 :

void keyproc(int key, int x, int y) { 
    switch (key) 
    { 
    case GLUT_KEY_UP: 
     printf("UP: %d %d\n", s_iCameraX, s_iCameraY); 
     if (s_iCameraY - 1 >= 0) s_iCameraY--; 
     break; 

    case GLUT_KEY_DOWN: 
     printf("DOWN: %d %d\n", s_iCameraX, s_iCameraY); 
     if (s_map && s_iCameraY + 1 < s_map->usiHeight) s_iCameraY++; 
     break; 

    case GLUT_KEY_RIGHT: 
     printf("RIGHT: %d %d\n", s_iCameraX, s_iCameraY); 
     if (s_map && s_iCameraX + 1 < s_map->usiWidth) s_iCameraX++; 
     break; 

    case GLUT_KEY_LEFT: 
     printf("LEFT: %d %d\n", s_iCameraX, s_iCameraY); 
     if (s_iCameraX - 1 >= 0) s_iCameraX--; 
     break; 

    default: break; 
    } 
} 
+0

당신이 보여줄 수 : 유휴 콜백을 추가 주 루프? – Synxis

+0

나는 가지고 있지 않다. 나는 glut'glutMainLoop()'함수를 사용한다. – Robin92

+0

키를 누른 후에도'render()'가 여전히 호출됩니다 (printf()로 추적 할 수 있습니까?) 유휴 콜백은 무엇입니까? – Synxis

답변

1

다음은 시도는 가치가있을 수 있습니다

void idle(void) 
{ 
    // Force GLUT to render the scene 
    glutPostRedisplay(); 
} 
+0

이것은 문제를 해결한다. – Robin92

관련 문제