Просмотр полной версии : Очередь добавления в DOC
Akopalipsis
25.10.2013, 18:32
Вообще я очень удивлён, так как считал, что когда мы документ класс подписываем под ADDED_TO_STAGE,
то код в обработчике событий выполнится только после добавления Main на stage и как я считал ( наверное ошибочно ), что именно в этот момент, он добавится и DOC. Неужели Main добавляется в DOC только тогда, когда, что то добавится в Main?
Что за ахинея. С чего вы решили, что пока в мейник не добавлено ничего, его нет? Конечно же есть. Открытие окна ( при компиляции ) это и есть ваш мейн по сути. Мейн на стейдж добавляется автоматически, в случае если это не подгружаемая флешка. Посему в констуркторе основного мейна достаточно init() без всяких эддед ту стейдж и проверок
Akopalipsis
25.10.2013, 19:06
in4core сейчас я расскажу Вам в чём дело.
От кода ниже я ожидал, что сначала в ДОК добавится Main, а уже потом Sprite.
Но на деле наоборот.
package
{
import flash.display.Sprite;
import flash.events.Event;
public class Main extends Sprite
{
private var _view:View;
public function Main()
{
if (stage)init();
else addEventListener(Event.ADDED_TO_STAGE, init);
}
private function init(event:Event=null):void
{
removeEventListener(Event.ADDED_TO_STAGE, init);
_view = new View(this);
var sprite:Sprite = new Sprite();
_view.addedChild(sprite);
}
}
}
package
{
import flash.display.DisplayObject;
import flash.display.DisplayObjectContainer;
import flash.events.Event;
public class View
{
private var _doc:DisplayObjectContainer;
public function View(doc:DisplayObjectContainer)
{
_doc = doc;
_doc.addEventListener(Event.ADDED, doc_addedHandler);
}
public function addedChild(child:DisplayObject):void
{
_doc.addChild(child as DisplayObject);
}
private function doc_addedHandler(event:Event):void
{
trace(event.target);
}
}
}
Dukobpa3
25.10.2013, 19:15
_doc это и есть мейн.
На момент создания _view - он уже на стейдже, соответственно событие не отрабатывает.
Надо заметить что main на стейдж не добавляется:)
>>На момент создания _view - он уже на стейдже
не, на стейдж он попадет после того как конструктор отработает
т.е. первый вызов от добавления спрайта, второй от добавления самого main
package
{
import flash.display.Sprite;
import flash.events.Event;
public class Main extends Sprite
{
private var _view:View;
public function Main()
{
_view = new View(this);
var sprite:Sprite = new Sprite();
_view.addedChild(sprite);
trace("consructor comleted");
}
}
}
Добавлено через 57 секунд
>>Надо заметить что main на стейдж не добавляется
это почему ?
что значит добавляется main?
>>что значит добавляется main?
значит что экземпляр документ класса добавляется как child на stage
Dukobpa3
25.10.2013, 19:40
не, на стейдж он попадет после того как конструктор отработает
Че-то я не понял.
В конструкторе мы смотрим - стейдж есть (значит уже на стейдже) или нету. Если нету - то асинхронная подписка.
В любом случае в ините мейн уже на стейдже, как бы там события не развивались до этого.
Имеется ввиду что как только main добавляется в стейдж вызывается init(); А так как main это экземпляр то сначала отрабатывает конструктор. Я лично так понимаю.
В конструкторе мы смотрим - стейдж есть (значит уже на стейдже) или нету.
не, не значит
есть ссылка на stage и только в том случае когда флешка запускается прямо в плеере, если подгружается то нет и ссылки
но это не значит, что спрайт уже добавлен, да и как, если он еще не создан ?
silin, я правильно написал?
эта конструкция
if (stage)init();
else addEventListener(Event.ADDED_TO_STAGE, init);
актуальна для подгружаемых мувиков в случае если в конструкторе(при создании) нужен доступ к stage
для 'головного' мувика ссылка на stage уже есть, поэтому сразу отрабатывает init
Имеется ввиду что как только main добавляется в стейдж вызывается init(); А так как main это экземпляр то сначала отрабатывает конструктор. Я лично так понимаю.Нет. Документ-класс получает ссылку на стейдж волшебным способом ДО того, как будет создан и добавлен. Иначе условие не имело бы смысла. Уберите подписку, обращайтесь сразу к стейдж в конструкторе — и никаких проблем, стейдж есть в конструкторе, а не после него.
Весь этот эпиграф с подпиской только на случай загрузки в другую флэшку.
Akopalipsis
25.10.2013, 20:53
silin Спасибо! я кажется разобрался. Так как stage уже есть, срабатывает init(), который создаёт sprite до завершения выполнения конструктора.
Но если честно, то я думал, что пока не добавится Main не может добавиться нечего.
Чтобы разобраться надо всего два трейса вставить
package
{
import flash.display.Sprite;
import flash.events.Event;
public class Main extends Sprite
{
public function Main():void
{
if (stage) init();
else addEventListener(Event.ADDED_TO_STAGE, init);
trace("Constructor");
}
private function init(event:Event = null):void
{
trace("Init", event);
removeEventListener(Event.ADDED_TO_STAGE, init);
// entry point
}
}
}
Добавлено через 7 минут
пока не добавится Main не может добавиться нечегоВы же подписываетесь на ADDED а не на ADDED_TO_STAGE.
Akopalipsis
25.10.2013, 21:41
Wolsh Спасибо! Капельку рад что разобрался в этом сейчас.
Уолш, но ведь stage является контейнером. Чтобы добавить экземпляр Main его как минимум надо создать, и следовательно вызвать конструктор.
Akopalipsis
25.10.2013, 21:58
У меня тоже вызывает некое недоумение эта ситуация, ведь, как все говорят - мы добавляем обьекты в класс Main. И получается, что добавили ещё до его создания. я эту интригу обьяснил так - пусть майн ещё не создан, но мы и не добавляем не чего в майн, мы ведь тип режим ДОКом. И тогда само напрашивается, что ДОК тоже есть сразу.
Экземпляр Main cам добавляется в список отображения stage!
У меня тоже вызывает некое недоумение эта ситуация, ведь, как все говорят - мы добавляем обьекты в класс Main. И получается, что добавили ещё до его создания. я эту интригу обьяснил так - пусть майн ещё не создан, но мы и не добавляем не чего в майн, мы ведь тип режим ДОКом. И тогда само напрашивается, что ДОК тоже есть сразу.
такое ощущение, что вы сами стремитесь себя запутать :)
использовать(добавить) объект до завершения его создания логично нельзя, но почему нельзя добавить в него что-то в процессе создания ?
такая ситуация для всех дисплейобжектов, документ класс в этом смысле ничем не выделяется
Чтобы добавить экземпляр Main его как минимум надо создать, и следовательно вызвать конструктор.Ну, Вы создаете? Вызываете? Нет? Магия!
Да просто в init() можно вставить trace(this), и получите честный [object Main].
Так что конструктор уже "как-то" отработал, хотя написанный в конструкторе трейс выведется после трейса в init().
Ну так магия?
"Чем внимательней смотришь, тем меньше видишь" (©Иллюзия обмана)
да я знаю, что выводится. Магия... Akopalipsis, вас захвалил. Лесть расслабляет.
Ладно, попробую раскрыть трюк.
Просто Вы воспринимаете слово "конструктор" слишком буквально. Вы думаете что пока не выполнится весь код в функции, объект еще не создан.
Это не так. Прикол в том, что код в конструкторе вообще-то ничего не создает касательно объекта.
Все, что касается "состава" объекта как экземпляра класса, написано в теле класса. В конструкторе Вы можете что-то инициализировать из переменных (стоп, а откуда взялись переменные, если мы не писали в конструкторе "var... "? АГА! Так понятно?), запустить какие-то функции (стоп, а какие же функции экземпляра, если экземпляр то еще не создан? Объявленные в теле класса, АГА!)
Так что на момент выполнения кода в конструкторе объект уже полностью создан и выполняет только "первоначальную настройку".
После которой new его возвращает.
Можно рассматривать конструктор как одну из функций в теле класса (чем он и является), автоматически выполняемую сразу после создания объекта. Всё.
Akopalipsis
25.10.2013, 23:23
И ещё в классе можно вызывать методы до вызова конструктора, если использовать статику.
Они почему то в первую очередь инициализируются.
И Вам спасибо за объяснения!
Dukobpa3
25.10.2013, 23:28
Они почему то в первую очередь инициализируются.
Потому что статика в сигнатуре класса а не в объекте созданном.
т.е. статика "инициализируется" уже на этапе компиляции.
Добавлено через 30 секунд
И именно поэтому статика не наследуется и не оверрайдится.
Akopalipsis
26.10.2013, 16:10
Мне ещё вот что хочется узнать - ведь сначала обьект добавляется в ДОК и только потом на stage?
Ведь обратная последовательность невозможна?
Мне ещё вот что хочется узнать - ведь сначала обьект добавляется в ДОК и только потом на stage?
Ведь обратная последовательность невозможна?
Хелп:
Рабочая область — это основной контейнер экранных объектов. В каждом приложении есть один объект рабочей области, который содержит все экранные объекты. Рабочая область — это контейнер верхнего уровня иерархии списка отображения:
С каждым SWF-файлом связан класс ActionScript, который называется основным классом SWF-файла. При открытии SWF-файла в Flash Player или Adobe AIR вызывается функция конструктора для этого класса. Создаваемый экземпляр (который всегда принадлежит к типу экранного объекта) добавляется в качестве объекта рабочей области. Основной класс SWF-файла всегда расширяет класс Sprite (дополнительные сведения см. в разделе Преимущества подхода с использованием списка отображения).
Рабочую область можно вызвать с помощью свойства stage любого экземпляра DisplayObject. Дополнительные сведения см. в разделе Установка свойств рабочей области.
Psycho Tiger
26.10.2013, 16:33
ведь сначала обьект добавляется в ДОК и только потом на stage?
stage тоже док.
Akopalipsis
27.10.2013, 00:16
iNils Спасибо! Только спрашивал я не по тому, что не читал, а из-за того, что есть возможность не правильной трактовки. Когда я проверяю сам, то прежде всего обьект добавляется в ДОК, а потом уже на stage. Но может быть так, что и это уже не ДОК а документ класс, про который я забыл на радостях из-за полученных вчера ответов. Понял это только сейчас, а до этого мозг всячиски отрицал класс Main...
Psycho Tiger и Вам спасибо! И ещё я Вам желаю побольше свободного времени и не уставать!)
...это я про статью)
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.