试图用OpenGL制作Endless Runner C++

Trying to Make Endless Runner C++ with OpenGL

本文关键字:Endless Runner C++ 制作 OpenGL      更新时间:2023-10-16

我有一个像这样初始化的多维数据集对象数组(这里不使用索引 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();
}

但是,这是行不通的。最后一个立方体向左移动后,不会重置任何内容。

不确定您如何在此处使用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,或者该条件是否在另一种更新函数中?

因为您在评论中注意到game_object[5]->getPosition().x返回正确的值,所以最有可能的问题出在您的reset()函数和您正在使用的setPosition函数上。

1.首先检查设置位置是否正常工作

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

如果没有,setPosition有问题.

如果是这样,那么...

2. 您可能更改了位置,但未能渲染!这是一个非常普遍的问题,哈哈

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

3. 可扩展性的旁注

如果您最终有超过 5 个对象,则有一种更有效和可扩展的重置方法,方法是将它们的重置值放在数组中并循环遍历它们:

#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 ->这是一个错误吗?