为不同的对象重用实例名称

Reuse Instance Names for Different Objects

简单的问题:如何为不同的对象(显然是在不同的框架上)重用实例名称?我真的希望能够为我的所有场景使用相同的实例名称,"ground",即使这些地面实例具有不同的 类。我真的不想把它们命名为 "ground0"、"ground1"、etc.I 意识到有很多方法可以解决这个问题,但我不想浪费所有这些额外的工作.话虽如此,我如何重用实例名称 "ground" 而不会向我抛出此警告?:

Menu, Layer 'ground', Frame 1   Warning: The instance name 'ground' is declared on an object of type Ground but there is a conflicting use of the instance name 'ground' on an object of type Ground2.

顺便说一句,我意识到一个实例应该是一个特定对象的出现,但老实说,我不太明白不允许在适当的时候重用实例名称的意义。任何帮助将不胜感激。

如果我记得 Flash 是多么挑剔,它可能与您如何在这些帧上创建 "ground" 实例有关。

我的意思是:

  • 您是先创建一个实例,然后再创建新的关键帧(意思是:同一个实例将用于所有关键帧),还是...
  • 您是否首先创建空关键帧,然后在每个帧中拖放/粘贴一个 "ground" 实例? (意思是:在这种情况下,它可能会被视为 3 个独立的实例)。

我不确定这个假设是否正确,但 Flash 不一定像 "Oh, ground is on Layer 1, therefore every frames should reuse the same instance..." 中那样将实例绑定到图层。在一个完美的世界里,我同意这是有道理的。但是从 Flash 的早期版本开始,当它主要针对动画师时,任何事情都会发生(从在同一帧上有多个形状和实例,从在一个 frame/layer 上重新安排组/实例的深度),它是仍然假设如果您将一个项目从库中拖/复制到舞台上,这并不一定意味着它们是同一个实例。相反,您必须通过在包含要重用的现有资产实例的帧之后创建更多关键帧(或补间关键帧,具体取决于您的需要)来照看 Flash。

同样,以上是基于我的经验的假设 - 但如果您确实为每个帧上找到的每个实例手动输入了 "ground" 实例名称,那么您之前可能 copy/pasted 或将新实例拖到这些帧中。

这听起来像是您可能做过的事情吗?

编辑:

如果您有 "ground" 跨几帧的资产,它们是不同符号的实例,那么这肯定会触发您收到的那些警告。我不确定在哪里可以关闭它们(首选项?项目发布设置?高级 AS3 设置?)..但无论如何,这里有一种可能对您有用的编程方式。

因为每个帧都有一个唯一的实例,每个实例都命名为 "ground",您可以创建一个辅助函数来像 .getChildByName("ground") 方法一样工作(老实说,我不确定如果该方法立即奏效,您可以尝试)。您需要循环遍历给定的 MovieClip 的子项(在您的菜单的子项中,我相信在您的情况下?),并检查 if(child.name==theNameInQuestion) return child;。 话虽这么说,但我不能保证这是正确的解决方案(未测试),因为我不知道您在运行时如何浏览帧 (play/stop/gotoAndPlay/gotoAndStop/etc),这可能会影响哪个 "ground" 实例在给定时间可用。在内部,Flash 确实 addChild/removeChild 在帧循环时交换那些不同的 "ground" 实例,这不是简单的 visible=true/false 切换(AFAIK)。

编辑 2:

这可能是您需要的?

如果您想重用任何编程语言的实例名称变量,只需将它们键入最顶层的超类类型即可。在你的情况下是:

var ground:DisplayObject;
ground = new Ground!();
ground = new Ground2();
//etc ....

编辑:如果使用 属性 面板,则不能对 2 个对象使用相同的名称,因为无法区分它们。所以会正确抛出一个错误。 现在,如果您只想在代码中使用一个名称,则适用与上述相同的原则:

var ground:DisplayObject;
ground = ground0;
ground = ground1;
//etc ....

然后你就可以放心地在代码中使用变量ground了。