我没有做过任何大型游戏开发项目,只是搞乱了小玩具项目.但是,我从未找到对特定设计问题的直观答案.也就是说,如何在游戏中建模不同类型/状态的UI?例如菜单是如何表示的?它与"游戏世界"状态有何不同(让我们以FPS为例).如何在"游戏世界"之上叠加菜单?
让我们想象一下游戏的主循环.游戏状态在哪里发挥作用?这是一个简单的逐案处理方法吗?
if (menu.IsEnabled) menu.Process(elapsedTime);
if (world.IsEnabled) world.Process(elapsedTime);
if (menu.IsVisible) menu.Draw();
if (world.IsVisible) world.Draw();
Run Code Online (Sandbox Code Playgroud)
或者菜单和世界代表在不同的逻辑层中的某个地方而不是在这个级别上表示?(例如,菜单只是另一个高级实体,例如玩家输入或敌方经理,等于所有其他人)
foreach (var entity in game.HighLevelEntities) entity.Process(elapsedTime);
foreach (var entity in game.HighLevelEntities) entity.Draw(elapsedTime);
Run Code Online (Sandbox Code Playgroud)
这有着众所周知的设计模式吗?想一想,我不知道任何特定于游戏的设计模式 - 我还假设还有其他设计模式?请告诉我他们.
游戏中的菜单与任何应用程序中的菜单几乎相同 - 它是一系列GUI元素,其中附有行为.无论您是否具有不同的菜单状态,这都适用.
游戏往往具有不同的菜单状态有几个原因.其一是因为游戏菜单可以追溯到我们有游戏使用的GUI库前,大多数这些菜单也只是精灵的集合和一些硬编码的程序来处理鼠标点击.另一个原因是因为游戏在游戏过程中通常需要非常不同的输入处理,以便在菜单中需要,因此通常更容易拥有处理这些的完全独立的例程.
但实际上,几乎不需要一个独特的菜单游戏状态.您的游戏通常具有GUI,其中一些元素可见,一些元素不可见.要调出菜单,只需创建或显示所需的元素即可.您可能还需要暂停游戏.(或者不是,如果是网络游戏.)如果还没有正在进行的游戏,无论如何.通常,您的系统将是一个简化得更少的版本:
// update
world.update()
gui.update()
// render
world.render3D()
world.render2D_overlays()
gui.render()
Run Code Online (Sandbox Code Playgroud)
如果您的GUI系统足够,甚至可以组合最后两个阶段.
虽然我并不总是遵循自己的建议,但我认为很少有充分的理由为游戏设置独特的顶级状态机.有少量对象存在于少量排列中,您只需更新并全部呈现它们.