我有一个动态加载另一个迷你游戏的游戏。
我使用SWFLoader
function loadMinigame(minigameName:String):void
{
var loader:SWFLoader = new SWFLoader;
loader.load("/Content/Swf/" + minigameName + ".swf");
layerMinigames.addElement(loader);
}
我第一次加载它效果很好。但是当我退出迷你游戏并尝试通过相同的方法再次打开它时,它在我的应用程序中不会出现(有时候确实会这样做)。
这两款游戏都是Flex应用程序。
发生了什么事?
更新
我做了loader.loadForCompatibility = true
现在正确加载!但是现在我在尝试投射结果时遇到错误:
loader.addEventListener(Event.COMPLETE, function(e:Event):void
{
var sys:SystemManager = SystemManager(e.currentTarget.content);
});
给出:
TypeError:错误#1034:类型强制失败:无法转换 _AppMinigame1_mx_managers_SystemManager @ 14c97eb9到mx.managers.SystemManager。
答案 0 :(得分:1)
您最好在加载后缓存加载的迷你游戏,然后在需要时再次显示它。但请确保小游戏的ADDED_TO_STAGE
听众正确地重置小游戏。
static var loadedGames:Object={};
function loadMinigame(minigameName:String):void
{
if (loadedGames[minigameName]==null) {
var loader:SWFLoader = new SWFLoader;
loader.load("/Content/Swf/" + minigameName + ".swf");
loadedGames[minigameName]=loader;
loader.addEventListener(Event.COMPLETE,loaderFinished);
} else {
layerMinigames.addElement(loadedGames[minigameName]);
}
}
function loaderFinished(e:Event):void {
layerMinigames.addElement(e.target);
// do the rest, like setting proper start time for minigame, etc
}
更新:由于在运行此类进程时内存不足,这意味着小游戏的实例会占用太多内存,需要释放(GC' d)才能加载另一个迷你游戏。因此,缓存加载SWF是不可能的。您可以使用unloadAndStop()
调用来释放SWF,在执行此操作之前,请确保从显示列表中删除您的迷你游戏,并且其REMOVED_FROM_STAGE
侦听器会关闭附加到stage
的每个侦听器。此外,您可能需要调试您的迷你游戏SWF以找到可能的内存泄漏,因为您的SWF共享相同的内存空间,其中一个内存泄漏会使您无法在其他所有内容中执行任何操作。