【问题标题】:Does Model-View-Controller Play Nicely with Artificial Intelligence and Behavior Trees?模型-视图-控制器是否与人工智能和行为树很好地配合?
【发布时间】:2010-01-18 02:47:25
【问题描述】:

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

我正在尝试create animated transitions between many nested views in an application,这让我开始思考我是否在误导自己……你能将 MVC 的原理应用于人工智能的原理吗(行为树、分层状态机、嵌套状态) ,比如游戏?这两个学科配合得好吗?

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

更新:

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

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

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

【问题讨论】:

  • 你能举一个很简单的例子吗?链接的问题也太长了。
  • 您的问题似乎与黑板架构有关。
  • 哦,那个黑板架构看起来很有趣!谢谢!

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


【解决方案1】:

"你能把 MVC 的原则应用到 人工原理 智能(行为树, 分层状态机,嵌套 州),比如游戏?”

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

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

【讨论】:

  • 谢谢!你听起来好像你知道这一切是怎么回事,你有什么资源可以指出吗?有源代码???
  • 不,游戏开发人员通常不使用 MVC,因此在实践中您不会发现太多。但我只是建议不要将 MVC 事情做得太过火。它被明确设计用于将 GUI 应用程序中的表示与内容分离,而不是作为编写软件的通用协议。例如,我没有看到您的原始帖子需要“代理”,也没有任何比简单地更新所有内容然后阅读他们的新视觉呈现更复杂的东西,就像游戏通常那样。
【解决方案2】:

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

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

希望对您有所帮助.. 小心翼翼 :)

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-03-23
      • 2020-08-03
      • 1970-01-01
      • 1970-01-01
      • 2010-09-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多