Я пытаюсь написать базовую программу с игровым циклом (в ближайшее время ее нельзя назвать игрой). Почти все, что у меня есть (что, честно говоря, немного), хорошо, только один объект в моем дереве рендеринга не рендерится!
Игровой цикл:
void Game::enterMainLoop() {
running = true;
double lastTime = al_get_time();
std::cout << "Entering main loop!" << std::endl;
while (running) { // Never mind the infinite loop. This isn't the final version
double current = al_get_time();
double timePassed = current - lastTime;
processInput();
processUpdatables();
processPhysicalObjects();
processRenderables();
update(timePassed);
physics(timePassed);
render(renderTree);
lastTime = current;
}
}
Я проверил, что он зацикливается правильно (и быстро — вызываемые методы мало что делают).
Game::render()
метод:
void Game::render(std::vector<IRenderable*> toRender) {
al_clear_to_color(al_map_rgb(0,0,90));
IRenderable *renderable;
for (std::vector<IRenderable*>::iterator it = toRender.begin(); it != toRender.end(); ++it) {
renderable = *it;
renderable->render();
render(renderable->getChildren());
}
al_draw_filled_rectangle(10, 10, 120, 120, al_map_rgb(255, 255, 255));
al_flip_display();
}
Я проверил один объект в дереве рендеринга render
метод вызывается (поставив cout
заявление в своем теле, которое печатает каждый кадр). Заполненный прямоугольник виден на экране.
Player::render
Метод сначала нарисовал квадрат (this.x, this.y)
с размерами this.width x this.height
, но я ничего не видел на экране, поэтому я упростил это до этого:
void Player::render() {
std::cout << "Player::render called! x: " << x << ", y: " << y << std::endl;
al_draw_filled_rectangle(120, 120, 120, 120, al_map_rgb(255, 255, 255));
}
Да, cout
оператор печатает каждый кадр, поэтому render()
метод вызывается правильно. Тем не менее я не вижу второй прямоугольник.
Почему я не могу извлечь из Player
учебный класс?
(Примечание: все компилируется без вывода с -Wall
включен. Во время выполнения у меня также нет никакого вывода кроме того, что я генерирую с cout
заявления.)
Это не может быть реально выведено без mcve, но из показанного кода и предполагая, что renderable-> getChildren () возвращает std :: vector, проблема наиболее вероятно связана с тем фактом, что после рендеринга одного из элементов вы всегда рекурсивно вызываете al_clear_to_color:
al_clear_to_color(al_map_rgb(0,0,90)); //1: clear screen
IRenderable *renderable;
for (std::vector<IRenderable*>::iterator it = toRender.begin(); it != toRender.end(); ++it) {
renderable = *it;
//renders one element
renderable->render();
//recurses and therefore reaches 1(clear screen) again(even if there are no children)
render(renderable->getChildren());
}