Назад в раздел
[MX] ActionScript сегодня - создаем события !
div.main {margin-left: 20pt; margin-right: 20pt}
[MX] ActionScript сегодня : создаем события !
---> что будем делать ? : будем изобретать вечный двигатель с велосипедным приводом (это если в общем и целом). если конкретнее - то посмотрим, как при помощи 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); // _______________________________________________________________________
удачи, Nox Noctis xentarknight@narod.ru 28.06.2002 |
Автор: © Nox Noctis Источник:
http://www.flasher.ru
|
|
|
|