al_draw_filled_rectangle() 似乎只在某些类中有效

Posted

技术标签:

【中文标题】al_draw_filled_rectangle() 似乎只在某些类中有效【英文标题】:al_draw_filled_rectangle() seems to work only in some classes 【发布时间】:2015-04-22 21:29:22 【问题描述】:

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

游戏循环:

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 作为结果。 @PhilippLenk 这可能是部分原因,但并没有解决问题。在将循环和递归提取到自己的方法中后,我仍然看不到在 120、120 处绘制的正方形。将制作一个 mcve。 @PhilippLenk 对不起,我弄乱了我的测试方块的宽度,你正确地诊断出了问题。如果您发布答案,我会接受。非常感谢! 【参考方案1】:

如果没有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());

【讨论】:

以上是关于al_draw_filled_rectangle() 似乎只在某些类中有效的主要内容,如果未能解决你的问题,请参考以下文章