我正试图围绕以单线程编程语言(Actionscript)实现嵌套状态转换的最佳方法。假设我有这样的行为树结构:
现在假设每个叶子节点是网站上的一个目标点,就像画廊中的图像,或者嵌套在页面视图中的帖子视图中的评论......目标是能够从叶子运行动画过渡节点到叶节点,通过动画出前一棵树(从下到上),并在当前树中动画化(从上到下)。
所以,如果我们在最左下角的叶子节点,并且我们想去最右下角的叶子节点,我们必须:
- 转出左下节点
- 完成时(比如在一秒钟的动画之后),过渡到它的父级,
- 完成后,转出它的父级
- 完成后,过渡到最右边的父级
- 完成后,最右边的过渡
- 完成时,叶中的过渡
我的问题是:
如果您将这些节点中的每一个想象成 HTML 视图(叶子是“部分”,借用 rails 的术语)或 MXML 视图,您在其中嵌套子组件,并且您不一定知道嵌套级别应用程序根目录,如上所述为过渡设置动画的最佳方式是什么?
一种方法是全局存储所有可能的路径,然后说“应用程序,过渡到这条路径,过渡到这条路径”。如果应用程序非常简单,那就可以了。这就是Gaia的做法,一个 Actionscript 框架。但是,如果您希望它能够转换进/出任意嵌套路径,则不能全局存储它,因为:
- Actionscript 无法处理所有这些处理
- 似乎不是很好的封装
所以这个问题可以改写为,你如何动画出最左边的叶子节点及其父节点,从叶子开始,并在最右边的叶子节点中动画,从根开始? 该信息存储在哪里(要输入和输出什么)?
另一种可能的解决方案是只说“应用程序,转出上一个子节点,完成后,转入当前子节点”,其中“子节点”是应用程序根的直接子节点。然后应用程序根的最左边的子节点(它有两个子节点,每个子节点都有两个子节点)将检查它是否处于正确的状态(如果它的子节点被“转出”)。如果没有,它会在它们上调用“transitionOut()”......这样所有东西都将被完全封装。但这似乎是处理器密集型的。
你怎么看?你还有其他选择吗?或者你能指出我关于AI 行为树或分层状态机的任何好的资源,这些资源描述了它们如何实际实现异步状态转换:
- 他们从哪里调用对象上的“transitionOut”?从根源还是特定的孩子?
- 状态存储在哪里?全球,本地?定义所谓的“transitionIn()”和“transitionOut()”的范围是什么?
我已经看过/阅读了许多关于 AI 和状态机的文章/书籍,但我还没有找到描述它们如何在复杂的 MVC 面向对象项目中实际实现异步/动画转换的内容,其中有 100 多个视图/图形参与行为树。
我应该从最父对象还是从子对象调用转换?
以下是我检查过的一些内容:
- 游戏行为 AI 架构:行为多队列
- 分层状态机——一种非常重要的设计方式
- 通过示例编程游戏 AI
- 目标驱动的代理行为
- Troy Gardner 的高级状态管理
- Troyworks 的 AS3 COGS 库
- 流行的行为树设计方法
- 为异步感觉系统构建事件驱动条件
虽然这不一定是 AI 问题,但没有其他资源描述如何将嵌套状态架构应用于网站;这些是最接近的东西。
问题的另一种表述方式:如何将状态更改广播到应用程序?你把事件监听器放在哪里?当它被任意嵌套时,你如何找到动画的视图?
注意:我不是在尝试构建游戏,只是在尝试构建动画网站。