尝试使用OpenGL制作无尽的Runner C ++

问题描述 投票:-1回答:2

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

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

c++ opengl sfml
2个回答
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,或者是某种类型中的另一种情况?


0
投票

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

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

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

如果没有,setPosition有问题。

如果是的话,那么......

你可能改变了位置但未能渲染它!这是一个非常常见的问题lol

您更改对象位置的可能性非常高但未更新屏幕上显示的内容!

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

© www.soinside.com 2019 - 2024. All rights reserved.