AS3加载多个外部SWF并关闭它们

时间:2013-10-28 10:55:35

标签: actionscript-3 flash

我正在尝试在一个主SWF中加载多个外部SWF。

我从主swf开始。现在我需要链接4个游戏。

我创建了4个不同的加载器,并且我将每个游戏加载到每个游戏的不同框架中。即当我转到第1帧时,例如它将加载game1。我为每个游戏框架使用的代码是:

    public function LoadGame1(evt:MouseEvent):void {
        trace("load game1");
        this.gotoAndPlay("Game1");
        var url:URLRequest = new URLRequest("game1.swf"); 
        game1Loader.load(url);     
        addChild(game1Loader);

    }       

游戏2是相同的,除了game1,它将是game2等。

现在我的问题是,当我关闭每个游戏并转到另一个游戏时它不起作用。我无法加载其他游戏或重新加载它。当我回到菜单时,我使用:

    public function backFunc(evt:MouseEvent):void {
        trace("menu");
        myLoader.unload();
        game1Loader.unload();
        game2Loader.unload();
        game3Loader.unload();
        game4Loader.unload();
        this.gotoAndPlay("Menu");

    }

我假设它与卸载有关 - 它将所有内容卸载并关闭加载器。我试过removeChild(game1Loader)等,但它不起作用?游戏将关闭,它将返回菜单,但之后我将无法重新进入游戏或加载另一个游戏?

请帮助:(

1 个答案:

答案 0 :(得分:0)

Flash时间轴有点像静态状态机;从帧到帧的移动将在该帧(每次)运行所有文档代码。它还将内容的值重置为设计时的状态(因此,frame = design + code)。由于这个模型可能引起的头痛,我强烈建议你做所有的设计和代码在一个框架中。

您编写示例代码的方式似乎意味着您正在为每个游戏加载器编写自定义函数。您可以通过相同的功能驱动所有btn事件并依赖于某些差异属性(如他们的名字)来统一,加载相应的游戏。

最后,我怀疑你的装载机停止工作的原因是因为你已经卸下并将它们从舞台上移走了。这些东西被垃圾收集。而不是让加载器成为一个全局对象,每次进行loadGame()调用时都可以随意创建一个新的。

// We'll store our buttons in an array to make it easier to register for events.
var btns:Array = [
    btn_Load1,
    btn_Load2,
    btn_Load3
]

// Now cycle over them in bind to our listener
for each (var btn:MovieClip in btns) {
    btn.addEventListener("mouseUp", btnEvents);
}

function btnEvents(e:MouseEvent):void {
    // With one event listener, we can sort out each condition
    switch (e.currentTarget.name) {
        case "btn_Load1":
            loadGame("game1.swf")
            break;
        case "btn_Load2":
            loadGame("game2.swf")
            break;
        case "btn_Load3":
            loadGame("game3.swf")
            break;
    }
}

function loadGame(url:String):void {
    // Now we only have to write our loader code once (for all buttons)
    trace("Loading " + url);

    // Because we're unloading our swfs (and unloaded assets get garbage collected),
    // we'll want to make a new loader each time we call a load op
    var loader:Loader = new Loader();
    loader.name = "current_game";
    loader.load(new URLRequest(url));
    addChild(loader);
}

function backFunc(evt:MouseEvent):void {
    // Dynamically find our current game, and unload it.
    trace("menu");
    getChildByName("current_game").unload();
}