如何在AS3中完全删除动画片段

时间:2009-07-09 06:37:19

标签: flash actionscript-3 actionscript

我希望mc被删除所有的计时器,事件,...有一个简单的方法吗?

4 个答案:

答案 0 :(得分:11)

确定...取消注册其计时器和事件,将其从父项中删除,并删除对它的所有引用。 ;)

也就是说,AS3是一种垃圾收集语言,因此您无法控制何时从内存中删除某个对象(包括MC) 。当您删除对它的所有引用(包括事件注册)时,GC将检测到不再需要它并为您清理它。

您可以(而且应该)做的一件事是,无论何时注册事件,都要将useWeakReference参数设置为true。那就是:

myMC.addEventListener( Event.ENTER_FRAME, onFrame, false, 0, true );

这告诉AS3这个特定的事件监听器不应该作为引用计数 - 所以如果你删除对MC的所有其他引用,即使你没有取消注册监听器,它也会被垃圾收集。 (至于计时器,如果你正在使用setTimeout或setInterval,据我所知它们也不被认为是引用。但我不确定。)

所以它的长短不一样,没有办法让你的MC变得更好,并让Flash清理一切。这就是AS3的工作原理 - 管理您的参考和事件是尽责编码的一部分。如果您的MC没有更多的计时器或事件,将从其父级中移除,并且代码的任何部分都不会引用它,那就是它已经消失。

答案 1 :(得分:2)

Loader.unloadAndStop()

引自http://www.gskinner.com/blog/archives/2008/07/additional_info.html

以下是unloadAndStop为准备收集的SWF所做的事情列表:

  • 停止所有MovieClip
  • 停止播放所有声音/流媒体
  • 停止/删除所有计时器对象
  • 删除enterFrame,exitFrame,frameconstructed,activate,deactivate
  • 的所有全局侦听器
  • 删除孩子创建的所有舞台监听器。
  • 关闭所有NetConnection / NetStream
  • Video.attachNetStream和/的attachCamera(0)
  • Microphone.setLoopback(0)
  • 从全局字体表中删除AS3字体
  • 停止套接字,xmlsockets,文件引用下载,其他下载对象(孙子SWF)等。
  • 释放与cacheAsBitmap / filter等相关的位图

请注意,上述所有内容都是递归运行的,因此它们也适用于任何嵌套的子代,包括其他加载的SWF。

答案 2 :(得分:1)

我看到一些事件,尤其是Timer事件,在useWeakReference设置为true时无法触发。所以,要小心fenomas的建议。我通常在我的MovieClip和addEventListener(Event.REMOVED_FROM_STAGE, dealloc);中创建一个dealloc函数。当你removeChild()那个MovieClip时,dealloc函数会激活。

使用Flash自己处理这些内容是一种很好的做法,尤其是当出现比我们想要更频繁出现的不一致时。

答案 3 :(得分:1)

Jeremy,为了防止您的事件没有被解雇,请确保您的物品在某个地方有参考。

E.G。我创建了一个预加载器类,它从第1帧的根时间轴调用命令:

new PreLoader(root);

此时没有对PreLoader的外部引用,任何_rootClip.loaderInfo.addEventListener(ProgressEvent.PROGRESS,fn)都将失败。 (_rootClip是我的PreLoader类的属性,它的根作为参数传递。)

我做的很简单: 因为我为加载栏制作了一个影片剪辑,并将这个影片剪辑附加到根目录,所以这个影片剪辑有一个参考。 我只是myMC.preloader = this;来引用我的预加载器并阻止我的事件被删除。 一旦我完成了预加载,一个简单的_rootClip.removeChild(myMC);就会删除所有内容:)