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