【问题标题】:Reuse Instance Names for Different Objects为不同的对象重用实例名称
【发布时间】:2015-04-06 18:06:16
【问题描述】:

简单的问题:如何为不同的对象(显然在不同的框架上)重用实例名称?我真的希望能够为我的所有场景使用相同的实例名称“ground”,即使这些地面实例属于不同的类。我真的不想把它们命名为“ground0”、“ground1”等。我意识到有办法解决这个问题,但我不想在所有这些额外的工作上胡闹。话虽如此,如何在不向我抛出此警告的情况下重用实例名称“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.

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

【问题讨论】:

    标签: actionscript-3 flash


    【解决方案1】:

    如果我记得 Flash 是多么的挑剔,那可能与您如何在这些帧上创建“地面”实例有关。

    我的意思是:

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

    我不确定这个假设是否正确,但 Flash 不一定将实例绑定到层,如“哦,地面位于第 1 层,因此每个帧都应该重用同一个实例......”。在一个完美的世界里,我同意这是有道理的。但是从 Flash 的早期版本开始,当时它主要针对动画师,任何事情都可以进行(从在同一帧上具有多个形状和实例,从重新安排一帧/层上的组/实例的深度),它仍在制作假设如果您将项目从库中拖动/复制到舞台,这并不一定意味着它们是相同的实例。相反,您必须通过在要重用的现有资产实例的帧之后创建更多关键帧(或根据您的需要补间关键帧)来照看 Flash。

    同样,以上是基于我的经验的假设 - 但如果您确实为在每个帧上找到的每个实例手动输入了“地面”实例名称,那么您之前可能会将新实例复制/粘贴或拖动到这些帧.

    这听起来像是你做过的事情吗?

    编辑:

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

    由于每个帧都有一个唯一的实例,每个实例都命名为“ground”,因此您可以创建一个辅助函数来像 .getChildByName("ground") 方法一样工作(老实说,我不确定该方法是否可以正常工作- 蝙蝠,你可以试试)。您需要循环遍历给定的 MovieClip 的子项(在您的菜单的子项中,我相信您的情况?),然后检查 if(child.name==theNameInQuestion) return child;。 话虽这么说,我不能保证这是正确的解决方案(没有测试),因为我不知道你如何在运行时导航帧(播放/停止/gotoAndPlay/gotoAndStop/等),而且可能会影响在给定时间可用的“地面”实例。在内部,Flash 会通过 addChild/removeChild 在帧循环中交换那些不同的“地面”实例,这不是简单的 visible=true/false 切换 (AFAIK)。

    编辑 2:

    这可能是你需要的?

    【讨论】:

    • 感谢@bigp 的快速回复。我知道想法层在其中发挥了作用,这很有趣。至于你关于这些对象是如何形成的问题,我从第一个场景中的单个 mc“Ground”开始,然后我复制了这个类并将其命名为“Ground2”。但是,我试图让两个对象共享相同的实例名称“ground”。但 Flash 不会有这个,因为它们是不同的类。
    • 啊,是的,那样就可以了(因为它们是不同的。符号实例,或者你所说的类)。但是,如果您仍想访问每个地面实例(无论它们是哪个类/符号项的实例),您还可以通过实例或类名以编程方式查找实例。我可以详细说明我的答案(将编辑)。
    • 变得难以理解,但我会尝试 :) - 换句话说,在代码中,您希望能够存储对“地面”实例指向的任何内容的引用(第一个时间),但仍保持对时间线播放头在任何给定时间降落的任何“地面”实例的引用?
    • 我明白了,这可能与高级 AS3 设置有关...抓屏/稍后发布...
    • 效果应该是即使你在代码中声明了一个公共变量/属性ground,它也不会和舞台上的“地面”实例有任何关联。将所需“地面”电影剪辑的引用存储到ground 属性将由开发人员负责。
    【解决方案2】:

    如果您想重用实例名称变量,只需使用最顶层的超类类型键入它们即可。你的情况是:

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

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

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

    然后您可以安全地在代码中使用变量 ground。

    【讨论】:

    • 我不认为 OP 指的是 AS3 语言的实例(类)本身,而是通过 Flash Pro 中的属性检查器面板输入的实例名称(CS# / CC) .
    • 有没有办法使用事先手动添加的代码删除 Flash 中的实例名称?这将解决问题,并释放实例名称以供将来使用。
    猜你喜欢
    • 1970-01-01
    • 2015-07-18
    • 2011-09-16
    • 2021-09-16
    • 1970-01-01
    • 1970-01-01
    • 2019-08-14
    • 2015-01-25
    • 2011-01-28
    相关资源
    最近更新 更多