使用opengl随机移动星号

时间:2019-02-04 17:00:45

标签: c++ opengl glfw glew

我正在尝试以随机方式移动星号。我传入一个星号向量作为参数,在方法开始时清除屏幕以防止多次绘制在屏幕上绘制的星号,如下所示:

enter image description here

但是,使用我编码的代码,所有星号都朝着同一方向移动。我需要使其随机运动,请帮忙。 以下是我的代码:

void Entity::move(GLFWwindow * window, vector<Entity> allAsteriods, Entity &sp ) {

    DrawEntity de = DrawEntity();

    while (!glfwWindowShouldClose(window)) {

        glClear(GL_COLOR_BUFFER_BIT);   

        for (int i = 0; i < allAsteriods.size(); i++) {

            glLoadIdentity();
            glMatrixMode(GL_MODELVIEW);

            float x = allAsteriods[i].return_PositionVector().back().get_X();
            float y = allAsteriods[i].return_PositionVector().back().get_Y();

            glPushMatrix();
            glTranslatef(x, y, 0.0); // 3. Translate to the object's position.

            de.drawEntity(allAsteriods[i]);

            float additionalX = GenerateRandom(0.10, 0.90);
            float additionalY   = GenerateRandom(0.10, 0.90);

            allAsteriods[i].addTo_PositionVector(x + additionalX, y + additionalY);       
            glPopMatrix();      
        }
        de.drawEntity(sp);

        // Swap front and back buffers
        glfwSwapBuffers(window);

        // Poll for and process events
        glfwPollEvents();
    }
}

1 个答案:

答案 0 :(得分:2)

您正在每帧向小行星添加一个随机位置(您可以看到它们在屏幕上向下移动时如何左右晃动)。您在X和Y方向上的随机位置都只有0.1到0.9,因此它们只会朝着屏幕的左下方移动。

要解决此问题,您需要执行以下操作:

  • 在您的Entity类内部,您需要存储一个与位置分开的Velocity向量。

  • 首次初始化小行星实体时,需要为它们随机分配一个速度,但是对于X和Y,您都需要从 -1到1选择一个速度:< / p>

allAsteroids[i].velocity.x = GenerateRandom(-1.0, 1.0)
allAsteroids[i].velocity.y = GenerateRandom(-1.0, 1.0) 
  • 在主游戏循环中,必须将速度添加到每帧的位置:
//Not sure why you're doing it like this - it should be easy to get X and Y from vectors, but I'll do it the same way:

float velX = allAsteriods[i].return_VelocityVector().back().get_X();
float velY = allAsteriods[i].return_VelocityVector().back().get_Y();

allAsteriods[i].addTo_PositionVector(x + velX, y + velY);

另外,您的

 glLoadIdentity();
 glMatrixMode(GL_MODELVIEW);

不应在所有小行星的循环中。在游戏循环的顶部,每帧只能执行一次。您的小行星循环应以glPushMatrix()开始,并以glPopMatrix()

结尾