класс AS3 не может передать MovieClip в качестве параметра своему суперклассу ...? - PullRequest
0 голосов
/ 03 июня 2011

Есть ли причина, по которой он не может работать?

Вот пример кода:

main.as

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

Square.as (который является связанным MovieClip, у которого на временной шкале есть MovieClip с именем «submc»)

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 super constructor. Я наверное что-то пропустил? Любой совет?

Спасибо

1 Ответ

0 голосов
/ 03 июня 2011

Старый ответ Вы должны инициализировать Submc. Тело класса Square должно выглядеть так:

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

Переменная submc будет нулевой, пока вы либо не инициализируете ее, либо не создадите ссылку на какой-либо другой экземплярный объект.

Новый ответ Если вы ссылаетесь на элементы на временной шкале, вам может потребоваться подождать, пока родительские элементы не будут добавлены на сцену, прежде чем ссылаться на вложенные элементы. Для этого вы можете добавить прослушиватель событий для 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 );
    }
}

Я не совсем уверен, что это ваша проблема. Тем не менее, я видел похожие проблемы со ссылками на элементы сцены слишком рано.

...