AS3类不能将MovieClip作为参数传递给它的超类......?

时间:2011-06-03 16:00:34

标签: actionscript-3 parameters constructor parameter-passing movieclip

有什么原因导致它不起作用吗?

以下是代码示例:

main.as

package{
    import flash.display.MovieClip;
    public class main extends MovieClip{
        public function main(){
            addChild(new Square());
        }
    }
}

Square.as(这是一个链接的MovieClip,在其时间轴上有一个名为“submc”的MovieClip)

package{
    import flash.display.MovieClip;
    public class Square extends SuperSquare{
        public var submc:MovieClip;
        public function Square(){
            super(submc, 1234);
            trace("submc : " + submc);
        }
    }
}

SuperSquare.as

package{
    import flash.display.MovieClip;
    public class SuperSquare extends MovieClip{
        public function SuperSquare(_p:MovieClip, _value:Number){
                trace("_p : " + _p + " _value : " + _value);
        }
    }
}

运行此代码时,它会跟踪:

_p : null _value : 1234
submc : [object MovieClip]

“submc”属性无法通过Square超级构造函数。我可能错过了什么?有什么建议吗?

由于

1 个答案:

答案 0 :(得分:0)

旧答案 你必须初始化submc。 Square类的主体应如下所示:

public var submc:MovieClip;
public function Square()
{
     submc = new MovieClip();
     super(submc, 1234);
     trace("submc : " + submc);
}

变量submc为null,直到您初始化它或使其引用其他实例化对象为止。

新答案 如果要引用时间轴上的元素,则可能需要等到父元素添加到舞台后再引用嵌套元素。为此,您可以为ENTER_FRAME或ADDED_TO_STAGE添加事件侦听器。

package{
    import flash.display.MovieClip;
    public class Square extends SuperSquare
    {
        public var submc:MovieClip;
        public function Square()
        {    
            // -- either one of these should work
            addEventListener( Event.ADDED_TO_STAGE, onAdded );
            addEventListener( Event.ENTER_FRAME, validateStage );
        }
    }

    public function onAdded( event:Event ):void 
    {
         // -- creates a problem because you can only call a super constructor in a constructor
         // super(submc, 1234);
         trace("submc : " + submc);
    }

    public function validateStage( event:Event ):void 
    {
         if( !stage ) return;
         if( stage.stageWidth == 0 ) return;

         // -- ok to reference stage elements now

         removeEventListener( Event.ENTER_FRAME, validateStage );
    }
}

我不完全确定这是你的问题。但是,我已经看到过早引用舞台元素的类似问题。