2015-04-22 4 views
0

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

+0

@PhilippLenk Возможно, это было частью дела, но это не решило проблему. После извлечения цикла и рекурсии в свой собственный метод я все еще не вижу квадрата, нарисованного на 120, 120. Сделает mcve. – 11684

+0

@PhilippLenk Извините, я испортил ширину своих тестовых площадей, вы правильно поставили диагноз проблемы. Если вы опубликуете ответ, я приму его. Большое спасибо! – 11684

ответ

0

Это наклоняет realiably выводится без mcve, а из кода показано, и при условии, renderable-> GetChildren() возвращает зЬй :: вектор, проблема наиболее Propably связана с тем, что после рендеринга один из элементов, которые вы всегда RECURSE и называем 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()); 
}