如何简化具有多个类的游戏循环

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何简化具有多个类的游戏循环相关的知识,希望对你有一定的参考价值。

对于我当前的项目,我有几个定义游戏级别的类。所有级别都具有以下形式:

class Level1
{
public:
    Level1(int initialFrame);
    void update(int frameCount, sf::RenderWindow* renderWindow);
    void draw(sf::renderWindow* renderWindow);
    bool finished;
};

请注意,这些功能的更新和绘制的定义在各个级别之间都不相同。在主循环中,我的循环看起来像这样:

int main()
{
    sf::RenderWindow renderWindow();

    frames = 0;
    progress = 0;

    Level1* level1 = new Level1(0);
    Level2* level2 = 0;
    Level3* level3 = 0;
    while (true) // Not actually like this, just put it here to illustrate my point
    {
        renderWindow.clear()

        if (progress == 0)
        {
            level1->update(frames, &renderWindow)
            level1->draw(&renderWindow)
            if (level1->finished)
            {
                delete level1;
                progress++;
                level2 = new level2(frames);
            }
        }

        if (progress == 1)
        {
            level2->update(frames, &renderWindow)
            level2->draw(&renderWindow)
            if (level2->finished)
            {
                delete level2;
                progress++;
                level3 = new level3(frames);
            }
        }

        if (progress == 2)
        {
            level3->update(frames, &renderWindow)
            level3->draw(&renderWindow)
            if (level3->finished)
            {
                delete level3;
                progress++;
            }
        }

        frames++;
        renderWindow.display();
    }
}

所以我想简化这一点,因为我不断重复运行类似的代码块。为了解决这个问题,我创建了一个这样的模板:

template <class T>
void loop(T level, int frameCount, sf::RenderWindow* renderWindow, int* progress)
{
    level->update(frameCount, renderWindow);
    level->draw(renderWindow);
    if (level->finished)
    {
        delete level;
        *progress++;
    }
}

这部分起作用,但是我仍然坚持如何做,a)在模板中完成一个级别时初始化下一个级别,b)如何在我的游戏循环中实现模板功能而不使用进度检查,以及像以前一样在每个级别中手动编程。理想情况下,我希望按照播放顺序的顺序列出一系列级别,并且进度可以索引我正在使用哪个循环,但是我不确定如何实现。

对于我当前的项目,我有几个定义游戏级别的类。所有级别都具有以下形式:class Level1 {public:Level1(int initialFrame); void update(int ...

答案

您应该创建一个抽象的基础类:

另一答案

您想得太多。

以上是关于如何简化具有多个类的游戏循环的主要内容,如果未能解决你的问题,请参考以下文章

具有多个对象回调的游戏循环 - 第二个对象没有任何反应

如何简化具有多个 id 的 JS

CUDA:并行化具有嵌套循环的函数调用的多个嵌套for循环

如何在游戏循环中使用 addEventListener

具有多个类的泛型

如何创建具有从 csv 文件中的列表收集的唯一名称值的类的多个对象