al_draw_filled_rectangle (), кажется, работает только в некоторых классах

Я пытаюсь написать базовую программу с игровым циклом (в ближайшее время ее нельзя назвать игрой). Почти все, что у меня есть (что, честно говоря, немного), хорошо, только один объект в моем дереве рендеринга не рендерится!

Игровой цикл:

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 заявления.)

0

Решение

Это не может быть реально выведено без 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());
}
0

Другие решения


По вопросам рекламы [email protected]