Actionscript 3 卸载外部SWF文件

Actionscript 3 卸载外部SWF文件,actionscript-3,Actionscript 3,我正在从主菜单加载多个swf文件,但从未卸载。我用以下代码完成了这项工作。。。唯一的问题是,我看到的不是卸载到主菜单,而是一个白色屏幕,好像什么都没有加载 function BackToMenu(i:MouseEvent):void { var BaseMovie:MovieClip = parent.parent as MovieClip; BaseMovie.parent.removeChild(BaseMovie); } 编辑:我将从一开始就解释我有一个MainMenu.

我正在从主菜单加载多个swf文件,但从未卸载。我用以下代码完成了这项工作。。。唯一的问题是,我看到的不是卸载到主菜单,而是一个白色屏幕,好像什么都没有加载

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

编辑:我将从一开始就解释我有一个MainMenu.swf。单击与游戏相关的按钮时,将从MainMenu.swf加载游戏。当在MainMenu.swf上单击游戏按钮时,游戏将加载。当玩家完成游戏时,他们会看到退出按钮,该按钮将卸载当前游戏并显示main menu.swf,而无需重新加载。

首先,您应该删除一个
家长,以确保您实际上只删除游戏:

function BackToMenu(i:MouseEvent):void
{
    var BaseMovie:MovieClip = parent as MovieClip;
    BaseMovie.parent.removeChild(BaseMovie);
}
这将解决您最紧迫的问题,并允许您返回菜单。但是,您并没有真正卸载游戏,只是将其从显示列表中删除。这通常意味着,仍然有声音在运行,活动键和/或鼠标侦听器等-这些都必须注意

就像我说的,这只会解决你眼前的问题。然而,这既不是一个永久的解决方案,也不是一个好的解决方案:既然主要的SWF负责加载游戏,它也应该负责处理游戏。你应该在游戏中加入清理代码,但它应该只关注停止任何正在运行的脚本、声音等-简单的规则:在游戏中启动的任何东西都应该在游戏中停止。但它不应尝试访问显示层次结构中更高层次的对象,或尝试卸载自身

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

  • 不要编写实际的
    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”现在是一个“冒泡”事件,即它在显示层次结构中向下移动。我们现在可以在包含游戏的任何祖先显示对象中侦听此事件

  • 在主SWF中,当游戏成功加载时,将事件侦听器添加到
    加载程序中。这在加载过程完成时调用的事件侦听器中完成:

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

    function onFinishGame( event:Event ):void {
        var loader:loader = event.currentTarget;
        loader.parent.removeChild( loader );
        loader.unloadAndStop();
    }
    
  • 还有几件事需要考虑:

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

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

    • 由于我对加载所使用的代码一无所知,所以我假设您有一个完整的侦听器,并且不保留对加载程序的引用。如果使用成员变量,则可以使用该变量而不是
      event.target
      ,resp<代码>事件。当前目标


    一点线索也没有:s今天早上的比例是13%,不知道它是如何工作的,公平地说,我没有那么担心。。。我只是在解释之前没有注意到左边的点击图标。好吧,那么,让我们看看如何回答你的问题。。。“卸载到主菜单”是什么意思?“卸载”通常意味着清空加载程序中的内容,如:所有加载的内容现在都被丢弃。这可以通过调用
    Loader#unload
    Loader#unloadAndStop
    来完成,但要使其起作用,必须首先将对加载内容的所有引用置零和/或删除。粘贴的代码只会从显示列表中删除一个特定的MovieClip。不多也不少。你到底想做什么?我会从一开始就解释我有一个main menu.swf。单击与游戏相关的按钮时,将从MainMenu.swf加载游戏。当在MainMenu.swf上单击游戏按钮时,游戏将加载。当玩家完成游戏时,会出现退出按钮,该按钮将卸载当前游戏并显示MainMenu.swf,而无需重新加载。