2011-09-26 42 views
0

这是我试图实例化为我的主类的类:的addChild定制类AS3

public class Character extends Sprite { 

    [Embed(source='../lib/front1.svg')] 
    private var front1Class:Class; 
    private var crosshair:Sprite = new front1Class(); 

    public function Character() { 
     trace("started"); 
     Mouse.hide(); 

     crosshair.scaleX = 5; 
     crosshair.scaleY = 5; 
     this.addChild(crosshair); 

     stage.addEventListener(Event.ENTER_FRAME, MrEveryFrame); 
     stage.addEventListener(MouseEvent.CLICK, click); 
    } 


    private function click(evt:MouseEvent):void { 
     trace("clicked @ " + evt.stageX + "," + evt.stageY); 

    } 
    public function MrEveryFrame(e:Event):void 
    { 
     crosshair.x = mouseX - 15; 
     crosshair.y = mouseY - 15; 


    } 

} 

当我将它设置为文档类,它工作正常。

但是......当我提出这是我的文档类,并试图从那里调用它:

public class Shell extends Sprite 
{ 


    private var character:Sprite = new Character(); 


    public function Shell() 
    { 

     addChild(character); 


    } 


} 

它打破,而不再显示Sprite对象(尽管它抹去的鼠标指针)。

这里的交易是什么?您不能将自定义精灵或动画片段类实例化为DisplayObject类?

+1

做内部字符一个跟踪:跟踪(“阶段存在吗?“+阶段);实例化时可能为空。 – meddlingwithfire

+0

如果您在构造函数中扩展Sprite,则需要调用'super();'来获取属于Sprite的所有内容。所以,就在你的行跟踪(“开始”)之前;'添加行'super();'看看是否有帮助。 – Ian

回答

2

构造函数中的阶段是null。这只有当你的类是文档类时才有效,正如你自己发现的那样。因此,改变你的构造是这样的:

public function Character() { 
    trace("started"); 
    Mouse.hide(); 

    crosshair.scaleX = 5; 
    crosshair.scaleY = 5; 
    this.addChild(crosshair); 

    addEventListener(Event.ADDED_TO_STAGE, onAddedToStage); 
} 

private function onAddedToStage(event:Event):void 
{ 

    stage.addEventListener(Event.ENTER_FRAME, MrEveryFrame); 
    stage.addEventListener(MouseEvent.CLICK, click); 
} 

添加监听者将访问阶段是唯一的后阶段,并将它添加十字线后不再null

+0

这解决了我的问题,不确定为什么处理程序正在终止我的精灵显示,但现在可以工作,谢谢 –