代码之家  ›  专栏  ›  技术社区  ›  Sander

游戏架构:模拟不同步骤/类型的用户界面

  •  4
  • Sander  · 技术社区  · 14 年前

    我没有做过任何大型的游戏开发项目,只是搞了些小玩具项目。但是,我从来没有找到一个针对特定设计问题的直观答案。也就是说,不同类型/状态的用户界面是如何在游戏中建模的?例如,菜单是如何表示的?它与“游戏世界”状态有什么不同(让我们以一个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 回复  |  直到 14 年前
        1
  •  5
  •   Kylotan    14 年前

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

    游戏有几个不同的菜单状态。一个是因为游戏菜单可以追溯到之前,我们有可用的游戏图形用户界面库,而这些菜单中的大多数只是精灵的集合和一些处理鼠标点击的硬编码例程。另一个原因是,游戏中的输入处理通常与菜单中所需的输入处理非常不同,因此通常更容易让完全独立的例程处理这些输入处理。

    但实际上,几乎不需要一个独特的菜单游戏状态。你的游戏通常有一个图形用户界面,其中一些元素可见,一些则不可见。要调出菜单,只需创建或显示所需的元素。你可能还需要暂停游戏。(或者不是,如果是网络游戏)如果还没有游戏在进行,不管。通常情况下,您的系统将是一个简单得多的版本:

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

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

    虽然我并不总是遵循自己的建议,但我认为很少有一个好的理由可以让一个游戏有一个独特的顶级状态机。有少量的对象存在于少量排列中,您只需更新并呈现它们即可。

        2
  •  -1
  •   Itay Maman    14 年前

    大多数GUI框架都是事件驱动的,也就是说:菜单元素(以及按钮和其他“输入”小部件)与窗口和您提供的侦听器对象相关联。框架负责调用 onAction 每当用户单击菜单/按钮时,侦听器对象上的方法。

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