---> что будем делать ? :
будем изобретать вечный
двигатель с велосипедным приводом (это если в общем и
целом).
если конкретнее - то посмотрим, как при помощи 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);
//
_______________________________________________________________________