Я пытаюсь написать базовую программу с игровым циклом (ее нельзя назвать игрой в ближайшее время). Почти все, что у меня есть (что мало, честно), прекрасно, только один объект в моем дереве рендеринга не отображает!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
ведомостями)
Я не могу сказать точно без [mcve] (http: // stackoverflow .com/help/mcve), но из показанного кода и при условии, что renderable-> getChildren() возвращает std :: vector, проблема связана с тем, что после рендеринга одного из элементов вы всегда recurse и вызовите al_clear_to_color в результате. –
@PhilippLenk Возможно, это было частью дела, но это не решило проблему. После извлечения цикла и рекурсии в свой собственный метод я все еще не вижу квадрата, нарисованного на 120, 120. Сделает mcve. – 11684
@PhilippLenk Извините, я испортил ширину своих тестовых площадей, вы правильно поставили диагноз проблемы. Если вы опубликуете ответ, я приму его. Большое спасибо! – 11684