2014-08-28 70 views
0

我想在opengl中制作一个太空入侵者游戏。所以我想用三角形来创造敌人。在制作游戏之前,我想用动画试试我的手。我有三角形。我想用动画将它左移到某个点上(也就是说,三角形在一定的时间间隔后被翻译出来,它应该看起来好像正在移动)。在到达左边的某个点之后,我想要将它翻译回原来的位置位置或一些距离。这个过程应该继续直到屏幕打开。我使用了睡眠功能。但它不起作用。没有显示动画。只有翻译后的三角形绘制在不同的翻译位置。帮我。用opengl和C++使用动画(间隔一段时间后)逐个翻译一个三角形

这里是我的代码 -

#include "windows.h" 
#include <gl/glut.h> 
#include<stdio.h> 

void init(void) 
{ 
    printf("OpenGL version: %s\n", (char*)glGetString(GL_VERSION)); 
    printf("OpenGL renderer: %s\n", (char*)glGetString(GL_RENDERER)); 

    //Configure basic OpenGL settings 

    glClearColor(1.0, 1.0, 0.0, 0.0); 
    glMatrixMode(GL_PROJECTION); 
    gluOrtho2D(0.0,640.0,0.0,480.0); 
    glColor3f(1.0,0.0,0.0); 
glPointSize(3); 
} 

void house(int x, int y,int z) 
{ 
    glPushMatrix(); 
    glTranslatef(x, y,z); 
    glBegin (GL_LINES);  
    glVertex2i (0,30); 
    glVertex2i (15,60); 
     glVertex2i (15,60); 
     glVertex2i (30,30); 
     glVertex2i (30,30); 
     glVertex2i (0,30); 
     glEnd(); 
     //Sleep(200); 
    glPopMatrix(); 
    //glutSwapBuffers(); 
} 


// Main drawing routine. Called repeatedly by GLUT's main loop 
void display(void) 
{ 
    //Clear the screen and set our initial view matrix 

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); 


    int i; 
    for(i = 10; i < 350; i = i + 50) 
    { 
    house(i,20,0); 
    Sleep(200); 
    } 

    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); 
glFlush(); 

} 

// Entry point - GLUT setup and initialization 
int main(int argc, char** argv) 
{ 

    glutInit(&argc, argv); 
    glutInitDisplayMode (GLUT_DEPTH | GLUT_SINGLE| GLUT_RGB); 
    glutInitWindowSize (800, 600); 
    glutInitWindowPosition (100, 100); 
    glutCreateWindow("OpenGL Test"); 

    glutDisplayFunc(display); 


    init(); 

    glutMainLoop(); 

    return 0; 
} 

回答

1

main()你已经宣布你display()display callback function。当GLUT确定窗口需要重画或者通过函数glutPostRedisplay()告诉重绘它时,GLUT将调用该函数。

显示功能预计会调用在特定时间点重新绘制窗口。 glFlush()将强制执行GL命令。

问题是你的动画循环是在重绘函数内部,并且在最后调用glFlush(),一次显示结果。你不告诉GLUT重新绘制窗户。这就是为什么你看不到动画。

为了本教程的目的,我建议您为房屋图纸的初始位置定义一个全局变量。当然,只要你明白这一切是如何工作的,你就必须改善这一点。

static int pos = 10; // temporary work around, just for the demo 

然后定义一个定时器函数,它在一段时间间隔后被调用。这将是动画的核心,组织移动,窗口重绘通过调用glutPostRedisplay()

void timerfunc(int value) // handle animation 
{ 
    pos += 50;    // update the postion 
    if (pos<350)    // as in your originial loop 
     glutTimerFunc(200, timerfunc, 0); // plan next occurence 
    glutPostRedisplay();  // redraw the window 
} 

Activate your timer function,在main()刚刚推出glutMainLoop()前:

glutTimerFunc(200, timerfunc, 0);  // call a timer function 
glutMainLoop();      // this call is already in your code 

你的显示功能然后改为:

void display(void) 
{ 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); 
    house(pos, 20, 0); // draw the house at its last calculated position 
    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); 
    glFlush(); 
} 

然后它在动画模式下工作!

+0

你可以请我提供一些算法或代码来做到这一点?这也是一个三角形。我将如何翻译三角形的数组? – user3757558 2014-08-28 19:17:17

+0

谢谢....我会看到它。如果我有一个三角形的瓷砖,即排列成瓷砖的三角形(使用视口和世界窗口),那么我将如何移动这些瓷砖左和写太空入侵者的敌人一样写。你能给我一些提示吗? – user3757558 2014-08-29 02:42:53