如何使用Actionscript 3卸载或删除外部加载的SWF?

时间:2013-04-01 21:04:20

标签: flash actionscript web adobe

我正在使用flash / actionscript进行游戏,特别是我遇到了一些问题。我对闪存的知识有点有限,所以可能在这里没有帮助我,但无论如何。在我的游戏中,我有一个帮助按钮。如果单击此按钮,则会弹出一个屏幕,显示有关如何为播放器执行操作的说明。指令分为多个SWF文件,因此每次单击此按钮时,其中一个外部SWF文件将加载到游戏中以供使用。

我可以很好地完成这一部分,但是如果玩家进一步进入游戏并点击帮助按钮,则会显示帮助,以及之前显示的每个帮助文件。

显然我不希望这种情况发生,我尝试了很多事情但没有成功。

非常感谢任何建议。

编辑: 这是我用来加载帮助文件的代码。

private function prepHelp(title:String):void
    {   
        // introduction help files
        switch(title) {
            case "Welcome to Game Module 1": gameUI.singleton.loadHelp("Help/game_module1.swf"); break;
            case "Welcome to Game Module 2":    gameUI.singleton.loadHelp("Help/game_module2.swf"); break;
            case "Welcome to Game Module 3":    gameUI.singleton.loadHelp("Help/game_module3.swf"); break;
        }
    }

这些在gameUI类中调用我的loadHelp()函数:

public function loadHelp(file_name:String):void
    {
        helpBtn.addEventListener(MouseEvent.CLICK, function(evt:MouseEvent):void { 

                _helpObject.loadHelp(file_name);
                singleton.addChild(_helpObject);
                _helpObject.dispatchEvent(new Event("getHelp"));
            } 
        );
    }

所以帮助SWF在我的helpView.as类中加载了我的_helpObject对象:

public class helpView extends Sprite
{   
    // variables associated with loading help content
    private var _helpLoader:Loader;
    private var _loader:Loader;
    private var _helpRequest:URLRequest;
    private var _helpMc:MovieClip = new MovieClip();

    private var _exitButton:Sprite = new Sprite();

    public function helpView():void {}

    public function loadHelp(help_file:String):void
    {
        _helpRequest = new URLRequest("swf/help_files/"+help_file);
        initialize();

        addEventListener("getHelp", getHelp);
    }

    private function initialize():void
    {   
        _exitButton.graphics.lineStyle(1, 0x000000, 1);
        _exitButton.graphics.beginFill(0xffffff);
        _exitButton.graphics.drawRect(0, 0, 75, 25);
        _exitButton.graphics.endFill();
        _exitButton.buttonMode = true;
        _exitButton.alpha = 1;

        _exitButton.x = gameUI.singleton.stage.stageWidth - 210;
        _exitButton.y = gameUI.singleton.stage.stageHeight - 55;

        _exitButton.addEventListener(MouseEvent.CLICK, closeHelp);
    }

    private function getHelp(evt:Event):void
    {   
        _helpLoader = new Loader();
        _helpLoader.load(_helpRequest);

        _helpLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, showHelp);
    }

    private function showHelp(evt:Event):void
    {   
        _loader = Loader(evt.target.loader);

        // set the width and height of the help swf to the dimensions of the game window.
        _loader.content.width = gameUI.singleton.stage.stageWidth;
        _loader.content.height = gameUI.singleton.stage.stageHeight;

        _helpMc.addChild(_loader.content);
        _helpMc.addChild(_exitButton);
        addChild(_helpMc);
        setChildIndex(_helpMc, numChildren - 1);

        _helpLoader.removeEventListener(Event.COMPLETE, showHelp);
    }

    private function closeHelp(evt:MouseEvent):void
    {
        removeChild(_helpMc);
    }
}

3 个答案:

答案 0 :(得分:1)

我认为您遇到的问题是孤立的swfs。因此,当加载swf时,它会显示出来,但是当你准备好移动到下一个swf时,它永远不会被卸载(至少没有正确卸载)......

如果你想保持这种技术,你需要确保在使用它时卸载swf(正确,没有泄漏)。

在我的游戏中,通常指令屏幕不是很重,我想加载和卸载swf,所以我不确定你的情况,但我建议的一个建议是:

在显示游戏之前加载所有swfs和信息(预加载器阶段) 然后根据需要显示或隐藏相应的帮助剪辑。

IE:

  • 有一个预加载器,可以将游戏与指令swfs一起加载。
  • 让预加载器提供对游戏的加载指令swfs的引用
  • 让游戏将引用存储在某个数组/向量中。
  • 如果用户单击帮助按钮,则显示第一条指令swf,并设置一些“currentClip”变量以指向第一条指令swf
  • 如果用户点击关闭按钮,则隐藏“currentClip”
  • 如果用户单击下一条指令/ prev指令,则隐藏currentClip,显示next / prev指令swf,并将currentClip变量重新初始化为显示的swf ...

如果你能提供一些资料,我可能会更有效地帮助你。

答案 1 :(得分:0)

你可以删除/卸载加载这些文件的装载程序帮助外部swf ..

addChild(yourloader)     //adds the loader 
removeChild(yourloader)   // removes your loader

此外,如果你使用数组存储电影(SWFS),你可以清除array.lenght = 0; 循环函数可能更合适。

    var len:int = TempSWFS.length;
    for( var i:int = 0; i < len; i++ ) {
   if(TempSWFS[i] != null && TempSWFS[i].parent != null){
       TempSWFS[i].parent.removeChild(TempSWFS[i]);
   }

答案 2 :(得分:0)

好的,我解决了。我所做的是创建引用每个SWF文件的对象,并将它们全部放入一个数组中,同时引用一个跟踪应加载SWF的引用变量。该参考变量跟踪玩家所在游戏的当前区域,因此当玩家点击帮助按钮时,右侧SWF被加载并显示给他们,然后当他们点击退出时可以直接返回游戏。

谢谢大家帮助我。