это и этап в as3 - PullRequest
       2

это и этап в as3

1 голос
/ 16 марта 2011

У меня небольшая путаница при различении этого в файле as3

Допустим, у меня есть основной этап, связанный с Main.as

тогда в чем разница между

this.addChild ()
stage.addChild ()

также, какой тип объекта "этот"

допустим, я создаю класс и передаю экземпляр "this", чтобы я мог ссылаться на stage изнутри MC

var mc: Derp = new Derp (this)

внутри сумасшедшего что это? Это тип общего объекта?

Ответы [ 2 ]

9 голосов
/ 16 марта 2011

Внутри членов класса, this относится к текущему экземпляру, к которому была вызвана функция-член (поэтому он всегда того же типа, что и класс). Например, если у вас был класс Twang с функцией-членом func:

var twang1:Twang = new Twang();
twang1.func();        // Inside func(), "this" will refer to twang1

Flash сначала создает сцену (типа Stage), на которой все остальное должно быть размещено (прямо или косвенно). Затем он создает экземпляр класса вашего документа и помещает его на сцену как ребенок. Таким образом, this в вашем коде никогда не может ссылаться на сцену, поскольку вы не написали класс Stage.

Поскольку дерево отображения во Flash является иерархическим, при добавлении чего-либо к дочернему объекту, который уже находится на сцене (по крайней мере косвенно), оно будет отображаться на экране. Таким образом, разница между this.addChild() и stage.addChild() заключается в том, в какой контейнер будет вставлен объект.

При передаче this в конструктор другого объекта он будет иметь тип класса, в котором определен метод (который использует this); так что в этом случае это будет тип класса документа.

Вместо того, чтобы передавать контейнеры экранных объектов другим объектам, чтобы они могли добавлять в него дочерние элементы, вы можете иметь классы, наследуемые от Sprite (или некоторых других DisplayObjectContainer), и добавлять дочерние элементы к самим . Затем вы можете добавить созданный вами объект (который будет содержать подобъекты) к себе (к экземпляру класса документа), который находится на сцене. Это также дает гораздо лучшую инкапсуляцию.

Обратите внимание, что если вы хотите добавить детей на сцену напрямую, вам не нужно передавать сцену этим объектам; у них уже есть свойство stage только для этой цели. Единственная хитрость в этом свойстве состоит в том, что оно равно нулю, пока объект фактически не добавлен на сцену; Итак, вам нужен слушатель событий:

public class Car : Sprite {
    public Car() {
        this.addChild(new Wheel());    // Add to self

        this.addEventListener(event.ADDED_TO_STAGE, populateStage);
    }

    private function populateStage():void {
        stage.addChild(new RandomThingToAddToStage());
    }
}

Наконец, обратите внимание, что вам не нужно указывать this в большинстве случаев. Следующие две строки эквивалентны (в методе класса):

addChild(foo);
this.addChild(foo);
2 голосов
/ 16 марта 2011

Ниже приведен пример класса документа:

package
{
    import flash.display.Sprite;
    import flash.events.Event;

    public class Main extends Sprite
    {
        public function Main()
        {
            this.addChild(new Sprite());

            addEventListener(Event.ADDED_TO_STAGE, onAddedToStage);

        }// end function

        public function onAddedToStage(e:Event):void
        {
            stage.addChild(new Sprite());

        }// end function

    }// end class

}// end package

Используя приведенный выше пример, ключевое слово this относится к текущему экземпляру, в этом (не каламбур) случае это будет экранный объект Main. Когда вы вызываете метод addChild() для этого, вы вызываете метод addChild() для экранного объекта Main. На этом этапе, когда вы добавляете новый экземпляр Sprite, вы добавляете его к экранному объекту Main или, другими словами, this экранный объект.

stage, с другой стороны, является публичным свойством Main, в котором хранится ссылка на сцену. Когда вы добавляете новый экземпляр Sprite, используя метод addChild() ссылки на сцену, вы добавляете этот экземпляр на сцену, а не экранный объект Main.

Проще говоря, Main - это дочерний экранный объект сцены. Поэтому, когда вы делаете stage.addChild(new Sprite()), stage теперь имеет два дочерних объекта, новый экземпляр Sprite и Main. Однако когда вы делаете this.addChild(new Sprite()) из класса Main, вы переходите к Main. Так что теперь у сцены есть дочерний экранный объект Main, а Main имеет новый экземпляр Sprite в качестве дочернего экранного объекта.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...