Просмотр полной версии : как управлять системой событий?
alex_h_gerto
06.04.2004, 18:10
Господа, внемлите душераздирающему воплю!
Что есть:
Есть два слоя, на каждом из которых лежит мувик.
Чередой производственных мероприятий определённый скрипт синхронно создаёт в каждом из вышеописанных мувиков по, собственно, мувику и назначает каждому новорожденному фукцию обработки события onmousedown в которой всего-навсего вызывается trace(this).
Что ожидал:
Я, как душа весьма доверчивая, ожидал, что сначала mousedown обработается для всех дочерних объектов того мувика, что лежит сверху в палитре слоёв. Т.е. я думал что флеш будет проходиться по иерархии строго последовательно.
Что получилось:
Собственно, оказалось, что при динамическом создании мувиков флеш размещает объекты иерархично только в системе, отвечающей за отображение. Т.е. дочерние объекты мувика, что лежит в верхнем слое будут всегда перекрывать дочерние объекты нижнего мувика. Это хорошо. Но вот события обрабатываются в порядке, обратном созданию этих мувиков.
Что надо:
Надо, чтобы сначала флеш обработал события mousedown сначала всех дочерних объектов верхнего мувиков, а потом всех нижнего, т.е. также как получилось бы при статическом содании объектов.
Что не надо:
Советы, аля "в mousedown'е рута пройтись циклом по всем дочерним объектам одного мувика потом другого" мне не нужны ибо сам не дурак :). Меня интересуют возможности управления событийной системой во флеше и советы тех, кто решал подобные задачи.
Заранее огромное спасибо.
Длинно, мутно и много нопределенных терминов. Если приложишь ма-а-ленький исходник будет проще. А так я даже не понял о чем ты - то ли о динамической загрузке объектов то ли об их инициализации ;)
Nox Noctis
06.04.2004, 18:38
Оригинал написал(а) Dindin
я даже не понял о чем ты - то ли о динамической загрузке объектов то ли об их инициализации ;) не о том и не о другом :))
2alex_h_gerto
вам, товарисч, на стихи.ру, пожалуй :))
приоритет выполнения обработчиков событий зависит от порядка создания клипов. это верно. порядок создания клипов в главной линейке указан в паблиш сеттингсах в графе Load Order. если там поменять с дефолтового Bottom Up на Top Down, то порядок выполнения обработчиков, навешенных на клипы созданные вручную в линейке изменится. (для клипов лежащих в одном слое первым выполняется тот обработчик, который прикреплен к клипу с большим z-индексом (глубиной)).
для динамических клипов важен только порядок создания, не глубина. клип созданный последним выполняет свои обработчики первым (стек LIFO).
alex_h_gerto
06.04.2004, 19:46
Оригинал написал(а) Nox Noctis
вам, товарисч, на стихи.ру, пожалуй :))
Благодарю покорно, но боюсь с такими вопросами меня там не ждут. :)
приоритет выполнения обработчиков событий зависит от порядка создания клипов. это верно. порядок создания клипов в главной линейке указан в паблиш сеттингсах в графе Load Order. если там поменять с дефолтового Bottom Up на Top Down, то порядок выполнения обработчиков, навешенных на клипы созданные вручную в линейке изменится. (для клипов лежащих в одном слое первым выполняется тот обработчик, который прикреплен к клипу с большим z-индексом (глубиной)).
для динамических клипов важен только порядок создания, не глубина. клип созданный последним выполняет свои обработчики первым (стек LIFO). Вот я и нахожусь в той ситуации, когда важна именно глубина (г-н Лукьяненко аплодирует).
Тогда, выходит, остаётся только реализовывать систему событий собственными руками.
От лица всех огорошенных ожидаемыми, но безрадостными знаниями выражаю глубокую признательность :)
Спасибо!
Nox Noctis
06.04.2004, 20:02
так почему бы не позаботиться о правильном порядке создания клипов ?
нужно только централизовать код, который создаёт клипы.
Nox Noctis
06.04.2004, 20:14
а вот я еще велосипед придумал :)
очередной...
ASBroadcaster.initialize(_root);
_root.onMouseDown = function() {
this.broadcastMessage("onClick");
};
//
_root.createEmptyMovieClip("a", 1);
_root.createEmptyMovieClip("b", 2);
_root.createEmptyMovieClip("c", 3);
_root.createEmptyMovieClip("d", 4);
_root.createEmptyMovieClip("e", 5);
//
test = function () {
trace(this);
};
//
a.onClick = b.onClick=test;
c.onClick = d.onClick=test;
e.onClick = test;
//
_root.addListener(a);
_root.addListener(b);
_root.addListener(c);
_root.addListener(d);
_root.addListener(e);
//
trace(_root._listeners);
_root._listeners.reverse();
trace(_root._listeners);
создаём новое событие с тем же смыслом. это нам нужно чтобы управлять порядком исполнения его обработчиков...
если ничего не менять. то обработчики выполняются в порядке вызова addListener для всех объектов подписанных на это событие.
ссылки на слушающие объекты помещаются в массив _listeners внутри объекта-передатчика событий. этот массив можно переколбасиь как угодно, и обработчики будут выполняться именно в том порядке, в каком объекты расположены в этом массиве.
аминь :)
alex_h_gerto
06.04.2004, 20:19
Оригинал написал(а) Nox Noctis
так почему бы не позаботиться о правильном порядке создания клипов ?
нужно только централизовать код, который создаёт клипы.
Проблема в том, что этот самый централизированный код создаёт клипы по двум параллелям (слоям). В зависимости от действий пользователя на первом слое, на втором что-то происходит. Основная причины моих душевных мучений состоит в том, что и объекты первого слоя, и объекты второго обрабатывают события, а поскольку верхний слой в идеологически имеет больший приоритет, то нельзя допустить чтобы второй выхватывал сообщения "вперёд батьки".
Самое смешное, что да, событийная система определяется LIFO, а визуализируются те же самые динамические клипы в строгом соответствии с иерархией. Т.е., дочерний объект верхнего мувика всегда перекроет дочерний нижнего, даже если дочерние нижнего создавались последними.. Именно такое несоответствие меня и огорчает :)
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.