我创建了一个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类中的资产?
答案 0 :(得分:2)
编辑:我想你会找到答案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);
}
答案 1 :(得分:1)
实现它的另一个好方法是简单地编译SWC并像其他类一样导入它。
在SWC中为AS导出的每个符号都可以在同一范围内使用。
这节省了大量的代码编写,并将资产直接嵌入SWF中,避免了多个加载器。
答案 2 :(得分:0)
如果您仍想要.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);
}
另一种方法是导出要由Action Script使用的符号,然后使用.swc。您可以在Flash文件中设置具有完整命名空间的类,因此对于MyBox,您可以将其设置为com.company.Assets.MyBox,其用法与您的预期类似:
import com.company.Assets.*;
...
public function Game()
{
var myBox:MovieClip = new MyBox();
addChild(myBox);
}
答案 3 :(得分:0)
您可以在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()
{
}
}