6

我来自 MVC 背景(Flex 和 Rails),喜欢代码分离、可重用性、封装等思想。它使快速构建事物和在其他项目中重用组件变得容易。然而,在尝试构建复杂的、状态驱动的、异步的、动画的应用程序时,很难坚持 MVC 原则。

我正在尝试在应用程序中的许多嵌套视图之间创建动画转换,这让我开始思考我是否在误导自己……你能将 MVC 的原理应用到人工智能的原理(行为树、分层状态机)吗? , 嵌套状态),喜欢游戏吗?这两个学科一起玩得好吗?

当事物是静态的(例如 HTML CMS 系统或其他)时,很容易让视图/图形对自身之外的任何事物都一无所知。但是当您开始添加复杂的状态驱动转换时,似乎所有内容都需要了解其他所有内容,而 MVC 几乎会妨碍您。你怎么看?

更新:

一个例子。好吧,现在我正在使用 Flex 开发一个网站。我得出的结论是,为了正确地为应用程序中的每个嵌套元素设置动画,我必须将它们视为 AI 代理。然后,每个“视图”都有自己的行为树。也就是说,它根据上下文执行一个动作(显示和隐藏自己)(选择的数据是什么等)。为了做到这一点,我需要一个 ViewController 类型的东西,我称它为 Presenter。所以我有一个视图(在 MXML 中布局的图形)、一个演示器(定义视图可以根据应用程序的状态和嵌套状态执行的动画和操作)和一个演示模型,用于将数据呈现给视图(通过主持人)。我还有用于值对象的模型和用于处理 URL 和数据库调用等的控制器……所有普通的静态/html 类 MVC 东西。

有一段时间,我试图弄清楚如何构建这些“代理”,以便它们可以响应周围的环境(选择了什么等)。似乎一切都需要了解其他一切。然后我读到了游戏的路径/导航表/列表,并立即认为他们有一个集中存储的表,其中包含每个代理可以采取的所有预先计算的操作。所以这让我想知道他们实际上是如何构建代码的。

所有 3D 视频游戏的东西都是一个大秘密,据我所见,其中很多都是通过图形 UI/编辑器完成的,比如定义行为树。所以我想知道他们是否使用某种 MVC 来构建他们的代理如何响应环境,以及他们如何保持他们的代码模块化和封装。

4

3 回答 3

2

“你能将 MVC 的原理应用到人工智能(行为树、分层状态机、嵌套状态)中的原理,比如游戏吗?”

当然。99.9% 的 AI 纯粹在模型中。控制器将输入发送给它,视图是您在屏幕上向用户展示它的方式。

现在,如果您想开始让 AI 控制某些东西,您可能最终会嵌套概念,并且您的游戏“模型”包含一个实体模型、一个实体控制器,即 AI 向它发送命令,以及一个代表控制器可以使用的实体的感知的实体视图。但这与它是否可以“玩得很好”是另一个问题。MVC 是将表示和输入从逻辑和状态中分离出来,而这方面并不关心逻辑和状态的样子。

于 2010-01-21T11:42:05.743 回答
0

记住这一点:需要做出反应的事情只是必须意识到他们需要做出反应的事情。因此,如果他们需要了解一切,那么他们就需要了解一切。否则,-如何-让他们知道?在 3D 视频游戏中,比如第一人称射击游戏,敌人会对声音和视觉做出反应(例如脚步声/枪声和你/尸体)。请注意,我指出了一个抽象的基础,以及决策树的一部分。

在您的特定情况下,将整个事情在几个代理之间分开可能是错误的,而将其留给一个可以将订单委托给单独进程(/begin babble)的主要代理更简单:每个视图都可以是一个可以被告知的进程根据主代理收到的数据,切换到主代理的任何(多个)视图。

希望对您有所帮助..用一粒盐把它全部拿走:)

于 2010-01-19T13:59:17.033 回答
0

听起来您需要更多地使用观察者/事件聚合器模式。如果多个组件需要在不引入过度耦合的情况下对任意应用程序事件做出反应,那么使用事件聚合器会帮助您。例子:当一个项目被选中,一个应用事件被发布,相关的控制器告诉他们的视图运行动画等等。不同的组件不知道其他的,他们只是监听共同的事件。

此外,使视图执行操作的代码(根据模型/控制器状态启动动画) - 这是视图本身的一部分,因此您不必通过拥有控制器和视图控制器来使您的架构变得怪异。如果它是特定于 UI 的代码,那么它就是视图的一部分。我不熟悉 Flex,但在 WPF/Silverlight 中,类似的东西会进入代码隐藏(尽管在大多数情况下,Visual State Manager 足以处理状态动画,因此您可以将所有内容保存在 XAML 中) .

于 2010-03-09T19:34:18.017 回答