2013-09-04 3 views
0

OpenGL을 처음 사용하기 때문에 키보드의 화살표 키를 사용하여 막대기를 페인트하려고합니다. 내 생각은 stickman에 전역 변수를 사용하고 특정 키를 눌렀을 때 변수를 변경하는 것이었다. 그 후 draw-function (myDisplay())이 다시 호출됩니다. 불행히도 나는 항상 다음과 같은 오류 메시지가 나타납니다 : "오류 10 오류 C2371 : 'myDisplay': 재정의, 다른 기본 유형" myDisplay()를 대체 할 때 키보드 기능에서 glutPostRedisplay()를 일부 자습서 오류 메시지가 사라지고 빌드가 성공적으로 완료되었습니다. 그러나 키를 누르면 막대기가 움직이지 않습니다. 현재 창은 문서에 말했듯이 다시 표시 될 필요가 있다고 마크에게OpenGL : 키보드를 사용하여 오브젝트를 이동하는 중에 오류가 발생했습니다.

#include <GL/glut.h> 

GLint x; GLint y; GLint d; //parameters for the stickman 

void myKeyboard(unsigned char key, int mx, int my) { 
    int x1 = mx; 
    int y1 = 480 - my; 

    switch(key){ 
    case GLUT_KEY_LEFT : 
     x = x-50; 
     myDisplay(); 
     break; 
    case 'E' : 
     exit(-1); 
     break; 
    default: 
     break; 
    } 
} 


void stickman() { 
    glBegin(GL_LINES);   //body 
     glVertex2i(x, y); 
     glVertex2i(x, y-2*d); 
     glVertex2i(x-d, y-d); 
     glVertex2i(x+d, y-d); 
     glVertex2i(x, y-2*d); 
     glVertex2i(x-d, y-3*d); 
     glVertex2i(x, y-2*d); 
     glVertex2i(x+d, y-3*d); 
    glEnd(); 

    glBegin(GL_LINE_LOOP);  //head 
     glVertex2i(x,y); 
     glVertex2i(x+0.5*d, y); 
     glVertex2i(x+0.5*d, y+0.5*d); 
     glVertex2i(x-0.5*d, y+0.5*d); 
     glVertex2i(x-0.5*d, y); 
    glEnd(); 
} 


void myDisplay() { 
    glClear(GL_COLOR_BUFFER_BIT); 
    glColor3f(0.0, 0.0, 0.0); 

    stickman(); 

    glFlush(); 
} 

void myInit() { 
    glClearColor(1.0, 1.0, 1.0, 1.0); 
    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    gluOrtho2D(0.0, 640.0, 0.0, 480.0); 
} 

void main(int argc, char** argv) { 
    x = 320; 
    y = 350; 
    d = 100; 

    glutInit(&argc, argv); 
    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); 
    glutInitWindowSize(640, 480); 
    glutInitWindowPosition(200, 50); 
    glutCreateWindow("Stickman"); 
    glutDisplayFunc(myDisplay); 
    glutKeyboardFunc(myKeyboard); 
    glutPostRedisplay(); 
    myInit(); 
    glutMainLoop(); 
} 

답변

1

내가 발견 한 (GLUT Keyboard Tutorial) 문제는 그림을 다시 그리는 것이 아니라 왼쪽 화살표 키를 인식하지 못했기 때문입니다. 화살표 키와 같은 특수 키에 다른 키보드 기능을 작성해야했습니다.

지금 내 코드는 다음과 같습니다 그것은 작동합니다 : 당신의 도움에 대한

glutKeyboardFunc(processNormalKeys); 
glutSpecialFunc(processSpecialKeys); 

하지만 덕분에 어쨌든 :

void processNormalKeys (unsigned char key, int mx, int my) { 
    if (key == 'E') 
     exit(-1); 
} 

void processSpecialKeys (int key, int mx, int my) { 
    switch(key){ 
    case GLUT_KEY_LEFT : 
     x = x-5; 
     glutPostRedisplay(); 
     break; 
    case GLUT_KEY_RIGHT : 
     x = x+5; 
     glutPostRedisplay(); 
     break; 
    case GLUT_KEY_UP : 
     y = y+5; 
     glutPostRedisplay(); 
     break; 
    case GLUT_KEY_DOWN : 
     y = y-5; 
     glutPostRedisplay(); 
     break; 
    default: 
     break; 
    } 
} 

가 나는 또한 주요 기능을 조정했다!

0

glutPostRedisplay()을 사용 :

여기 내 코드입니다. 즉, myKeyboard 함수의 끝에서이 함수를 호출해야합니다.

원하지 않는 결과를 피하기 위해 이중 또는 3 중 버퍼를 사용하는 것이 좋습니다. 이중 버퍼의 경우 glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);으로 변경 한 다음 디스플레이 기능이 끝나면 glutSwapBuffers();을 추가해야합니다. 여기에서 자세한 정보를 찾을 수 있습니다 http://www.swiftless.com/tutorials/opengl/smooth_rotation.html.

+0

귀하의 제안을 시도했지만 여전히 작동하지 않습니다. – CGFoX

관련 문제