如何简化具有多个类的游戏循环
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 ...
答案
您应该创建一个抽象的基础类:
另一答案
您想得太多。
以上是关于如何简化具有多个类的游戏循环的主要内容,如果未能解决你的问题,请参考以下文章