我想用 opengl 制作一个太空入侵者游戏。所以我想到用三角形来创建敌人。在制作游戏之前,我想尝试一下动画。我有三角我想用动画将它向左平移到某个点(即,三角形在一段时间后平移。它应该看起来好像在移动)。到达左侧的某个点后,我想将它平移回原来的位置位置或一些距离正确。这个过程应该一直持续到屏幕打开。我使用了 sleep 功能。但它不起作用。不显示动画。只有平移的三角形被绘制在不同的平移位置。帮助我。
这是我的代码-
#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;
}
最佳答案
在 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
}
Activate your timer function ,在启动 glutMainLoop()
之前的 main()
中:
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();
}
然后它以动画方式工作!
关于c++ - 使用opengl和c++使用动画(经过一段时间后一个一个地)翻译三角形,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25553556/