gpt4 book ai didi

c++ - 使用opengl和c++使用动画(经过一段时间后一个一个地)翻译三角形

转载 作者:行者123 更新时间:2023-11-28 06:43:07 25 4
gpt4 key购买 nike

我想用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com