al_draw_filled_rectangle()似乎只在某些类

时间:2015-04-22 21:29:22

标签: c++ graphics game-loop allegro5

我正在尝试用游戏循环编写一个基本程序(它不能很快被称为游戏)。我所拥有的几乎所有东西(坦白地说都不是很好),只是渲染树中的一个对象无法渲染!

游戏循环:

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语句生成的内容之外,我也没有任何输出。)

1 个答案:

答案 0 :(得分:0)

实际上不能在没有mcve的情况下推断出来,但是从显示的代码中,假设可渲染 - &gt; 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());
}