游戏架构:建模不同的UI步骤/类型

时间:2010-04-11 14:55:36

标签: design-patterns

我还没有做过任何大型游戏开发项目,只是搞乱了小玩具项目。但是,我从未找到对特定设计问题的直观答案。也就是说,如何在游戏中建模不同类型/状态的UI?例如。菜单是如何表示的?它与“游戏世界”状态有何不同(让我们以FPS为例)。如何在“游戏世界”之上叠加菜单建模?

让我们想象一下游戏的主循环。游戏状态在哪里发挥作用?这是一个简单的逐案处理方法吗?

if (menu.IsEnabled) menu.Process(elapsedTime);
if (world.IsEnabled) world.Process(elapsedTime);

if (menu.IsVisible) menu.Draw();
if (world.IsVisible) world.Draw();

或者菜单和世界是在不同逻辑层中的某个位置表示的,而不是在此级别上表示? (例如,菜单只是另一个高级实体,例如玩家输入或敌方经理,等于所有其他人)

foreach (var entity in game.HighLevelEntities) entity.Process(elapsedTime);
foreach (var entity in game.HighLevelEntities) entity.Draw(elapsedTime);

这有着众所周知的设计模式吗?想一想,我不知道任何特定于游戏的设计模式 - 我还假设还有其他设计模式?请告诉我他们。

2 个答案:

答案 0 :(得分:5)

游戏中的菜单与任何应用程序中的菜单几乎相同 - 它是一系列GUI元素,其中附有行为。无论您是否具有不同的菜单状态,这都适用。

游戏往往具有不同的菜单状态有几个原因。一个是因为游戏菜单可以追溯到我们有可用的游戏GUI库之前,大多数菜单只是精灵的集合和一些硬编码的例程来处理鼠标点击。另一个原因是因为游戏在游戏过程中通常需要非常不同的输入处理才能完成菜单中所需的操作,因此通常可以更轻松地完成单独的例程处理。

但实际上,几乎不需要一个独特的菜单游戏状态。您的游戏通常具有GUI,其中一些元素可见,一些元素不可见。要调出菜单,只需创建或显示所需的元素即可。您可能还需要暂停游戏。 (或者不是,如果是网络游戏。)如果还没有正在进行的游戏,无论如何。通常情况下,您的系统的简化版本要简化得多:

// update
world.update()
gui.update()

// render
world.render3D()
world.render2D_overlays()
gui.render()

如果您的GUI系统足够,最后两个阶段甚至可以合并。

虽然我并不总是遵循我自己的建议,但我认为很少有充分理由为游戏设置独特的顶级状态机。有少量的对象存在于少量的排列中,你只需更新并渲染它们。

答案 1 :(得分:-1)

大多数GUI框架都是事件驱动的,即:菜单元素(以及按钮和其他“输入”窗口小部件)与窗口和您提供的侦听器对象相关联。只要用户单击菜单/按钮,框架就会在侦听器对象上调用onAction(或类似的东西)方法。

作为程序员,您不需要编写明确检查这些菜单元素的代码。