Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Design patterns 游戏架构:建模不同步骤/类型的UI_Design Patterns - Fatal编程技术网

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

Design patterns 游戏架构:建模不同步骤/类型的UI,design-patterns,Design Patterns,我没有做过任何大型的游戏开发项目,只做过一些小玩具项目。然而,我从来没有找到一个直观的答案,以具体的设计问题。也就是说,不同类型/状态的UI在游戏中是如何建模的?例如,菜单是如何表示的?它与“游戏世界”状态有何不同(让我们以FPS为例)。“游戏世界”顶部的重叠菜单是如何建模的 让我们想象一下游戏的主循环。游戏状态在哪里起作用?这是一种简单的个案方法吗 if (menu.IsEnabled) menu.Process(elapsedTime); if (world.IsEnabled) world

我没有做过任何大型的游戏开发项目,只做过一些小玩具项目。然而,我从来没有找到一个直观的答案,以具体的设计问题。也就是说,不同类型/状态的UI在游戏中是如何建模的?例如,菜单是如何表示的?它与“游戏世界”状态有何不同(让我们以FPS为例)。“游戏世界”顶部的重叠菜单是如何建模的

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

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

if (menu.IsVisible) menu.Draw();
if (world.IsVisible) world.Draw();
或者菜单和世界是在不同的逻辑层中表示的,而不是在这个级别表示的?(例如,菜单只是另一个高级实体,如玩家输入或敌方管理者,等同于所有其他实体)


这方面有著名的设计模式吗?想想看,我不知道任何特定于游戏的设计模式——我想也有其他模式吧?请告诉我。大多数GUI框架都是事件驱动的,也就是说:菜单元素(以及按钮和其他“输入”小部件)与您提供的窗口和侦听器对象相关联。每当用户单击菜单/按钮时,框架负责在侦听器对象上调用
onAction
(或类似的)方法


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

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

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

但实际上,几乎不需要一个独特的菜单游戏状态。您的游戏通常有一个GUI,其中一些元素可见,一些元素不可见。要打开菜单,只需创建或显示所需的元素。此时您可能还需要暂停游戏。(如果是网络游戏,也可以不玩。)如果还没有游戏进行中,没关系。通常,您的系统将是一个简化程度低得多的版本:

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

// render
world.render3D()
world.render2D_overlays()
gui.render()
如果GUI系统足够的话,最后两个阶段甚至可以结合使用


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

您的答案与传统游戏编程没有任何关系,传统游戏编程不一定使用输入小部件或侦听器,甚至不使用框架和窗口。这与游戏编程有什么关系?我显然不是指Win32/Windows窗体游戏编程(例如,扫雷器),在这种情况下,您将使用常见的GUI元素。即使不使用标准框架,游戏程序通常也会推出基于相同原则构建的自己的框架:从用户处获取输入的对象具有侦听器对象。引擎获取输入事件(鼠标/键盘/操纵杆)找到它们属于哪个对象(通过将鼠标位置与每个对象的位置进行比较),然后将这些事件传播到相应的对象(这反过来将触发其侦听器)是的,我非常同意这一点。由于TRC/TCR的原因,您在控制台开发上受到一定限制,因此您必须以标准方式处理更多的状态,例如“用户删除的控制器”或“用户删除的内存条”,因此我看到了一些FSM实现,但老实说,它们通常是一种过度使用
// update
world.update()
gui.update()

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