al_draw_filled_rectangle() 似乎只适用于某些 类
al_draw_filled_rectangle() seems to work only in some classes
我正在尝试编写一个带有游戏循环的基本程序(它不能很快被称为游戏)。我拥有的几乎所有东西(坦率地说,并不多)都很好,只有我的渲染树中的一个对象没有渲染!
游戏循环:
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
class 中提取?
(注意:在启用 -Wall
的情况下,所有内容都在没有输出的情况下进行编译。在运行时,除了使用 cout
语句生成的内容之外,我也没有任何输出。)
如果没有 mcve,就无法真正推断出它,但是从显示的代码来看,假设 renderable->getChildren() returns a 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());
}
我正在尝试编写一个带有游戏循环的基本程序(它不能很快被称为游戏)。我拥有的几乎所有东西(坦率地说,并不多)都很好,只有我的渲染树中的一个对象没有渲染!
游戏循环:
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
class 中提取?
(注意:在启用 -Wall
的情况下,所有内容都在没有输出的情况下进行编译。在运行时,除了使用 cout
语句生成的内容之外,我也没有任何输出。)
如果没有 mcve,就无法真正推断出它,但是从显示的代码来看,假设 renderable->getChildren() returns a 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());
}