我正在申请测试我自愿参加的游戏的艺术。现在我发布的示例只会接触盔甲,但加载过程在整个程序中是相同的。我有一个电影剪辑准备好保存加载的文件,但它通过类将其添加到容器中。它应该如何工作,但我的问题是,如果您使用具有相同类的另一个文件,那么它将默认为加载的第一个文件。即使我使用 loaderr.unloadAndStop(( 并从阶段中删除所有内容,它也将始终加载与我正在加载的类相对应的第一个文件。由于装甲部件是按类加载的,因此在不更改每次导出时更改类的情况下测试装甲文件的多个更改变得很麻烦。这是正在使用的代码的示例,我很好奇是否有任何方法可以改进它。`
public class Test extends MovieClip
{
public var mcChar:Display;
public var btnTest:SimpleButton;
public var btnTest2:SimpleButton;
public var ldr:Loader = new Loader();
public var strSkinLinkage:String;
public var strGender:String;
public function Test()
{
btnTest.addEventListener(MouseEvent.CLICK, TestP);
btnTest2.addEventListener(MouseEvent.CLICK, TestP2);
}
public function TestP(e:MouseEvent)
{
mcChar = new Display();
stage.addChild(mcChar);
mcChar.x = 789.6;
mcChar.y = 604.75;
mcChar.width = 667.15;
mcChar.height = 478.55;
strSkinLinkage = "CNC";
strGender = "M"
this.ldr.load(new URLRequest("CNC.SWF"), new LoaderContext(false, ApplicationDomain.currentDomain));
this.ldr.contentLoaderInfo.addEventListener(Event.COMPLETE, this.onLoadSkinComplete);
}
public function TestP2(e:MouseEvent)
{
mcChar = new Display();
stage.addChild(mcChar);
mcChar.x = 789.6;
mcChar.y = 604.75;
mcChar.width = 667.15;
mcChar.height = 478.55;
strSkinLinkage = "CNC";
strGender = "M"
this.ldr.load(new URLRequest("CNC2.SWF"), new LoaderContext(false, ApplicationDomain.currentDomain));
this.ldr.contentLoaderInfo.addEventListener(Event.COMPLETE, this.onLoadSkinComplete);
}
public function onLoadSkinComplete(e:Event):*
{
var AssetClass:Class;
try
{
AssetClass = (getDefinitionByName(((strSkinLinkage + strGender) + "Head")) as Class);
mcChar.head.addChildAt(new (AssetClass)(), 0);
}
catch(err:Error)
{
AssetClass = (getDefinitionByName(("mcHead" + strGender)) as Class);
mcChar.head.addChildAt(new (AssetClass)(), 0);
};
AssetClass = (getDefinitionByName(((strSkinLinkage + strGender) + "Chest")) as Class);
chest.addChild(ldr.content (AssetClass)());
mcChar.chest.addChild(new (chest)());
this.ldr.contentLoaderInfo.removeEventListener(Event.COMPLETE, this.onLoadSkinComplete);
}
}
' 我认为它在这个网站上的格式不好,但这是核心代码。我有单独的删除功能,我的导入都在那里。就像我说的,我似乎无法正确格式化它。这是我的测试场景,不是我可以选择文件的完整动态测试器。任何帮助弄清楚如何使用最新文件,不胜感激。同样对于一些背景,我更像是as3的自学成才的新手。
在 AS3 中加载和卸载资产时,有几件事需要学习。
应用程序域是类定义的容器。getDefinitionByName(...( 方法基本上与在当前 ApplicationDomain 上调用 ApplicationDomain.getDefinition(...( 相同(或者可能在主ApplicationDomain上,我从未尝试过在加载的内容中执行此操作(。作为附带的结果,您不能在同一ApplicationDomain中有两个具有相同名称的类(或者更确切地说,您可以,但其中一个无法访问,谁知道呢(。
当您加载属于"同一域"类别(同一www域或相同/嵌套的本地文件夹(的另一个 SWF 时,AS3 会自动将加载的 SWF 中的所有定义混合到主应用程序域中。如果您愿意对加载/卸载内容进行一些高级控制,或者/并且存在具有类似类集的"皮肤"库,则需要将加载的文件放入单独的ApplicationDomain中,否则它们的定义将发生冲突,结果将是不可预测的(但显然不令人满意(。
Loader.load(...( 方法有第二个参数,允许你这样做:
// If there are no mandatory constructor arguments,
// you are free to omit the () brackets. I like doing so.
var aLoader:Loader = new Loader;
var aRequest:URLRequest = new URLRequest("mylibrary.swf");
// Documentation states that passing no argument here is
// the same as passing ApplicationDomain.currentDomain.
var childDomain:ApplicationDomain = new ApplicationDomain;
var aContext:LoaderContext = new LoaderContext(false, childDomain);
aLoader.load(aRequest, aContext);
因此,在加载外部 SWF 库时,可以按如下方式获取其类/定义:
var aClass:Class;
// If you get things from the loaded SWF's Library
// then it is Sprite or MovieClip for the most cases.
var anAsset:Sprite;
aClass = aLoader.contentLoaderInfo.applicationDomain.getDefinition("MyAssetClass") as Class;
anAsset = new aClass;
当您不再需要某些加载的库时,可以在相关的加载器实例上调用 Loader.unloadAndStop(...( 方法。结合将SWF加载到单独的ApplicationDomain中,您可以确保所有加载的内容(图形,类,声音(都被卸载,销毁和删除(我实际检查过(:
// Passing "true" also forces the Garbage Collector
// to actually do its job for a change.
aLoader.unloadAndStop(true);