【问题标题】:as3 - getting library symbols from an Assets classas3 - 从 Assets 类中获取库符号
【发布时间】:2010-11-30 21:21:56
【问题描述】:

我创建了一个 assets.swf,我想在其中保留我的所有符号。然后,我创建了一个进行嵌入的 Assets 类。它看起来像这样:

public class Assets extends MovieClip
    {
        [Embed(source="assets.swf", symbol="MyBox")]
        public static var MyBox:Class;

        public function Assets() 
        {

        }

    }

现在,在其他类中,我想创建一个新框:

import com.company.Assets;
...
public function Game() 
{

    var myBox:MovieClip = new Assets.MyBox();
    addChild(myBox);

}

我知道这不正确,我得到“TypeError:错误 #1007:在非构造函数上尝试实例化。”如何访问 Assets 类中的资产?

【问题讨论】:

  • 您确定 symbol="MyBox" 是正确的符号名称吗?因为您似乎按照bit-101.com/blog/?p=853 所做的正确
  • 我也有同样的问题。
  • 您使用的是 Flash 还是 FlashDeveloper?我开始怀疑这是 FlashDeveloper 功能(不是 AS3 功能)

标签: flash actionscript-3 embed assets


【解决方案1】:

编辑:我想你会找到答案here

以下内容适用于使用加载有 Loader 类的 SWF 中的类。

private function onLoad(e:Event):void
{
 var domain:ApplicationDomain = LoaderInfo(e.target).applicationDomain;
 var Type:Class = domain.getDefinition("pack.MyComponent") as Class;
 var myBox:MovieClip = new Type();
 addChild(myBox);
}

【讨论】:

    【解决方案2】:

    实现它的另一个好方法是简单地编译 SWC 并像另一个类一样导入它。

    在您的 SWC 中为 AS 导出的每个符号都将在同一范围内可供您使用。

    这样可以节省大量代码编写,并将资源直接嵌入到 SWF 中,避免使用多个加载器。

    【讨论】:

      【解决方案3】:

      如果您仍然想要 .swf 路由,您可以:

      public class Assets extends MovieClip
          {
              [Embed(source="assets.swf", symbol="MyBox")]
              private static var _MyBox:Class;
              public static function get NewBox():MovieClip {
                  return new _MyBox();
              }
          }
      ...
      
      import com.company.Assets;
      ...
      public function Game() 
      {
      
          var myBox:MovieClip = Assets.NewBox;
          addChild(myBox);
      
      }
      

      另一种方法是导出您希望动作脚本使用的符号并改用 .swc。您可以在 flash 文件中设置具有完整命名空间的类,因此对于 MyBox,您可以将其设为 com.company.Assets.MyBox,其用法与您的预期相似:

      import com.company.Assets.*;
      ...
      public function Game() 
      {
      
          var myBox:MovieClip = new MyBox();
          addChild(myBox);
      
      }
      

      【讨论】:

        【解决方案4】:

        您可以在 Asset 类中创建新对象..(这也使您可以创建可重用资产池)

        类似:

        public class Assets extends MovieClip
        {
            [Embed(source="assets.swf", symbol="MyBox")]
            private static var MyBox:Class;
        
            public static function getNewBox():DisplayObject {
                return new MyBox();
            }
        
            public function Assets() 
            {
        
            }
        }
        

        【讨论】:

          猜你喜欢
          • 2010-12-18
          • 1970-01-01
          • 2011-09-05
          • 2010-10-15
          • 2011-07-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-10-22
          相关资源
          最近更新 更多