尝试使用OpenGL制作Endless Runner C ++

时间:2019-04-12 09:25:57

标签: c++ opengl sfml

我有一个像这样初始化的多维数据集对象数组(此处不使用索引0,因为它用于播放器):

game_object[1] = new GameObject();
game_object[1]->setPosition(vec3(7.0f, 0.0f, 0.0f));

game_object[2] = new GameObject();
game_object[2]->setPosition(vec3(14.0f, 0.0f, 0.0f));

game_object[3] = new GameObject();
game_object[3]->setPosition(vec3(21.0f, 0.0f, 0.0f));

game_object[4] = new GameObject();
game_object[4]->setPosition(vec3(36.0f, 0.0f, 0.0f));

game_object[5] = new GameObject();
game_object[5]->setPosition(vec3(42.0f, 0.0f, 0.0f));

我有一个绘制它们的渲染函数:

glDrawElements(GL_TRIANGLES, 3 * INDICES, GL_UNSIGNED_INT, NULL);

在我的更新中,它们按预期移动到左侧。为此,我只是向其位置添加另一个向量:

for (int i = 1; i < MAX_CUBES; i++)
{
    game_object[i]->setPosition(game_object[i]->getPosition() + vec3(-0.03, 0.0, 0.00));
}

但是,我希望多维数据集重复此操作,直到用户退出游戏为止。我做了一个重置​​功能,将它们发送回初始位置:

void Game::reset()
{
    game_object[0]->setPosition(vec3(0.0f, 0.0f, 0.0f));
    game_object[1]->setPosition(vec3(7.0f, 0.0f, 0.0f));
    game_object[2]->setPosition(vec3(14.0f, 0.0f, 0.0f));
    game_object[3]->setPosition(vec3(21.0f, 0.0f, 0.0f));
    game_object[4]->setPosition(vec3(36.0f, 0.0f, 0.0f));   
    game_object[5]->setPosition(vec3(42.0f, 0.0f, 0.0f));
}

当最后一个立方体的位置不在屏幕左侧时,该函数将在更新中调用:

if (game_object[5]->getPosition().x <= 0.0)
{
    reset();
}

但是,这不起作用。最后一个立方体移到左侧后,没有任何重置。

2 个答案:

答案 0 :(得分:1)

不确定此处如何使用game_object,但看起来很容易出错。如果您有MAX_CUBES = 5(因为您有5个多维数据集),则该for循环将错过最后一个。添加更多对象(例如,用于间隙,垂直规则,危险等)将使其变得更加如此。

for (int i = 1; i < MAX_CUBES; i++)
{
    game_object[i]->setPosition(game_object[i]->getPosition() + vec3(-0.03, 0.0, 0.00));
}

如果MAX_CUBES = 5,它将移动索引1、2、3、4,而不是5,这是您在条件中检查的索引。 5会永久停留在42(是屏幕外吗?)。

单步调试器中的代码将使类似这样的问题变得很明显,并且是编程的重要工具。也许代码根本就没有到达if (game_object[5]->getPosition().x <= 0.0)检查?该更新函数中是否有任何return,或者该条件是否在某种其他条件中?

答案 1 :(得分:0)

由于在注释中您注意到game_object[5]->getPosition().x返回正确的值,所以最可能的问题是您的reset()函数和所使用的setPosition函数。

1。首先检查设置位置是否起作用

也许setPosition()出错。 使用setPosition()设置位置,然后使用getPosition()记录对象的坐标后,它是否返回您期望的位置?

否则,setPosition出了点问题。

如果是,那么...

2。您可能更改了位置,但是无法渲染! 这是一个非常普遍的问题大声笑

您很有可能更改了对象的位置但是没有更新屏幕上显示的内容!

3。扩展性注意事项

如果最终有五个以上的对象,可以通过将它们的重置值放置在数组中并循环遍历它们的方式,进行重置的方法更加有效且可扩展,

#define MAX_CUBES 6
double resetPositions_x[MAX_CUBES] = {0.0, 7.0, 14.0, 21.0, 36.0, 42.0};

void Game::reset()
{
    for(int i=0;i<MAX_CUBES;i++){
        game_object[i]->setPosition(vec3(resetPositions_x[i], 0.0f, 0.0f));
    }
}

(而且,每个x重置位置似乎都是7的倍数,除了36.0->,这是错误的吗?)