离开关键帧并返回时,Flash 舞台上的 MovieClip 不会重新实例化

Posted

技术标签:

【中文标题】离开关键帧并返回时,Flash 舞台上的 MovieClip 不会重新实例化【英文标题】:MovieClip on Flash stage does not re-instantiate when leaving keyframe and returning 【发布时间】:2012-05-22 07:38:11 【问题描述】:

我已经调试了很长一段时间的以下问题并且遇到了困难。

我在 Flash(CS4,顺便说一句)中建立了一个项目,其中包含一组关键帧,我在这些关键帧之间移动以表示游戏的各个屏幕。其中一个定义了一个 MovieClip(其中包含子项),表示一个选项菜单,该菜单出现在几个不同的关键帧上。

我遇到的问题是,当我第一次输入关键帧(使用“gotoAndStop”)时,这个 MovieClip 引用似乎可以访问,有时当我移动到其他帧并返回时。但至少在一种情况下,当我退出框架并返回时,我得到一个空引用错误(TypeError:错误 #1009:无法访问空对象引用的属性或方法)。当我尝试访问它时(getChildByName(“optionMenuTitle”))。我什至尝试让系统从 0 迭代到 numChildren 并打印出每个对象的名称,但是尽管将 numChildren 返回为 9,但它在位置 7 处返回 NULL。有谁知道为什么这个特定的 MovieClip 引用仅在此为 NULL案例??

这里是发生的过程的基本(缩写)纲要:

//set up function to be fired on frame construction
addEventListener(Event.FRAME_CONSTRUCTED, fadeIn, false, 0, true);  

public function fadeIn(event:Event):void 
   _handler.handle(); //this function is called which runs the debug statement below
   trace (mainDoc.numChildren); //displays 9
   for (var i = 0; i < mainDoc.numChildren; i++)  trace(mainDoc.getChildAt(i).name);  //throws null when it gets to 7 
   optionMenuTitle = OptionMenu(mainDoc.getChildByName("optionMenuTitle")); //the original failed call that caused me to debug

edit:另一个可能有用的信息。如果我注释掉该错误上方的 getChild 命令,则会加载帧,并且我可以看到在舞台上直观显示的 MovieClip(尽管它不是交互式的,并且不断地在其子对象的帧中循环)。但是仍然无法以编程方式访问它。

另一个编辑:有问题的对象是我命名为“OptionMenu”的 MovieClip 的子类。我在 OptionMenu 构造函数中放置了一个断点,当框架正确加载时,该断点被命中。当我得到上面的错误时,构造函数中的断点永远不会被命中。但是,调试器似乎无法让我查看 Flash 在实例化帧时的想法,因此我看不到构造函数为何从未被调用的逻辑。

【问题讨论】:

显示您将optionMenuTitle 添加到mainDoc 的方式/位置 在 Flash GUI 中定义。在那个关键帧上,我将对象的视觉表示从库中拖放到文档上的正确位置。它不是通过 ActionScript 添加的。 计算结果为null的是name,而不是MovieClip。如果是剪辑本身,则会抛出空引用 error。所以你可能只是没有正确设置name 属性。 它确实是一个空对象引用(我认为这也是 getChildAt 访问失败的原因)。我会更新以澄清。 不幸的是,当我看到错误时,我最初使用的是“enterFrame”。我将其更改为“frameConstructed”,希望这是对象尚未在“enterFrame”处初始化的问题。不幸的是,问题似乎是它根本没有初始化,无论是进入、构造还是退出. 【参考方案1】:

好吧,这个让我发疯了。当您第二次返回名为 title 的框架时,我无法弄清楚为什么它没有引用您的 optionMenuTitle

我能解决这个问题的唯一方法是从OptionMenu MovieClip 中取出 3 个按钮,并将它们放在舞台上,下面是灰色背景,基本上取消了OptionsMenu

因此,我将所有初始化代码从OptionMenu 移至您的TitleHanlder,并在TitleHandler 中为3 个按钮中的每一个添加了对您的destroy 方法的destroy 调用。

我还将参考从 root 更改为 mainDoc:

sound.initialize(LogicGameMain(mainDoc).soundOn);
music.initialize(LogicGameMain(mainDoc).musicOn);

这对我有用,因为您仍然可以第二次与按钮交互。看起来这些按钮嵌套肯定有一些错误。

我希望这对你有用。

【讨论】:

感谢所有的努力!我希望将它全部保存在一个可复制的电影剪辑中,以便我可以在另一个屏幕上重新使用它,但是在我用头敲了几天并阅读了你的回复之后,似乎最好的利用我的时间就是解决它。 Flash 确实似乎有一些特质.. @roberttdev - 完全同意你的看法,我认为像这样的特质被留在了 AS2 中,祝你好运。 对于遇到此问题的任何人,我最终做的是在 Flash IDE 中将 MovieClip 从帧中取出,然后在代码中添加/删除它,这似乎可行。尽我所能,这只是 Flash 代码中的侥幸。

以上是关于离开关键帧并返回时,Flash 舞台上的 MovieClip 不会重新实例化的主要内容,如果未能解决你的问题,请参考以下文章

如何获取动态创建的 Flash 舞台上的 MovieClip 名称?

Flash Pro cc 为啥我手机上的舞台宽度和高度设置为Flash pro里面的?

iOS 上的 Flash/AIR 舞台视频 - 有可能吗?表现如何?

关键帧的种类和特点?

AS3 | 1120:未定义属性阶段的访问

flash按钮 当鼠标经过时指针就消失