我想在opengl中制作一个太空入侵者游戏。所以我想到用三角形创造敌人。在制作游戏之前,我想试试动画。我有三角形。我想用动画将它翻译成某个点(即三角形在一段时间后被翻译。它应该看起来好像在移动)。在到达左边的某个点后,我想把它翻译成同样的位置或距离正确。该过程应该继续,直到屏幕打开。我用过睡眠功能。但它没有用。没有显示动画。仅在不同的平移位置绘制平移的三角形。帮助我。
这是我的代码 -
#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;
}
答案 0 :(得分:1)
在main()
中,您已将display()
声明为display callback function。当GLUT确定需要重新绘制窗口或者例如通过函数glutPostRedisplay()
重新绘制窗口时,它将调用此函数。
显示功能应该在特定时间点调用重绘窗口。 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
}
在发布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();
}
然后它以动画方式工作!