Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Снова stage, снова не понимаю (http://www.flasher.ru/forum/showthread.php?t=211041)

neonoviiwolf 15.06.2015 17:14

Снова stage, снова не понимаю
 
Добрый день, хелп, в очередной раз туплю
в классе main пишу
Код AS3:

                        var createSpace:CreateSpace = new CreateSpace();
                        addChild( createSpace);

соответственно объект добавиться на сцену, ссылка на stage у него будет, НО
ведь сначала ведь происходит создание нового объекта, а лишь потом добавление на сцену, а так как внутри класса есть слушатели события клавиатуры, пишу в конструкторе класса
Код AS3:

stage.addEventListener(KeyboardEvent.KEY_DOWN, setKeyPressed);

а тут и борода, stage = null, так как произошла только инициализация, но не добавление на сцену
ок, значит пишет в конструкторе перед добавление слушателя
Код AS3:

addEventListener(Event.ADDED_TO_STAGE, init);

итог - та же борода, stage = null

получается тогда два варианта, либо в конструктор передавать ссылку на stage или создать public function, которую вызывать после добавление класса на сцену и в ней объявлять слушателей сцены?

п.с. мне вообще данный класс не нужно добавлять на сцену, нужно добавлять классы, которые в нём создаются и добавляются на сцену, но сути вопроса не меняет, т.к если его не добавить на сцену, он не получит ссылку на stage
п.п.с. что интересно, в этом классе, если создавать другие классы на этапе вызова конструктора, то stage.addChild() не работает, т.к. stage = null, а this работает, но выходит, что this становится ссылкой на сцену, после addChild(createSpace).

Tails 15.06.2015 17:19

Код AS3:

function Main(){
    if(stage){
        init();
    }else{
        addEventListener(Event.ADDED_TO_STAGE, init);
    }
}
function init(e:Event = null):void{
    removeEventListener(Event.ADDED_TO_STAGE, init);
    trace(stage);
}


ZackMercury 15.06.2015 17:24

Чушь.
stage.addChild и this.addChild - это разные вещи.
stage.addChild - это добавление дитя в DisplayList объекта stage.
this.addChild - это добавления дитя в DisplayList текущего объекта.

Если вы сравните потом

Код AS3:

var childrenOfStage:Array = [];
for(var i:int = 0; i < stage.numChildren; i++)
{
  childrenOfStage.push(stage.getChildAt(i));
}
 
var childrenOfThis:Array = [];
for(var j:int = 0; j < numChildren; j++)
{
  childrenOfThis.push(getChildAt(j));
}
trace(childrenOfStage);
trace(childrenOfThis);


neonoviiwolf 15.06.2015 17:41

Tails в вашем варианте всё заработало, после того, как перенёс слушатели в function init(e:Event = null):void (до этого были в конструкторе), выходит ссылку на stage получают, только слушатели, которые вызываются в init? Я то думал, что весь класс получает в итоге, хотя всё и не работало))
ZackMercury я знаю, что разные вещи, наверно я неудачно выразился

Tails 15.06.2015 17:57

Поле stage принадлежит всему экземпляру класса. Просто в конструкторе оно ещё не задано.

Учтите, что ссылка на stage может быть снова утеряна, после события: Event.REMOVED_FROM_STAGE.

samana 15.06.2015 18:00

Цитата:

выходит ссылку на stage получают, только слушатели, которые вызываются в init?
Не совсем так. Ссылкой на stage можно пользоваться в любом методе класса (кроме конструктора), просто при условии, что stage уже доступна. А так как метод init срабатывает первым, так только ссылка на stage появляется, то в нём просто удобно сразу подписать на сцену всё что нужно.

neonoviiwolf 15.06.2015 18:05

спасибо, а то через раз, от незнания, на грабли наступал
а кстати, почему пишут (e:Event = null) ? работает так же и без null

ZackMercury 15.06.2015 18:07

Если не указать значение по умолчанию, то нельзя будет вызвать вот так
Код AS3:

init();

А только так
Код AS3:

init(null);

или
Код AS3:

init(new Event(...));


AlexCooper 15.06.2015 18:07

Цитата:

Сообщение от neonoviiwolf (Сообщение 1183639)
спасибо, а то через раз, от незнания, на грабли наступал
а кстати, почему пишут (e:Event = null) ? работает так же и без null

Потому как если сработает
Код AS3:

 if(stage){
        init();

вызываеться метод без параметров, и если оставить
Код AS3:

(e:Event)

у вас будет аргумент ошибка

neonoviiwolf 15.06.2015 18:09

ок, понял


Часовой пояс GMT +4, время: 05:52.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.