Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/134.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 每次移动时刷新显示(速度)(openGL)_C++_Opengl_Game Physics - Fatal编程技术网

C++ 每次移动时刷新显示(速度)(openGL)

C++ 每次移动时刷新显示(速度)(openGL),c++,opengl,game-physics,C++,Opengl,Game Physics,在Opengl中,有一个函数dance(),我想移动一个对象,刷新屏幕,然后再次移动,这样看起来像是对象在不断移动。现在它所做的只是移动很多,然后刷新屏幕 这是我的主要表现: void window::main () { static int argc = 0; glutInit (&argc, nullptr); glutInitDisplayMode (GLUT_RGBA | GLUT_DOUBLE); glutInitWindowSize (window::width, w

在Opengl中,有一个函数
dance()
,我想移动一个对象,刷新屏幕,然后再次移动,这样看起来像是对象在不断移动。现在它所做的只是移动很多,然后刷新屏幕

这是我的主要表现:

void window::main () {
 static int argc = 0;
 glutInit (&argc, nullptr);
 glutInitDisplayMode (GLUT_RGBA | GLUT_DOUBLE);
 glutInitWindowSize (window::width, window::height);
 glutInitWindowPosition (128, 128);
 glutCreateWindow (sys_info::execname().c_str());
 glutCloseFunc (window::close);
 glutEntryFunc (window::entry);
 glutDisplayFunc (window::display);
 glutReshapeFunc (window::reshape);
 glutKeyboardFunc (window::keyboard);
 glutSpecialFunc (window::special);
 glutMotionFunc (window::motion);
 glutPassiveMotionFunc (window::passivemotion);
 glutMouseFunc (window::mousefn);
 glutMainLoop();
 } 
这是我的显示代码:

void window::display() {
 glClear (GL_COLOR_BUFFER_BIT);
 for (auto& object: window::objects) object.draw();
 objects.at(selected_obj).draw_border();
 mus.draw();
 glutSwapBuffers();
}
这是我的移动代码:

 void move (GLfloat delta_x, GLfloat delta_y) {
     //center pertains to the object that is drawn
     center.xpos += delta_x;
     center.ypos += delta_y;
  }
现在是我的舞蹈代码:

  static void dance(){
     int x =0; int y=0;
     for(;;){
       int r1 = rand() % 100;
       int r2 = rand() %100;
       vertex v = objects.at(selected_obj).get_vertex();
       if(v.xpos >= width) break;
       if(v.ypos >= height) break;
       x=move_pixels+r1; y=move_pixels+r2;
       objects.at(selected_obj).move(x,y);
       glutPostRedisplay();
      }
    }

在我的
dance()。但是,它只是一次移动所有对象,并在完成后进行更新。

glutPostDisplay
只是设置一个标志,即在事件循环的下一次迭代时,应该调用display函数


以下是事件驱动编程最重要的规则:绝不将定时动作(如动画)放入“回放”循环中,循环播放整个动画,然后再返回事件系统。在您的情况下,您必须将
dance
函数分解为一个空闲函数,每次处理完所有挂起事件(包括重画)后都会调用该函数。然后,您可以进入下一步更新动画并发出重画。

我现在设置动画的方式是,每当按下键盘上的箭头时,都会调用
move()
。那么,我如何在不使用循环的情况下多次调用
move()
,使其模拟连续的移动呢?@Lou:使用glutIdleFunc,您可以注册一个函数,该函数在没有其他操作时被调用。
dance
函数的内部循环(没有实际循环)非常适合空闲。当然,您必须将状态放入全局变量中。在事件处理程序中,设置控制空闲操作的标志。另一种方法是抛弃过剩,而是使用一个可以直接控制事件循环的框架。