1

我正在寻找有关 Flash 如何跨关键帧管理具有相同名称的对象实例的技术文档。

到目前为止,我注意到当播放头移动到另一个帧时,如果同名对象具有相同的类型,则实例及其动态设置的属性会被保留。

另一方面,一旦播放头转到命名实例是不同类型的帧,它就会创建一个新类型的新实例(使用原始名称),而旧类型的原始实例是永久丢弃并且命名实例上的所有动态设置属性都将丢失(因为它是一个新实例)。

如果你回到原来的框架,它不会恢复原来的实例,而是把它当作另一个变化,并再次构造一个新的实例。是否有任何文档描述了这种行为?

关于“时间线实例的连续性”的类似问题:http ://www.kirupa.com/forum/showthread.php?t=316612 我也很惊讶属性会延续。这似乎是一个运行时功能,其中 Flash 将创建一个新实例,仅当(实例名称/符号类型)对在下一个关键帧中发生变化(即,如果命名实例“obj”在两者中都指“球”)关键帧,那么它将保持相同的实例;但如果“obj”在下一个关键帧中引用“正方形”,则将创建一个新的“正方形”实例)。这是有道理的,但是这种行为是否得到保证?

4

3 回答 3

2

这太长了,无法在评论中发布,但我发现了使用框架脚本的各种其他行为。

到目前为止,不同关键帧上具有相同实例名称的对象仅在我们具有以下条件时才会创建新实例:

  1. 不同的符号类型或
  2. 相同的符号类型和不同的图层
  3. 导航到不包含对象的中间关键帧

换句话说,只要实例名称、符号类型和对象所在的层在帧之间保持相同,并且每个帧都包含命名实例,那么单独的过滤器和变换不会导致创建新实例。

当涉及到 ActionScript 时,事情就变得有趣了。

---如果您使用脚本删除对象:---

相同的实例名称、相同的符号类型、相同的图层:

  1. 如果在第 1 帧使用 removeChild 删除对象,则在第 2 帧不会创建新对象。事实上,旧对象仍然存在,但它不可见,并且没有应用第 2 帧的任何变换(即对象保留其原始大小、过滤器等)。
  2. 如果您在第 1 帧使用 removeChild 删除对象,然后立即重新添加对象,那么它会持续存在并且在第 2 帧中可见,但仍然没有应用第 2 帧的任何变换(即对象保持其原始大小,过滤器等)。

相同的实例名称,相同的符号类型,不同的图层:

  1. 如果您删除该对象,则会按预期在第二帧上创建一个新对象,因为它位于不同的图层上。正如您将在下一条语句中看到的那样,在不同的层上几乎可以保证将创建一个新对象...

  2. 如果删除对象然后立即重新添加它(removeChild(obj); addChild(obj);),那么你最终会得到一个 DUPLICATE,因为在第 2 帧上具有新变换的新实例仍然被创建并且原始对象仍然存在(而如果您没有删除/添加它,则关键帧更改会破坏它)。

概括

在关键帧中,唯一会触发创建具有相同实例名称的新对象的情况是对象具有不同的符号类型或位于不同的图层上,或者您访问的关键帧不包含该对象并且然后返回一个。没有其他任何东西会导致创建一个新实例。使用 ActionScript 删除对象(即使您立即重新添加它),将导致播放器不会对对象应用新的关键帧变换,但其本身不会触发新实例的创建。

于 2011-03-10T20:52:12.247 回答
1

这不是记录在案的行为,但您的观察是正确的。但是,如果您的两个具有相同实例名称的对象属于不兼容的类型,那么您可能会遇到一个潜在的障碍,因为 Flash 可能会尝试将第二个(或所有后续)强制转换为“存在”或尝试像第一个一样行事它找到的一个。这可能是 fp9 特有的,但这种行为“伤痕累累”,足以建议您永远不要让两个不同的对象在同一时间轴上共享相同的实例名称。

您可能想查看我写的有关该主题的有关时间线和实例名称的此博客条目,以获得更多启发。

不过,我可能会或可能不会充分触及的另一件事是,如果您在任何电影剪辑中嵌套了时间线声音,如果您使用 gotoAndStop/Play 来“跳过”,那么这种行为也会造成巨大的破坏。 “围绕一个时间线。

于 2011-03-03T20:51:27.550 回答
1

自从我在 Flash 5 中开始使用 AS 以来,我从未见过这种正式记录。

您的观察结果与我的一致,但另一种情况是“相同名称、相同类型、新关键帧、不同层”,它重新初始化 AVM1 中的对象。我不确定 AVM2 做了什么,因为我真的尽量避免这些情况,但如果需要,这可能是让 MC 在时间线上重新启动的一种不错的方法。

于 2011-03-03T21:38:36.370 回答