我正在从主菜单加载多个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而无需重新加载。
答案 0 :(得分:1)
首先,你应该删除一个parent
,以确保你实际上只删除游戏:
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中,在游戏成功加载后向Loader
添加事件监听器。这是在加载过程完成时调用的事件监听器中完成的:
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
,而不是event.currentTarget
。 {{1}}。