加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

flash – 使用SWC – getDefinitionByName问题

发布时间:2020-12-15 07:32:44 所属栏目:百科 来源:网络整理
导读:我在fla中有一堆图形资源,MovieClip链接到某些类.我将fla导出为swc,我将其添加到我的库中,并选择“Merged into Code”. 一切都很好,我可以创建我的MovieClip的实例,只需通过这样调用他们的类. //example 1 var newMc:BaseClass = new GraphicAsset(); 现在如
我在fla中有一堆图形资源,MovieClip链接到某些类.我将fla导出为swc,我将其添加到我的库中,并选择“Merged into Code”.

一切都很好,我可以创建我的MovieClip的实例,只需通过这样调用他们的类.

//example 1
     var newMc:BaseClass = new GraphicAsset();

现在如果我想要执行以下操作,Flash会抛出错误,GraphicsAssetClass为null!

//example 2
    var GraphicsAssetClass:Class = getDefinitionByName("GraphicAsset") as Class;

我可以让上述线路工作的唯一方法就是这样做

//example 3
    var newMc:GraphicAsset;
    var GraphicsAssetClass:Class = getDefinitionByName("GraphicAsset") as Class;

    //then I'm able to do this 
    var newMc:BaseClass = new GraphicsAssetClass();

你能想到一个解决方案,我可以通过调用getDefinitionByName()简单地获取类
就像我在例2中所做的那样,无需借助示例3解决方案.

解决方法

问题是编译器将排除代码中某处未直接引用的任何类.这是编译器通过设计应用的优化.

正常的方法就像你在“例子3”中所示.但重要的是要注意两条线不必在同一个地方.只要

var newMc:GraphicAsset;

在SWF的某个地方,从主要的执行路径引用,然后GraphicAsset的类定义将包含在最终的swf中.然后你可以打电话给…

var GraphicsAssetClass:Class = getDefinitionByName("GraphicAsset") as Class;

从其他地方完全,它会像你期望的那样工作.

甚至可能(并且很常见)在seaprate SWF中找到两条线.在这种情况下,一个swf会在运行时加载另一个swf.通常,加载器swf将是使用getDefinitionByName(“SomeClass”)的加载器,并且加载的swf将是定义类SomeClass的swf,并使用var a:SomeClass;来确保将类构建到swf中.

出于这个原因,您经常会在“库swf”中找到一个名为“MyLibraryManifest”的类,然后从该swf的主影片剪辑中引用.然后“manifest”类看起来像这样:

class MyLibraryManifest {

   private var a:GraphicAsset;
   private var b:SomeClass;
   private var c:SomeOtherClass;

   //... and so on...

}

[edit]您可以对mxmlc编译器使用-includes或-include-libraries选项,强制链接器包含一个或多个单独的类(或整个swc),而不应用上面描述的“修剪优化”.

see adobe’s site解释mxmlc命令行选项.

选项也可以是specified in a config file,允许您控制Flex和/或Flash IDE在幕后调用编译器的方式.

祝好运!

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读