Перемещение астероидов случайным образом с помощью opengl - PullRequest
0 голосов
/ 04 февраля 2019

Я пытаюсь перемещать астероиды случайным образом.Я передаю вектор астероидов в качестве параметра, очищая экран в начале метода, чтобы избежать многократного рисования астероидов, нарисованных на экране, так:

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 голосов
/ 04 февраля 2019

Вы добавляете случайную позицию к вашим астероидам в каждом кадре (вы можете видеть, как они покачиваются при движении вниз по экрану).Ваши случайные позиции составляют только от 0,1 до 0,9 в X и Y, поэтому они будут двигаться только к левому нижнему краю экрана.

Чтобы исправить это, вам нужно сделать следующее:

  • Внутри вашего класса сущностей вам нужно хранить вектор Velocity отдельно от позиции.

  • Когда вы впервые инициализируете свои астероидные сущности, вам нужно случайным образомназначьте им скорость, НО вам нужно выбрать скорость от -1 до 1 для X и Y :

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()

...