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

标签 c++ opengl animation glut

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

相关文章:

c++ - 无法链接 GLEW 库

c++ - VAO 不渲染

javascript - 使用 jQuery fadeOut() 缩放动画

c - 究竟什么是图形上下文?

javascript - js 悬停动画不起作用

ios - UITextView 文本 - 从上到下动画文本

c++ - 在 C++ 中定义多个组合对象的最佳方式?

c++ - 优化成员变量访问

c++ - 使用 'overloaded' lambdas 在函数中使用 std::array

c++ - 使用c++在windows中进行两种方式的父子通信