Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/flash/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Actionscript 3 外部swf应在到达最终帧时卸载_Actionscript 3_Flash_External - Fatal编程技术网

Actionscript 3 外部swf应在到达最终帧时卸载

Actionscript 3 外部swf应在到达最终帧时卸载,actionscript-3,flash,external,Actionscript 3,Flash,External,我有一个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_ToLoa

我有一个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;

 }

有很多方法可以解决这个问题,人们已经问过很多次了

也就是说,在不在子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();
    }
}
你可以

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();
}
fl_ProLoader_3.content.addEventListener("lastFrameReached", unloadChild);
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会消失,请不要担心。当您将代码放在时间轴上时,所有这些代码实际上都被编译成document类中的函数,并通过addFrameScript添加了帧侦听器

请记住定义函数unloadChild()

-或-

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

在子SWF的最后一帧中:

this.dispatchEvent(new Event("lastFrameReached"));
在父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();
}
fl_ProLoader_3.content.addEventListener("lastFrameReached", unloadChild);
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();
    }
}
-或-

3) 订阅子项的“输入帧”事件,并检查子项是否在其最后一帧上

在父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();
}
fl_ProLoader_3.content.addEventListener("lastFrameReached", unloadChild);
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。

使用计时器似乎效率低下且不准确。为什么不为子SWF运行检查
ENTER_FRAME
?计时器是一个简单的解决方案。输入帧是有效的,但是如果你不想检查每个间隔,你需要限制它,这基本上就是计时器所做的。非常感谢你的快速回复!告诉我,这个代码属于哪里?我想是在父电影的框架上,但是在代码的末尾?在开始的时候,我会跳过代码的第二部分吗?因为我已经在加载一个URLrequest了,所以请继续使用第1部分和第3部分?+1作为答案#2。这是最好的方法,也是我的答案。非常感谢!!我不能在儿童swf中有任何代码,因为这部电影是为iOS制作的。因此,我将尝试第一个。我恐怕这里有一些错误。你能告诉我,这些代码到底会去哪里吗?非常感谢,@fiona,因为#1,所有代码都属于正在加载的父SWF。你能详细说明一下你所犯的错误吗?我还将对示例进行编辑,使其更加清晰。谢谢-以下是我在这段代码中得到的错误,我得到了其中两个错误:场景1,层“动作”,第10帧,第69行1084:语法错误:在tripledot之前需要标识符。