ActionScript 3.0 stageWidth в потребителски клас

Как да получа достъп до свойствата на Stage Class в Costum Class?

Клас:

package {
    import Main;
    import flash.events.*;
    import flash.display.Sprite;
    import flash.display.Stage;

    public class Run extends Sprite {
        var obj:a1_spr;


        public function Run() {
            runAssets();

        }



        private function runAssets():void {
            obj = new a1_spr()
            addChild(obj);
            obj.x = stage.stageWidth/2;

        }
    }
}

Изход:

TypeError: Error #1009: Cannot access a property or method of a null object reference.

person dd .    schedule 26.07.2009    source източник


Отговори (3)


this.addEventListener(Event.ADDED_TO_STAGE, handleAdedToStage)

private function handleAddedToStage(event:Event):void
{
    this.runAssets()
}

private function runAssets():void
{
    obj = new a1_spr();
    addChild(obj);
    obj.x = this.stage.stageWidth/2;
}

Няма да имате достъп до сцената в конструктора (освен ако не инжектирате сцената в класа). Спрайт има свойство на сцената.

person Joel Hooks    schedule 26.07.2009
comment
Благодаря. Работи. Но не съм сигурен, че разбирам защо. Можете ли да обясните защо трябва да го стартирам със слушател? - person dd .; 26.07.2009
comment
Свойството stage на всички DisplayObjects е null, докато не бъдат добавени към списъка за показване, така че трябва да се уверите, че обектът е в него, преди да се опитате да получите достъп до него;) - person Cay; 26.07.2009
comment
Когато създадете вашия обект с var myObject:MyObject = new MyObject(), конструкторът се изпълнява незабавно, включително всички методи, които извиквате и вътре в конструктора. Дори ако следващият ред след новия MyObject е addChild(myObject), myObject няма да бъде на сцената или да има препратка към сцената. МОЖЕТЕ също така да направите stage:Stage аргумент на конструктора на MyObject, така че new myObject(this.stage), и ще имате незабавен достъп до етапа на приложението. - person Joel Hooks; 27.07.2009

За да разширим казаното от Джоел и да го поставим в контекст:

Всеки дисплейен обект има свойство .stage, но това свойство е null, докато не добавите своя дисплейен обект в списъка за показване. Така че по време на изграждане никога няма да имате достъп до него (защото се добавя след това)

Събитието ADDED_TO_STAGE се задейства, когато добавите вашия обект към сцената, като знаете, че свойството .stage вече е попълнено. След като това се случи, можете да получите достъп до сцената от всяка точка на вашия обект.

Надявам се, че това изяснява нещата за вас.

person Tyler Egeto    schedule 26.07.2009

когато flash компилира fla активите с вашите .as файлове, няма етап. така че кодът се инициира като подготовка за вашия клас документи, трябва да слушате дали има етап, за да може да бъде изобразен.

ето защо слушате ADDED_TO_STAGE, за да проверите дали наистина е в списъка за показване.

Този проблем възниква за всички обекти за показване, тъй като те трябва да бъдат добавени към списъка за показване, когато има действителен етап.

свикнете да добавяте този слушател и проверете за етап. особено когато работите в екип и правите свои собствени компоненти в по-голям проект.

person martinlindelof    schedule 30.07.2009