0

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

    }

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

请帮忙 :(

4

1 回答 1

0

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();
}
于 2013-10-28T15:09:32.640 回答