离开关键帧并返回时,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里面的?