【问题标题】:external swf should unload when reaches final frame外部 swf 应在到达最后一帧时卸载
【发布时间】:2013-03-20 07:13:20
【问题描述】:

我有一个 swf 文件加载到主电影中。当孩子玩完,即到达最后一帧时,我想卸载 swf。谁能告诉我我可以在这段代码中添加哪些位?

//start button

start_button_aboriginal.addEventListener(MouseEvent.CLICK, fl_ClickToLoadUnloadSWF_3,false,0,true);

import fl.display.ProLoader;
var fl_ProLoader_3:ProLoader;

var fl_ToLoad_3:Boolean = true;

function fl_ClickToLoadUnloadSWF_3(event:MouseEvent):void
{
//ADDED APR02 START
    fl_ProLoader_3.contentLoaderInfo.addEventListener(Event.INIT, childInitHandler);
    fl_ProLoader_3.load(new URLRequest("myths/myth_aboriginal.swf"));
//ADDED APR02 END

if(fl_ToLoad_3)
{
    fl_ProLoader_3 = new ProLoader();
    fl_ProLoader_3.load(new URLRequest("myths/myth_aboriginal.swf"));
    addChild(fl_ProLoader_3);
    fl_ProLoader_3.x = 114;
    fl_ProLoader_3.y = 41;
}
else
{
removeChild(fl_ProLoader_3);
fl_ProLoader_3.unloadAndStop();
fl_ProLoader_3 = null;
}
// Toggle whether you want to load or unload the SWF
fl_ToLoad_3 = !fl_ToLoad_3;

 }

【问题讨论】:

    标签: actionscript-3 flash external


    【解决方案1】:

    你可以

    1) 使用 MovieClip 类中定义的未记录的 addFrameScript 函数在子 SWF 的最后一帧上放置回调。如果您无法控制加载的 SWF 中的代码,这很有用。

    addFrameScript() 具有以下签名:

    addFrameScript(frameNumber, callback); //frameNumber is zero-based (unlike in the Flash authoring suite, here you would enter 0 to refer to the first frame, and 1 for the second.)
    

    在父 SWF 中,添加以下内容:

    function fl_ClickToLoadUnloadSWF_3(event:MouseEvent):void {
        ...
        fl_ProLoader_3.contentLoaderInfo.addEventListener(Event.INIT, childInitHandler);
        fl_ProLoader_3.load(new URLRequest("myths/myth_aboriginal.swf"));
        ...
    }
    
    function childInitHandler(event:Event):void {
        MovieClip(fl_ProLoader_3.content).addFrameScript(MovieClip(fl_ProLoader_3.content).totalFrames-1, unloadChild);
    }
    
    function unloadChild() {
        fl_ProLoader_3.unloadAndStop();
    }
    

    如果您担心 addFrameScript 会消失,请不要担心。当您将代码放在时间轴上时,所有代码实际上都被编译为文档类中的函数,并通过 addFrameScript 添加了帧侦听器。

    记得定义函数unloadChild()

    function unloadChild():void {
        fl_ProLoader_3.unloadAndStop();
    }
    

    -或-

    2) 当加载的 SWF 到达最后一帧时,从它调度一个事件。

    在子 SWF 的最后一帧中:

    this.dispatchEvent(new Event("lastFrameReached"));
    

    在父 SWF 中,添加以下内容:

    fl_ProLoader_3.content.addEventListener("lastFrameReached", unloadChild);
    

    -或-

    3) 订阅孩子的 ENTER_FRAME 事件并检查孩子是否在最后一帧。

    在父 SWF 中,添加以下内容:

    fl_ProLoader_3.content.addEventListener(Event.ENTER_FRAME, checkIfEnded);
    
    function checkIfEnded(event:Event):void {
        if (fl_ProLoader_3.content.currentFrame == fl_ProLoader_3.content.totalFrames) {
            unloadChild();
        }
    }
    

    我个人更喜欢 addFrameScript - 在我看来是一个更干净的解决方案。回调运行一次,无需轮询,也无需修改子 SWF。

    【讨论】:

    • +1 表示答案 #2。这是最好的方法,也是我的答案。
    • 非常感谢!!我不能在子 swf 中有任何代码,因为这部电影是为 iOS 制作的。所以我会尝试第一个。
    • 恐怕我在这里遇到了一些错误。你能告诉我,这些代码的确切位置吗?非常感谢,
    • @fiona,对于#1,所有代码都属于正在加载的父 SWF。您能否详细说明您遇到的错误?我还将编辑示例以使其更清晰。
    • 谢谢 - 这是我得到的那段代码的错误,我得到了其中两个:场景 1,图层“动作”,第 10 帧,第 69 行 1084:语法错误:期待三点之前的标识符。
    【解决方案2】:

    有很多方法可以解决这个问题,并且已经被问过很多次了......

    也就是说,您无需在子 swf 上创建事件侦听器即可解决此问题的一种方法是定期检查子 swf 的当前帧。如果是 swf 上的最后一个,调用 unload 方法。

    // once every second, indefinitely.
    var tick:Timer = new Timer(1000, 0);
    tick.addEventListener(TimerEvent.TIMER, checkSWF);
    tick.start();
    
    //Load something to the stage.
    var loader:Loader = new Loader();
    loader.load(new URLRequest("child.swf")); 
    addChild(loader);
    
    
    function checkSWF(e:Event):void {
        if (loader.content.currentFrame == loader.content.totalFrames) {
            tick.stop(); // stop the timer
            loader.unloadAndStop();
        }
    }
    

    【讨论】:

    • 使用计时器似乎非常低效且不准确。为什么不对子 SWF 的ENTER_FRAME 运行检查?
    • 计时器是一个简单的解决方案。 ENTER_FRAME 是有效的,但如果你不想检查每个间隔,你需要用help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/… 来限制它,这基本上就是计时器的作用。
    • 非常感谢您的快速回复!告诉我,这段代码属于哪里?我假设在父电影的帧上,但在代码的末尾?一开始?
    • 另外,我是否会跳过第二部分代码,因为我已经在加载 URLrequest,只保留第 1 和第 3 部分?
    猜你喜欢
    • 2011-05-06
    • 1970-01-01
    • 2011-03-29
    • 1970-01-01
    • 2023-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-03
    相关资源
    最近更新 更多