2017-04-11 11 views
1

openGlのglutTimerFuncを使用して5 msごとにすべての要素を再描画しています。また、を使用しています。問題は、何らかの理由でマウスクリックが発生するたびに表示機能が呼び出され、クリックするたびにアニメーションが速く、速くなることです。glutMouseFuncマウスイベントハンドラは、何もしなくても関数が再び呼び出されるようにします。

これらは、問題を引き起こしている方法と、コードの書き方です。

メイン

int main(int argc, char** argv) 
{ 
    glutInit(&argc, argv); 
    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE); 
    glutInitWindowSize((int)WINDOW_WIDTH, (int)WINDOW_HEIGHT); 
    glutInitWindowPosition(150, 10); 
    glutCreateWindow("OpenGl"); 
    glutDisplayFunc(display); 
    glutSpecialFunc(arrowKeyFunc); 
    glutSpecialUpFunc(arrowKeyUp); 
    glutReshapeFunc(reshape); 
    glutTimerFunc(10, ballMotionHandler, 0); 
    glutMouseFunc(mouseFunc); 
    glColor3f(1.0, 0, 0); 
    glutAttachMenu(GLUT_RIGHT_BUTTON); 
    glutMainLoop(); 
} 

表示

void display(void) 
{ 
    printf("tick\n"); 
    glClearColor(.3980f, .4001f, 0.7f, 1.0f); 
    glClear(GL_COLOR_BUFFER_BIT); 
    glPointSize(3); 
    drawRect(-1.0, 1.0f - TOP_BAR_HEIGHT, WINDOW_WIDTH, TOP_BAR_HEIGHT, getColor(.0, .0, .0)); 
    drawCircle(center.x + cw, center.y + ch, r, 800, getColor(1.3, .5, .00)); 
    drawRect(racket.x, racket.y, .49, .09, getColor(.760, .31, .19)); 
    ballMotionHandler(); 
    racketMotionHandler(); 
    glFlush(); 
    glutSwapBuffers(); 
    glutTimerFunc(5, mydisplay, 0); 
} 

MouseFunc

void mouseFunc(int button, int state, int x, int y) 
{ 
    mouse.x = x; 
    mouse.y = y; 
    if (button == GLUT_LEFT_BUTTON && state == GLUT_DOWN&&center.x == 0.0f) 
    { 
     float tmp = sqrtf(powf(((x - WINDOW_WIDTH/2)/(WINDOW_WIDTH/2) - center.x), 2) + powf(((y - WINDOW_HEIGHT/2)/(WINDOW_HEIGHT/2) - center.y), 2)); 
     cw = ((x - WINDOW_WIDTH/2)/(WINDOW_WIDTH/2) - center.x)/(ratio*tmp); 
     ch = -((y - WINDOW_HEIGHT/2)/(WINDOW_HEIGHT/2) - center.y)/(ratio*tmp); 
     cw *= pow(1.125, level); 
     ch *= pow(1.125, level); 
     printf("\nspeed of ball when <level = %d> equal %f", level, sqrtf(powf(cw, 2) + powf(ch, 2))); 
    } 

} 

私は畝を左クリックするたびにseボタンの 'tick'は5 msごとにもう一度印刷されます(私は1000 msでテストしましたので、わかります)。最初は2回目のクリック、3回目の2回目のクリック、5msごとの1回目のチックです。

この原因は何ですか? glutTimerFunc(またはglutIdleFunc!)を使用するよりも良い解決策がありますか?

答えて

1

しないでください、あなたのglutDisplayFunc()コールバックでタイマーを再腕、やること、あなたのglutTimerFunc()コールバックで:

void timer(int value) 
{ 
    glutPostRedisplay(); 
    glutTimerFunc(16, timer, 0); 
} 
関連する問題