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



我正在尝试在一个主 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

相同,但游戏 1 除外,它将是游戏 2 等。

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

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

我假设它与卸载有关 - 它卸载所有内容并关闭装载机。我尝试删除孩子(游戏1加载器)等,但它不起作用?游戏将关闭并返回菜单,但随后我将无法返回游戏或加载另一个?

请帮忙:(

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

编写示例代码的方式似乎意味着您正在为每个游戏加载程序编写自定义函数。 您可以通过相同的函数驱动所有 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();
}

最新更新