Как мне вызвать функцию обратного вызова дисплея в другой функции, чтобы моя функция таймера также могла выполняться?

#c #glut

#c #перенасыщение

Вопрос:

У меня есть функция отображения, которая рисует круг, и у меня есть функция обновления, с помощью которой я перемещаю круг вдоль оси y. Как только круг достигнет нижней части окна, я хочу нарисовать новый круг вверху и переместить этот круг таким же образом, как предыдущий.. Как мне это сделать?

 void display(void)
{
 int i;
 flag=0;
 glPointSize(2.0);
 glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
 disp2();
 glFlush();
}


void update(int a)
{
  if(y1center>=100)
  {
                      y1center-=5;
                      glutPostRedisplay();
                      glutTimerFunc(40,update,0);
  }
  else
  {
      y1center=950;
      glutDisplayFunc(display);
      //glutPostRedisplay();
      display();
  }
}
  

Это то, что я пытался сделать в функции обновления, но это не сработало. Он просто нарисовал новый круг вверху, но этот круг не перемещается..
disp2 () рисует круг

Ответ №1:

Вероятно, это приводит к сбою, потому что ваша функция обновления не сообщает glut о повторном вызове функции обновления через 40 мс (glutTimerFunc), поэтому, как только это произошло в else, функция обновления больше ничего не делает.

В любом случае, я внес несколько небольших изменений, которые должны изменить эту работу / создать следующую функцию обновления:

 void update(int a)
{
  if(y1center>=100)
  {
        y1center-=5;      
  }
  else
  {
        y1center=950;      
  }  

  glutTimerFunc(40,update,0);
  glutPostRedisplay();
}
  

Ответ №2:

В функции обновления, если вы попадаете в else (y1center < 100), вы не будете регистрировать таймер снова (вызов glutTimerFunc(40,update, 0)).