Автор: © Nox Noctis
---> что будем делать ? : будем изобретать вечный двигатель с
велосипедным приводом (это если в общем и целом). если конкретнее - то
посмотрим, как при помощи AS[MX] можно создать новое событие (event),
которое будет действовать ничуть не хуже стандартных событий (вроде
хорошо знакомых onEnterFrame, onMouseDown и т п) // ---> а зачем ?
: это философский вопрос - "зачем" :) никогда не задавайте
такой странный вопрос программисту - он может обидеться :)) вообще - это
бывает очень удобно. например, можно создать событие onDoubleClick, которое
будет происходить при двойном клике мышки, можно сделать событие
onMiddleMouse, которое будет срабатывать при нажатии средней кнопки мыши и т д и
т п... не стоит зацикливаться только на мышке... если вас здесь что-то и
ограничивает, то это исключительно ваша буйная фантазия ;) плюс - иногда
бывает нужно сделать так, чтобы объект реагировал на события определенные
для совершенно другого класса объектов. один из способов (и довольно удобный)
этого добиться - использовать пару недокументированных особенностей
МХ. // ---> ой как все запутанно и недокументировано !.. : спокойно
!.. сядьте на место :)) все, можно считать, документировано - потому что
информацию в Сети найти можно (на сайтах "для отмороженных" (гуру в
смысле :) )) а раз информация доступна в Сети - то какие еще документы Вам
нужны ? мало ли чего макромедия не захотела в хэлп включить !
:))
// // итак... //
1. Events
______________________________________________________
-- что это
такое: в принципе, событием может быть что угодно - от нажатия кнопки мыши,
до изменения состояния какой-то переменной. onEnterFrame, onKeyDown,
onMouseMove - все это до боли знакомые события :) у объектов, для которых эти
события есть в списке 'events', они срабатывают автоматически: стоит только
определить функцию с нужным именем, и все готово - эта функция будет
срабатывать при каждом сигнале от соответствующего события. в МХ предусмотрен
способ создания таких событий. для этого сигналы о событиях передаются в
виде "сообщений" у каждого из которых есть имя, и список
параметров (возможно пустой).
-- откуда берутся
сообщения: генерируются объектами в ситуациях, которые вы определите. это
может быть любая ситуация, в которой вам необходима реакция любого количества
объектов какого-то класса. (пример из стандартных - все объекты класса
MovieClip получают сообщение onEnterFrame с заданной частотой)
-- кому
передаются эти сообщения: всем объектам, которые работают на прием
"сообщений" данного генерирующего сообщения объекта.
-- для
чего передаются сообщения: "имя" сообщения о событии является
названием той функции, которыю нужно вызвать у всех объектов, которые это
сообщение получат (если есть параметры, то они соответственно это функции и
передаются).
например: onMouseDown - это событие, с именем
"onMouseDown", без параметров, которое передается всем
"слушающим" объектам один раз, при нажатии на левую кнопку
мыши.
>> таким образом все, что нам нужно чтобы "создать
событие" это : > узнать как отсылать такие сообщения > узнать
как включить какой-нибудь объект на прием сообщений
2. listener и
addListener() ______________________________________________________ -- что
такое listener: listener - это объект, способный принимать сообщения о
событиях от какого-либо другого объекта. в списке "listeners"
многих стандартных объектов даны предопределенные названия событий, которые
может посылать данный объект. к примеру в списке listener'ов объекта Mouse
есть "onMouseDown", "onMouseUp" и "onMouseMove".
это значит, что при соответствующих событиях мышки всем объектам,
добавленным в список лисенеров объетка Mouse будет передано соответствующее
сообщение. добавление объектов в список принимающих события как раз и
занимается функция
addListener.
источник.addListener(приемник);
где
"источник" - это объект, генерирующий события, а "приемник"
- это объект, который эти события ловит. все лисенеры объекта хранятся в
свойстве (опять-таки недокументированном) _listeners. > пример: //
---------- testListener = {name:"TEST"}; // объект класса Object со
свойством name testListener.onMouseDown = function()
{ trace("MouseDown triggered
!"); }; Mouse.addListener(testListener); // теперь объект
testListener принимает сообщения о событиях объекта
Mouse trace(Mouse._listeners[0].name); // убеждаемся, что testListener
добавился в массив лисенеров // ----------
3. ASBroadcaster
______________________________________________________ ASBroadcaster - это
объект предназначенный для программной передачи сообщений о событиях. метод
ASBroadcaster.initialize(объект); разрешает для данного объекта генерацию
событий. объект, который мы передали методу initialize в качестве аргумента,
теперь может отсылать сообщения о событиях. событие передается всем лисенерам
при помощи метода broadcastMessage("message", parameters); где
message - это строка-имя события, а parameters - список (возможно пустой)
параметров. проще всего понять что происходит на примере: //
---------- // /* эта функция будет выдавать сообщение о событии
"onSecondFrame" каждый второй кадр. для примера передаются пять
параметров (хотя их может быть сколько угодно, а может не быть вообще)
*/ _root.onEnterFrame = function() { if (flag)
{ this.broadcastMessage("onSecondFrame", 1, 2, 3, 4, 5); flag =
false; } else { flag = true; } }; // регистрируем _root как
передающий события объект ASBroadcaster.initialize(_root); // создаем
лисенер a = {}; // определяем обработчик события
onSecondFrame a.onSecondFrame = function() { // выводим переданные
аргументы trace("Second Frame :: "+arguments); }; // включаем
объект "a" на прослушивание событий объекта
_root _root.addListener(a); // //
---------- ----------------------------------------------------------------
вот
собственно и все :)) осталось все это творчески переосмыслить и применить
:)) главное - не стоит городить реактивный двигатель там, где достаточно
самоката :))
пример использования всего механизма: (Ctrl+C ->
Ctrl+V -> Ctrl+Enter :)) )
// -------- DoubleClick Event Example
-------- // © by Nox Noctis :)xentarknight@narod.ru // функция выдает
сообщение о даблклике Mouse.isDouble = function() { // проверяем второй
это клик или нет if (!Mouse.clickFlag) { // если специально не определено
значение максимальной задержки между кликами if (!Mouse.clickTimeout) { //
значение по умолчанию Mouse.clickTimeout = 300; } // через время
определенное в Mouse.clickTimeout скидываем флажок => // ограничиваем
время в течение которого два клика считаются
"двойным" Mouse.clickFlag = setInterval(Mouse.cancelDouble,
Mouse.clickTimeout); } else { // ну, вы догадались
:) Mouse.broadcastMessage("onDoubleClick"); // это был второй
клик => спускаем флаги :) Mouse.cancelDouble(); } }; // функция
прерывает ожидание второго клика (если он уже выполнился или время
истекло) Mouse.cancelDouble = function() { if (Mouse.clickFlag)
{ clearInterval(Mouse.clickFlag); delete Mouse.clickFlag; } }; //
регистрируем мышку на передачу
сообщений ASBroadcaster.initialize(Mouse); // лисенер, который собственно
отсчитывает клики // и прерывает даблклик при движении
мышки Mouse.doubleListener = {onMouseMove:Mouse.cancelDouble,
onMouseDown:Mouse.isDouble}; // включаем объект Mouse.doubleListener на
прослушивание мышиных событий Mouse.addListener(Mouse.doubleListener); //
------- End Of DoubleClick Event Definition ------- // // >>>>
Usage: // // максимальная задержка между кликами (в
милисекундах) Mouse.clickTimeout = 300; // this.onDoubleClick =
function() { trace("Ad Astra
!"); }; Mouse.addListener(this); //
_______________________________________________________________________
Литература по FLASH
|