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

标签 c++ sfml auto

我有一个对象容器:

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/

相关文章:

c++ - 使用 Cmake 和 Visual Studio 2013 Unresolved external 问题

c++ - C++ 中不熟悉的符号 [=]

c++ - 使用索引元素进行操作时,Range for 循环不起作用

c++ - 为什么删除分配的数组会导致内存错误?

c++ - 从并行数组返回值并在后面的函数中使用这些值

c++ - 屏幕没有清除最后的文字,为什么?

c++ - 具有未定义成员函数返回类型的模板实例化

c++ - auto 声明的变量有时是通过引用?

c++ - LibXL 加载文件失败

c++ - 模板类,函数特化