Беларусь, рогачёв |
Введение
Кнопки
С кнопками вы уже немного знакомы по параграфу "Hello, World!". А если вы прочли его невнимательно - прочтите еще раз и проделайте все, что в нем описано, ибо там зарыты драгоценные крохи знаний о простейших приемах рисования и анимации, о которых мы в этой книге практически не говорим.
Но, предположим, вы умеете делать кнопки и описывать, как кнопка будет реагировать на нажатие. Однако нажатие - это ведь не единственное, что с кнопкой может происходить. Пользователь может, например, просто навести на нее мышь - а вы уже захотите выполнить по этому поводу какой-то программный код. Как реализовать такое поведение? Оказывается, каждому из этих случаев соответствует отдельное событие, посылаемое кнопке системой Флэш МХ. А значит, мы можем задать реакции на все эти события (и на каждое в отдельности). Кстати, сейчас как раз время запомнить одну общую вещь: где во Флэш МХ может встречаться выполняемый код. Мы уже говорили, что, как правило, он записывается в каком-то из кадров (и выполняется при демонстрации этого кадра). Кроме того, код может быть приписан к клипу (в том числе кнопке) как к целому; при этом речь идет о конкретном экземпляре, а не о символе (последний факт очень важен!). Этот код может содержать в себе только код реакции на события; в момент инициализации клипа создаются ассоциации этого кода с соответствующими событиями; так что потом, когда события происходят, нужный код вызывается. Компилятор проверяет тот факт, что код, приписанный непосредственно к клипу (кнопке), содержит в себе только специальные конструкции, определяющие реакции на события.
Итак, сделать реакцию на событие можно тремя способами: с помощью одной из двух специальных конструкций языка ActionScript или с помощью методов класса MovieClip . Мы рассмотрим несколько более подробно специальные конструкции и кратко расскажем о методе переопределения функций реакции на события класса MovieClip . Последний рассказ будет кратким вынужденно, поскольку детали необходимых для него конструкций (например, определения функций во Флэш МХ) мы разберем позднее. Так вот, первая из специальных конструкций - конструкция on( ...){ /* Код */}. Вторая - это конструкция onClipEvent(...){ /* Код */ }. На самом деле, вместо двух конструкций можно вполне обойтись одной; то, что их именно две, обусловлено историческими причинами. Во Flash 5 конструкцию on(...){...} можно было использовать только с кнопкой, а onClipEvent(...){...} - только с MovieClip 'ом. Во Флэш МХ они полностью равноправны и работают практически одинаково (но "обслуживают" различные события, характерные для кнопок и для обычных клипов соответственно). Итак, внутри круглых скобок конструкции on(...){...} могут присутствовать следующие наименования событий:
- press - кнопка нажата.
- release - кнопка отпущена.
- releaseOutside - мышь отпущена после того, как была нажата на кнопке, а затем выведена за ее пределы.
- rollOut - мышь в ненажатом состоянии вышла за пределы кнопки.
- rollOver - мышь в ненажатом состоянии вошла в область кнопки.
- dragOut - мышь в нажатом состоянии вышла за пределы кнопки (при этом реализуется механизм " capture ", то есть события по поводу мыши, перемещаемой в нажатом состоянии, посылаются только той кнопке, на которой она была нажата).
- dragOver - это событие может посылаться в двух случаях, которые слегка различаются между собой. Случай первый: мышь возвращается на кнопку в нажатом состоянии (после того, как была нажата на кнопке, а затем выехала оттуда). Это событие посылается для всех типов кнопок. Случай второй: мышь въезжает на кнопку в нажатом состоянии после того, как была нажата снаружи кнопки. В этом случае событие будет посылаться, только если для кнопки была выбрана опция " Track as Menu Item ". (По умолчанию выбрана опция " Track as Button "). Чтобы установить эту опцию, нужно выделить кнопку и зайти в панель Properties. Комбо-бокс с двумя вышеупомянутыми опциями размещен справа от кнопки Swap. Уточним, что если мышь въезжает на кнопку после того, как была нажата на другой кнопке, то событие dragOver не будет послано даже в том случае, когда выбрана опция " Track as Menu Item ". Это следствие работы механизма " capture ".
- keyPress - нажата определенная клавиша на клавиатуре. В данном случае после слова keyPress в кавычках должна быть указана нужная клавиша (например, keyPress "a" ). Если вы хотите указать какую-либо специальную клавишу, то нужно внутри кавычек в угловых скобках написать ее название (например, keyPress "<PageDown>" ). Набрав on и затем открывающую круглую скобку в редакторе Actions, вы получите контекстную подсказку, в которой будут приведены возможные сочетания keyPress и специальных клавиш. Вам может показаться странным, что указывается только одна клавиша - это является рудиментом тех времен, когда конструкция on(...){...} использовалась только для кнопок, а реакция на нажатие клавиши на клавиатуре делалась для создания акселераторов. Если вам все же хочется использовать on(...){...} для реакции на несколько разных клавиш, вам придется написать конструкцию on(...){...} несколько раз.
Все приведенные выше наименования событий пишутся без кавычек (мы не говорим здесь о коде клавиши, являющемся дополнением к событию keyPress ). Кроме того, в круглых скобках может быть перечислено несколько наименований событий; в этом случае они разделяются запятой.
Мы сейчас говорили о кнопке, но все то же самое может быть написано в коде, относящемся к любому клипу. То есть достаточно написать обработчик on(...){...} в коде, относящемся к любому клипу - и над этим клипом курсор станет превращаться в руку, как над кнопкой, после нажатия на клип будет работать механизм " capture " и т.д. Разве что для обычного клипа (не кнопки) вы не сможете установить режим " Track as Menu Item ".
Подчеркнем еще раз, что конструкции on(...){...} и onClipEvent(...){...} могут быть использованы только в специальном, довольно экзотическом месте - коде, относящемся не к символу, а к экземпляру. То, что пишется у них внутри круглых скобок, нельзя назвать ни ключевыми словами, ни идентификаторами - это просто некие лексемы, нужным образом воспринимаемые только в этом контексте. Заметьте, что это даже не строки - ведь кавычки вокруг наименования события не ставятся. Как мы видим, описываемые конструкции, фактически, не принадлежат языку ActionScript 1.0 (и вы не найдете их в стандарте ECMA-262, которому довольно точно соответствует ActionScript 1.0, - об этом будет рассказано далее). Но не следует думать, будто конструкции on(...){...} и onClipEvent(...){...} являются устаревшими. Все-таки они предоставляют достаточно удобный способ прикрепить код реакции на события непосредственно к конкретному экземпляру кнопки или клипа. Впрочем, и однозначно рекомендовать этот способ к использованию мы тоже не станем. В конце концов, определять реакцию на события для данного экземпляра можно из того символа, в котором экземпляр лежит (с помощью методов класса MovieClip ). Это позволит сконцентрировать код только в символах - что является хорошим стилем программирования, особенно для большого проекта.
Однако, занявшись критикой конструкций on(...){...} и onClipEvent(...){...}, мы отвлеклись от их описания; а ведь мы еще не сказали, что пишется в фигурных скобках. Оказывается, в фигурных скобках может быть написан любой код на ActionScript 1.0 (кроме, разумеется, самих конструкций on(...){...} и onClipEvent(...){...} ).
Теперь опишем подробнее конструкцию onClipEvent(...){...}. В круглых скобках она может содержать следующее:
- load - экземпляр клипа загружен (вызывается в первом же кадре, где появляется этот экземпляр ).
- unload - экземпляр клипа выгружен (вызывается в первом кадре, в котором данный экземпляр отсутствует, - разумеется, после того, как этот экземпляр ранее был создан).
- enterFrame - вызывается в каждом кадре перед выполнением кода, который в этом кадре написан.
- mouseMove - мышь сдвинулась (ее координаты относительно начала координат данного клипа можно узнать через свойства клипа _xmouse и _ymouse ).
- mouseDown - левая кнопка мыши нажата.
- mouseUp - левая кнопка мыши отпущена.
- keyDown - нажата клавиша на клавиатуре (получить ASCII-код этой клавиши можно, вызвав Key.getCode() - специальный метод класса Key. Затем можно воспользоваться методом String.fromCharCode, чтобы преобразовать этот код в строку).
- keyUp - отпущена клавиша на клавиатуре. Информацию об этой клавише получаем так же, как и для события keyDown.
- data - специфическое событие, связанное с ситуациями, когда клип осуществляет загрузку данных из внешнего источника. Более подробную информацию об этих ситуациях вы можете получить в лекции 14.
Приведем примеры использования конструкций on(...){...} и onClipEvent(...){...}. Один из стандартных способов использования первой из них предназначен для реализации перетаскивания ( drag and drop ). Вот пример такого кода:
on(press){ trace("pressed"); startDrag(this); } on(release){ trace("released"); stopDrag(); }
Поместите этот код на экземпляре какого-либо клипа, запустите ролик, и вы увидите, что этот экземпляр теперь можно перетаскивать мышкой.
А вот пример использования 2.
onClipEvent(keyDown) { if (Key.getCode() == Key.RIGHT) { this._x += 10; } else if (Key.getCode() == Key.LEFT){ this._x -= 10; } }
Если вы снабдите экземпляр клипа этим кодом, вы обнаружите (запустив ролик ), что сей экземпляр приобрел способность перемещаться вправо или влево при нажатии соответствующих клавиш на клавиатуре.
Наконец, скажем пару слов о методах класса MovieClip. Все события, о которых мы здесь говорили, с помощью этих методов можно поймать и обработать. Собственно, это есть самый логичный и естественный способ работать с событиями. Выглядит эта работа примерно так:
clip.onEnterFrame = function(){ // Здесь пишется код обработки события }
А более подробно мы об этом расскажем в начале третьей лекции.