gpt4 book ai didi

c++ - 如何通过 windows.draw() 的容器制作动画?

转载 作者:搜寻专家 更新时间:2023-10-31 01:37:17 25 4
gpt4 key购买 nike

我有一个对象容器:

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com