我有一个对象容器:
std::vector<sf::Drawable> gameObjects;
我的目标是迭代这些对象并绘制它们:
for (auto it : gameObjects)
{
window.draw(*it);
}
您可以假设这些方法已经实现。我所说的“动画”是什么意思:我希望一次绘制一个对象,而不是立即绘制所有对象。
void Run::render()
{
window.clear(colorWindow);
for (auto it : gameObjects)
{
window.draw(*it);
}
window.display();
}
也就是说,让每个 render() 在容器中绘制一个附加对象。你知道我该怎么做吗?预先感谢您。
编辑:我尝试了一些非常规的方法 - 我认为这不是很好的做法,但它有效:
int count = 0;
int countReset = 1;
...
while (countReset > count)
{
objects.at(count++).draw(window);
}
countReset++;
count = 0;
最佳答案
您永远不应该在渲染中做出有关游戏的决定。您应该在某个地方有一个更新方法,它可以决定输入和时间流逝如何影响您的游戏世界。渲染应该只做一件事:渲染。没有决策,没有数据操纵。
例如,您可以使用复合类来指示应绘制哪个对象,或者您可以从 sf::Drawable 派生自己的基类并实现 bool IsVisible() const;
方法。不管怎样,是否绘制的决定是在其他地方做出的,渲染只是执行具体渲染内容的命令:
struct MaybeDrawn
{
bool IsVisible;
sf::Drawable Object;
};
...
std::vector<MaybeDrawn> gameObjects;
...
void Run::render()
{
window.clear(colorWindow);
for (auto it : gameObjects)
{
if(it->IsVisible)
{
window.draw(it->Object);
}
}
window.display();
}
您决定如何以及何时将 bool 设置为 true
应该在您的 Update/ChangeWorld 方法中进行。也许你想看看 here有关如何构建游戏以及如何构建计时器的一般描述。
或者,您可以保留程序不变,并在决策方法中的 vector 中插入和/或删除。
关于c++ - 如何通过 windows.draw() 的容器制作动画?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34379350/