Попытка сделать Endless Runner C ++ с OpenGL - PullRequest
0 голосов
/ 12 апреля 2019

У меня есть массив объектов куба, инициализированных так (индекс 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 ]

1 голос
/ 12 апреля 2019

Не уверен, как вы используете 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 голосов
/ 13 апреля 2019

Поскольку в своем комментарии вы отметили, что game_object[5]->getPosition().x возвращает правильное значение, наиболее вероятная проблема связана с вашей функцией reset() и используемой вами функцией setPosition.

1. Проверьте, работает ли заданная позиция в первую очередь

Возможно, есть ошибка с setPosition(). После того, как вы установили положение с помощью setPosition(), а затем записали координаты объекта с помощью getPosition(), возвращается ли ожидаемая вами позиция?

Если нет, то что-то не так с setPosition.

Если так, то ...

2. Вы, вероятно, изменили позицию, но не смогли ее отрендерить! Это очень распространенная проблема 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 -> это ошибка?)

...