卸载外部SWF文件

时间:2012-04-30 10:34:51

标签: actionscript-3

我正在从主菜单加载多个swf文件,这些文件永远不会被卸载。我用以下代码完成了这个...唯一的问题是,我只是看到一个白色的屏幕而不是卸载到主菜单,而不是没有加载。

function BackToMenu(i:MouseEvent):void
{
    var BaseMovie:MovieClip = parent.parent as MovieClip;
    BaseMovie.parent.removeChild(BaseMovie);
}
编辑:我将从头开始解释我有一个MainMenu.swf。当点击与游戏相关的按钮时,游戏从MainMenu.swf加载。在MainMenu.swf上点击游戏按钮时,游戏会加载。当玩家完成游戏时,他们会看到退出按钮,该按钮会卸载当前游戏并显示MainMenu.swf而无需重新加载。

1 个答案:

答案 0 :(得分:1)

首先,你应该删除一个parent,以确保你实际上只删除游戏:

function BackToMenu(i:MouseEvent):void
{
    var BaseMovie:MovieClip = parent as MovieClip;
    BaseMovie.parent.removeChild(BaseMovie);
}

这应该解决您最紧迫的问题,并允许您返回菜单。但是,您没有真正卸载游戏,只是将其从显示列表中删除。这通常意味着仍然有声音在运行,活动键和/或鼠标听众等等 - 这些必须全部照顾!

而且,就像我说的那样,这只能解决你眼前的问题。然而,它既不是永久的解决方案,也不是一个好的解决方案:由于主SWF负责加载游戏,它也应该负责处理它们。你应该将清理代码放入你的游戏中,但它应该只关注停止任何运行的脚本,声音等 - 简单的规则:在游戏中启动的任何事情,应该在游戏中停止。但它不应该尝试在显示层次结构中进一步访问对象,或尝试卸载自身。

更好的方法是更换上面的所有代码,然后让主SWF负责删除游戏,以及从内存中卸载它。为此,您必须做三件事:

  1. 不要编写实际的removeChild调用等,而是让您的按钮调度自定义事件,以通知主SWF现在应将其删除:

    function onBackButtonClicked( event:MouseEvent ):void {
        destroyGame(); // this would be the function that stops all the scripts
        dispatchEvent( new Event( "FINISH_GAME", true ) ); 
    }
    

    请注意,“FINISH_GAME”现在是一个“冒泡”事件,即它在显示层次结构中向下移动。我们现在可以在包含游戏的任何祖先显示对象中侦听此事件。

  2. 在主SWF中,在游戏成功加载后向Loader添加事件监听器。这是在加载过程完成时调用的事件监听器中完成的:

    function onLoadComplete( event:Event ):void {
        var loader:Loader = event.target.loader;
        loader.addEventListener( "FINISH_GAME", onFinishGame, true );
    }
    
  3. 使用相应的事件处理程序删除游戏剪辑:

    function onFinishGame( event:Event ):void {
        var loader:loader = event.currentTarget;
        loader.parent.removeChild( loader );
        loader.unloadAndStop();
    }
    
  4. 还有一些事情需要考虑:

    • ActionScript中的命名约定建议我们为方法和变量使用小写名称,而仅对类型使用大写。

    • 相同的命名约定建议我们使用“on”或“handle”作为事件侦听器的前缀,以及事件的名称。因此,它应该是onBackToMenu或更确切地说,onBackButtonClicked等。

    • 由于我对用于加载的代码一无所知,我只是假设你有一个完整的监听器,而且你没有保留对加载器的引用。如果您使用成员变量,则可以使用该变量代替event.target,而不是event.currentTarget。 {{1}}。