On-Line Библиотека www.XServer.ru - учебники, книги, статьи, документация, нормативная литература.
       Главная         В избранное         Контакты        Карта сайта   
    Навигация XServer.ru








 

[MX] ActionScript сегодня - создаем события !

Автор: © 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