Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript (http://www.flasher.ru/forum/forumdisplay.php?f=5)
-   -   как управлять системой событий? (http://www.flasher.ru/forum/showthread.php?t=56713)

alex_h_gerto 06.04.2004 18:10

как управлять системой событий?
 
Господа, внемлите душераздирающему воплю!

Что есть:
Есть два слоя, на каждом из которых лежит мувик.
Чередой производственных мероприятий определённый скрипт синхронно создаёт в каждом из вышеописанных мувиков по, собственно, мувику и назначает каждому новорожденному фукцию обработки события onmousedown в которой всего-навсего вызывается trace(this).

Что ожидал:
Я, как душа весьма доверчивая, ожидал, что сначала mousedown обработается для всех дочерних объектов того мувика, что лежит сверху в палитре слоёв. Т.е. я думал что флеш будет проходиться по иерархии строго последовательно.

Что получилось:
Собственно, оказалось, что при динамическом создании мувиков флеш размещает объекты иерархично только в системе, отвечающей за отображение. Т.е. дочерние объекты мувика, что лежит в верхнем слое будут всегда перекрывать дочерние объекты нижнего мувика. Это хорошо. Но вот события обрабатываются в порядке, обратном созданию этих мувиков.

Что надо:
Надо, чтобы сначала флеш обработал события mousedown сначала всех дочерних объектов верхнего мувиков, а потом всех нижнего, т.е. также как получилось бы при статическом содании объектов.

Что не надо:
Советы, аля "в mousedown'е рута пройтись циклом по всем дочерним объектам одного мувика потом другого" мне не нужны ибо сам не дурак :). Меня интересуют возможности управления событийной системой во флеше и советы тех, кто решал подобные задачи.

Заранее огромное спасибо.

Dindin 06.04.2004 18:16

Длинно, мутно и много нопределенных терминов. Если приложишь ма-а-ленький исходник будет проще. А так я даже не понял о чем ты - то ли о динамической загрузке объектов то ли об их инициализации ;)

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, а визуализируются те же самые динамические клипы в строгом соответствии с иерархией. Т.е., дочерний объект верхнего мувика всегда перекроет дочерний нижнего, даже если дочерние нижнего создавались последними.. Именно такое несоответствие меня и огорчает :)


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

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