OpenGL glutIdleFunc 动画

Posted

技术标签:

【中文标题】OpenGL glutIdleFunc 动画【英文标题】:OpenGl glutIdleFunc Animation 【发布时间】:2018-10-06 17:36:26 【问题描述】:

我的问题

我还在学习opengl,正在做一个类似小鸡入侵者的游戏。我正在尝试做的是有一个类似于带有一些恒星和星系的鸡入侵者的背景。我使用一个与我添加纹理的屏幕大小相同的四边形来做到这一点。到目前为止一切都很好,但我现在正试图将这个星系背景向下平移,这样宇宙飞船和小鸡就好像它们在太空中前进一样。我的想法是使用 glutIdleFunc() 函数,在每次迭代中,我应该先休眠 30 毫秒,然后更新银河背景,以便每行像素向下移动 1 行,最后一行复制到第一行。问题是这种方法在大约 15 秒内可以正常工作,然后程序完全停止,我的计算机挂起并冻结到我需要重新启动我的电脑的程度。我认为每次调用 glutIdleFunc() 时,我的方法都需要大量操作。我在网上搜索了遇到类似情况的人,但没有找到类似的帖子。

代码:

主函数

int main(int argc, char** argr) 
   glutInit(&argc, argr);

   glutInitWindowSize(SCREEN_WIDTH, SCREEN_WIDTH);

   // background is a global variable that contains the bitmap array
   int err = load_image("Art/background.bmp", &background);
   if(err)
   
       fprintf(stderr, "%d\n", err);
       exit(1); 
   

   glutCreateWindow("OpenGL - 2D Template");
   glutDisplayFunc(Display);
   glutMotionFunc(mo);
   glutMouseFunc(mou);

   glutIdleFunc(Animate);
   glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
   glClearColor(1.0f, 1.0f, 1.0f, 0.0f);
   gluOrtho2D(0.0, 1000, 0.0, 600);

   glutMainLoop();

动画

void Animate(void)

    msleep(300);
    translate_image(&background, 30);
    glutPostRedisplay();

void translate_image(image_t* img, const int c)

    uint32_t copy[img->height][img->width];
    for(int i = 0; i < img->height; i++)
    
        for(int j = 0; j < img->width; j++)
        
            copy[i][j] = img->data[i * img->width + j];
        
    

    for(int i = 0; i < img->height; i++)
    
        for(int j = 0; j < img->width; j++)
        
            int index = (i + c) % img->height;
            img->data[index * img->width + j] = copy[i][j];
        
    

显示功能

void Display() 
    glClear(GL_COLOR_BUFFER_BIT);
    glEnable(GL_TEXTURE_2D);
    texture = glInitTexture(background);
    drawImage(texture, 0.0f, 0.0f, background.width, background.height);
    glDisable(GL_TEXTURE_2D);

    drawSpaceShip();


    glFlush();



主要问题

有没有一种更有效的方法来做同样的事情,即每次运行时都冻结我的计算机?

【问题讨论】:

【参考方案1】:

您不必复制图片内容。只需为纹理坐标设置动画即可,您可以使用该坐标将图片映射到四边形。

您也必须glutCreateWindow 之前调用glutInitDisplayMode 以使其生效。此外,您不想要一个单缓冲帧缓冲区,而是一个双缓冲帧缓冲区 GLUT_DOUBLE 而不是 GLUT_SINGLE 并调用 glutSwapBuffers 而不是 glFinish

【讨论】:

以上是关于OpenGL glutIdleFunc 动画的主要内容,如果未能解决你的问题,请参考以下文章

OpenGL glut库

根据使用 GLUT/OpenGL 所经过的时间移动我的相机时遇到了一个小问题

在 C++ 中的 glutIdleFunc() 中变量值未递增

opengl 库glew

OpenGL学习入门

OpenGL学习之路——安装