gpt4 book ai didi

c++ - 如何使用多个类简化游戏循环

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:01:42 25 4
gpt4 key购买 nike

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

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 Level
{
public:
Level(int initialFrame);
virtual ~Level();

virtual void update(int frameCount, sf::RenderWindow* renderWindow) = 0;
virtual void draw(sf::renderWindow* renderWindow) = 0;

bool finished;
};

并让你所有的关卡都继承自这个类:

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

然后根据当前进度在它们之间交换。

Level* currentLevel = new Level1(0);
...
while (true)
{
currentLevel->update(frames, &renderWindow)
currentLevel->draw(&renderWindow)

if (currentLevel->finished)
{
delete currentLevel;
progress++;
switch(progress)
{
case 1: currentLevel = new Level2(...); break;
case 2: currentLevel = new Level3(...); break;
case 3: currentLevel = new Level4(...); break;
...
}
}

因此,您可以为自己节省一些 if block 。

关于c++ - 如何使用多个类简化游戏循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58657279/

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