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

时间:2015-11-30 11:44:52

标签: c++ visual-studio-2010 opengl

我目前正在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);
}

1 个答案:

答案 0 :(得分:0)

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

sqlite3.enable_callback_tracebacks(True)

然后,执行移动第一个磁盘的代码。最后,调用函数SELECT* from <table name> WHERE rownum <= 10; ,将函数<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" xmlns:xalan="http://xml.apache.org/xslt" xmlns="http://www.w3.org/1999/xhtml"> <xsl:template match="/"> <xsl:text disable-output-escaping='yes'>&lt;!DOCTYPE html&gt;</xsl:text> <html> <head> <title>XSL Web Page</title> <link rel="stylesheet" href="/reporting/css/responsive.css" /> <meta name="viewport" content="width=device-width, initial-scale=1" /> <META HTTP-EQUIV="Pragma" CONTENT="no-cache" /> <META HTTP-EQUIV="Expires" CONTENT="-1" /> </head> <xsl:choose> <xsl:when test="//REDIRECT"> <script language="JavaScript"> parent.location.replace(" <xsl:value-of select="//REDIRECT" /> "); </script> </xsl:when> <xsl:otherwise> <xsl:choose> <xsl:when test="//NOACCESS"> <body class="container" bgcolor="#FFFFFF" text="#000000" leftmargin="5" marginwidth="5" padding="5"> <xsl:if test="//NOFEECHARGESFOUNDERROR"> <br /> <br /> <br /> <br /> <div border="0" class="WHITEBG col-sm-12 col-md-10" align="center"> <font color="red" size="+2"> <xsl:value-of select="//NOFEECHARGESFOUNDERROR/@message" /> </font> </div> ---------- Contents of the page--------- ---------- Contents of the page--------- </xsl:template> </xsl:stylesheet> 作为回调(第二个参数)传递给它。第一个参数是移动两个光盘之间的延迟(以毫秒表示),第三个参数将是传递回调函数的值。请注意,您可以通过将指针作为整数传递给复杂结构(或对象),然后将其转换回回调函数中的所需类型,将复杂数据传递给回调函数。有关详细信息,请查看以下链接:

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

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

编辑: 更详细的解释:

void moveSecondDisk(int value);