如何在两个磁盘的移动之间添加延迟



我目前正在OpenGL中执行一项任务,我应该做的是制作两个磁盘,然后当我在屏幕上移动光标并单击时,这两个磁盘应该移动到我单击窗口的位置,但诀窍是两个磁盘不应该一起移动。第一个磁盘应该移动,然后经过一小段延迟后,第二个磁盘应该会移动。现在,我已经能够在单击时使两个磁盘一起移动。我想知道的是,我应该如何在两个磁盘的移动中添加延迟。请帮忙!这是我当前的代码。谢谢

编辑:这是我在实现了您所说的内容之后更新的代码,现在没有一个磁盘在移动。如果你理解问题,否则很好,谢谢你的帮助:)

#include <math.h>
#include <cstdlib>
#include <glut.h>
typedef struct _Vector
{
    double x,y,z;
} Vector;
const int W_SCREEN = 1366;
const int H_SCREEN = 768;
const double PI = 3.14159265;
GLUquadric *qobja;
double speed = 10;
double radian;
double rot;
Vector pos2;
Vector pos;
Vector vel;
Vector dis;
Vector dir;
Vector mousecoords;
void mouse(int button, int state, int x , int y)
{
    mousecoords.x = x - W_SCREEN/2;
    mousecoords.y = -y + H_SCREEN/2;
}
void move()
{
    dis.x = mousecoords.x - pos.x;
    dis.y = mousecoords.y - pos.y;
    if(sqrt(dis.x*dis.x + dis.y*dis.y) < speed)
    {
        pos.x = mousecoords.x;
        pos.y = mousecoords.y;
        pos2.x = mousecoords.x;
        pos2.y = mousecoords.y;
    }
    else
    {
        radian = atan2(dis.y,dis.x);
        pos.x += cos(radian)*speed;
        pos.y += sin(radian)*speed;
        pos2.x += cos(radian)*speed;
        pos2.y += sin(radian)*speed;
    }
}
void moveSecondDisk(int value)
{
    // Code that moves (updates coordinates) of second disk
    move();
    glutPostRedisplay();
}
void moveFirstDisk(int value)
{
    // Code that moves (updates coordinates) of first disk
    move();
    glutPostRedisplay();
    unsigned int secondDiskDelay = 5000;
    glutTimerFunc(secondDiskDelay, moveSecondDisk, 0);
}
void display(void)
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glLoadIdentity();
    glOrtho(-W_SCREEN/2,W_SCREEN/2,-H_SCREEN/2,H_SCREEN/2,-100,100);
    qobja = gluNewQuadric();
    gluQuadricNormals(qobja, GLU_SMOOTH);
    glPushMatrix();
    glColor3f(0,0,0);
    glTranslated(pos.x,pos.y,0);
    gluCylinder(qobja,25,50,0,100,100);
    glPopMatrix();
    glPushMatrix();
    glColor3f(0,0,0);
    glTranslated(pos2.x,pos2.y,0);
    gluCylinder(qobja,50.5,65,0,100,100);
    glPopMatrix();
    /*glPushMatrix();
    glColor3f(0,0,0);
    glTranslated(pos.x,pos.y,0);
    gluCylinder(qobja,65.5,80,0,100,100);
    glPopMatrix();
    glPushMatrix();
    glColor3f(0,0,0);
    glTranslated(pos.x,pos.y,0);
    gluCylinder(qobja,80.5,90,0,100,100);
    glPopMatrix();
    glPushMatrix();
    glColor3f(0,0,0);
    glTranslated(pos.x,pos.y,0);
    gluCylinder(qobja,90.5,100,0,100,100);
    glPopMatrix();
    glPushMatrix();
    glColor3f(0,0,0);
    glTranslated(pos.x,pos.y,0);
    gluCylinder(qobja,100.5,110,0,100,100);
    glPopMatrix();
    glPushMatrix();
    glColor3f(0,0,0);
    glTranslated(pos.x,pos.y,0);
    gluCylinder(qobja,110.5,120,0,100,100);
    glPopMatrix();
    glPushMatrix();
    glColor3f(0,0,0);
    glTranslated(pos.x,pos.y,0);
    gluCylinder(qobja,120.5,130,0,100,100);
    glPopMatrix();
    glPushMatrix();
    glColor3f(0,0,0);
    glTranslated(pos.x,pos.y,0);
    gluCylinder(qobja,130.5,140,0,100,100);
    glPopMatrix();
    glPushMatrix();
    glColor3f(0,0,0);
    glTranslated(pos.x,pos.y,0);
    gluCylinder(qobja,140.5,150,0,100,100);
    glPopMatrix();
    glPushMatrix();
    glColor3f(0,0,0);
    glTranslated(pos.x,pos.y,0);
    gluCylinder(qobja,150.5,160,0,100,100);
    glPopMatrix();
    glPushMatrix();
    glColor3f(0,0,0);
    glTranslated(pos.x,pos.y,0);
    gluCylinder(qobja,160.5,170,0,100,100);
    glPopMatrix();*/
    glFlush();
    glutSwapBuffers();
    glutPostRedisplay();
}
void init(void)
{
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
    glutInitWindowSize(W_SCREEN,H_SCREEN);
    glutCreateWindow("ORCA WHALE SIMULATION");
    glutDisplayFunc(display);
    glutMouseFunc(mouse);
    unsigned int firstDiskDelay = 2000;
    glutTimerFunc(firstDiskDelay, moveFirstDisk, 0);
    glClearColor(1,1,1,1);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glMatrixMode(GL_MODELVIEW);
}
int main(int argc, char** argv)
{
    glutInit(&argc, argv);
    init();
    glutMainLoop();
    return(0);
}

使用计时器来完成此操作。创建一个函数来移动具有以下签名的第二个磁盘:

void moveSecondDisk(int value);

然后,执行移动第一个磁盘的代码。最后,调用函数glutTimerFunc,将函数moveSecondDisk作为回调传递给它(第二个参数)。第一个参数是两个光盘移动之间的延迟(以毫秒表示),第三个参数是传递给回调函数的值。请注意,您可以将复杂数据传递给回调函数,方法是将指向复杂结构(或对象)的指针作为整数传递,然后在回调函数中将其强制转换回所需类型。有关更多信息,请查看以下链接:

https://www.opengl.org/resources/libraries/glut/spec3/node64.html

https://www.opengl.org/discussion_boards/showthread.php/170990-glutTimerFunc

编辑:更详细的解释:

void movePos()
{
    // Code that only modifies pos
    ...
}
void movePos2()
{
    // Code that only modifies pos2
    ...
}
void moveSecondDisk(int value)
{
    movePos2();
    glutPostRedisplay();
}
void moveFirstDisk(int value)
{
    movePos();
    glutPostRedisplay();
    unsigned int secondDiskDelay = 200;
    glutTimerFunc(secondDiskDelay, moveSecondDisk, 0);
    glutTimerFunc(300, moveFirstDisk, 0);
}
void init()
{
    ...
    unsigned int firstDiskDelay = 50;
    glutTimerFunc(firstDiskDelay, moveFirstDisk, 0);
    ...
}

最新更新