我正在尝试以随机方式移动星号。我传入一个星号向量作为参数,在方法开始时清除屏幕以防止多次绘制在屏幕上绘制的星号,如下所示:
但是,使用我编码的代码,所有星号都朝着同一方向移动。我需要使其随机运动,请帮忙。 以下是我的代码:
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();
}
}
答案 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()