模型 - 视图 - 控制器是否与人工智能和行为树很好地配合?

时间:2010-01-18 02:47:25

标签: ruby-on-rails model-view-controller integration artificial-intelligence state-machine

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

我正在尝试create animated transitions between many nested views in an application,它让我想到我是否误导自己......你能否将MVC的原则应用于人工智能的原理(行为树,分层状态机,嵌套国家),像游戏?这两个学科能很好地融合在一起吗?

当事物是静态的时,很容易使视图/图形对于自身之外的任何东西都不了解,比如使用HTML CMS系统或其他任何东西。但是当你开始添加复杂的状态驱动的转换时,似乎所有东西都需要了解其他所有内容,而MVC几乎会阻碍它。你觉得怎么样?

更新

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

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

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

3 个答案:

答案 0 :(得分:2)

  

“你能否应用MVC的原则   人工原理   智力(行为 - 树木,   分层状态机,嵌套   国家),像游戏?“

当然。 99.9%的AI纯粹属于模型。 Controller向其发送输入,View是您在屏幕上向用户表示的方式。

现在,如果你想开始对AI进行控制,你可能最终将概念嵌套,你的游戏'模型'包含一个实体的模型,一个实体的控制器,即AI向它发送命令,以及实体的视图,表示控制器可以使用的该实体的感知。但这是一个单独的问题,它是否可以'玩得很好'。 MVC是关于将表示和输入与逻辑和状态分离,并且该方面不关心逻辑和状态是什么样的。

答案 1 :(得分:0)

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

在您的特定情况下,将几个代理之间的整个事物分开可能是错误的,并且更简单地将其留给一个可以将订单委托给单独的流程的主代理(/开始流氓):每个视图都可以是一个可以处理的流程被告知要由主代理切换到任何(多个)视图,具体取决于主代理收到的数据。

希望有所帮助..用一粒盐来解决这个问题:)

答案 2 :(得分:0)

听起来你需要更多地使用Observer / Event Aggregator模式。如果多个组件需要对任意应用程序事件做出反应而不引入过度耦合,那么使用事件聚合器可以帮助您。示例:当选择一个项目时,发布一个应用程序事件,相关的控制器告诉他们的视图运行动画等。不同的组件不知道其他组件,它们只是监听常见事件。

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