Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Web-дизайн 1 часть / Литература / ActionScript 2.0. Программирование во Flash MX 2004.pdf
Скачиваний:
354
Добавлен:
26.03.2015
Размер:
8.81 Mб
Скачать

этого не произойдет до тех пор, пока она не будет отпущена.

Метод hide() отключает отображение указателя в стандартной форме стрелки и в форме руки. Однако текстовый курсор остается видимым. Это означает, что при наведении указателя на текстовое поле курсор в форме буквы I появится в любом случае. Это нужно учитывать, если в фильме применяется пользовательский указатель.

Основная задача, которая решается за счет использования методов hide() и sbow(), связана с заменой стандартного указателя мыши собственным. Делается это очень просто: отображение системного курсора отключается, а вместо него используется перемещаемый клип. Для примера создадим курсор, над которым будут отображаться его координаты:

//Рисуем небольшую стрелку (20-25 пикселей} и помещаем над ней

//динамическое текстовое поле, назвав его coord. Затем переводим это

//сочетание в клип и называем его cursor.

cursor.swapDepths(100000);

// Размещаем клип-указатель выше всех

// остальных объектов

Mouse.hide();

// Прячем стандартный курсор

cursor.coord.eelectable^false;

//

Делаем поле невыделяемым (иначе появится

 

//

текстовый курсор)

cursor.onMouseMove = function():Void { // Обновляем значение координат

this.coord.text=Math.round(_xmouse} + ", " + Math.round(_ymouse); // Перемещаем клип-указатель в новое положение

this._x=_xmouse, this._y=_ymouse;

updateAfterEvent();

// Обновляем экран

};

 

Главная сложность в использовании пользовательских курсоров связана с потенциальным выходом указателя за пределы окна плейера. При этом появится стандартный указатель, а изображавший его в фильме клип продолжит отображаться на границе плейера. На экране появятся сразу два указателя, один из которых будет неработоспособен. Чтобы этого избежать, в момент пересечения указателем границы фильма пользовательский указатель должен быть сделан невидимым. Как «отловить» этот момент, мы поговорим в подразделе 12.1.5.

Потенциально сложности может вызвать и то, что текстовый курсор не скрывается методом hide(), Если в фильме присутствуют только динамические текстовые поля, то блокировать его появление над ними очень просто. Для этого нужно сделать их невыделяемыми при помощи свойства selectable. Если же применяются поля ввода, То их нужно поместить в кнопки и отслеживать для них событие onRollOver. При его возникновении пользовательский указатель нужно скрыть. При выходе курсора за пределы поля (ему соответствует событие onRollOut) отображение пользовательского указателя должно быть восстановлено.

12.1.4. Правая клавиша мыши

Официально в ActionScript до выхода последней версии Flash не существовало элемента, используя который можно было бы среагировать на нажатие правой клавиши мыши. Однако решить эту задачу все же было реально, если знать, что кнопки мыши во многом являются такими же клавишами, как клавиши клавиатуры. Нет, это не значит, что при нажатии правой кнопки мыши возникнет событие on KeyPress объекта Key. Подобная особенность не может быть реализована, так как она была бы чревата многочисленными сбоями. Метод getCode(), возвращающий номер задействованной последней клавиши, также не способен регистрировать факт нажатия кнопок мыши. А вот метод isDown(), определяющий, нажата ли клавиша с определенным номером, применим и к клавишам мыши. В этом несложно убедиться, зная, что левой кнопке мыши соответствует код 1, а правой — 2:

// Наберите этот код и "пощелкайте" клавишами мыши this.onEnCerFrame = function():Void {

if (Key.isDown(1)) {

trace("Левая клавиша мыши нажата"); } else if (Key.isDown(2)) {

trace("Правая клавиша мыши нажата");

}

};

Используя данную особенность метода isDown(), совсем несложно создать код, генерирующий событие щелчка правой кнопки мыши. Описание того, как это сделать, используя методы недокументированного объекта AsBroadcaster, имеется в Проекте 8.

Хотя самостоятельно реализовать событие правого щелчка совсем несложно, на практике данное событие использовалось крайне редко. Причина тому — контекстное меню, которое появляется над окном плейера. Трудно представить, какие функции должна выполнять правая клавиша мыши, чтобы оно не было помехой. В частности, из-за него невозможно создать собственное контекстное меню, подобно тому, как создаются пользовательские курсоры (однако ввести собственные элементы в стандартное меню во Flash 7 стало возможно — см. раздел 12.2). А это очень и очень большой недостаток, мешающий качественной разработке интерфейсов.

Полностью убрать контекстное меню плейера невозможно. Можно лишь минимизировать его до двух строчек — Settings (настройки опций плейера) и About Macromedia Flash Player (краткая информация о плейере). Минимизация контекстного меню — это очень полезная возможность. Однако она не делает событие правого щелчка более доступным.

Во Flash MX 2004 появился класс ContextMenu, отвечающий за работу с контекстным меню плейера. Его единственное событие onSelect происходит при появлении контекстного меню. Следовательно, оно может быть использовано для отслеживания нажатия правой клавиши мыши:

// При щелчке правой клавишей мыши в Output будет выведено сообщение var myMenu:ContextMenu = new ContextMenu();

myMenu.onSelect = function():Void { trace("Правая кнопка мыши нажата!");

};

_root.menu = myMenu;

Можно быть уверенным, что в ближайших версиях Flash Macromedia не откажется от обязательного отображения контекстного меню. Почему? Все дело в строчке «About Macromedia Flash Player». Подумайте, какая это замечательная реклама. В сети имеются миллионы и миллионы баннеров, мультфильмов и сайтов, изготовленных при помощи Flash. Пользователь, видя что-то впечатляющее, с весьма высокой вероятностью захочет получить дополнительную информацию, щелкнув правой клавишей мыши. При этом появится контекстное меню, и он узнает, что это чудо сделано с использованием Flash. Очевидно, что многие разработчики захотят освоить данную программу, а заказчики — получить такой же сайт или презентацию. Вообще, многие специалисты считают, что значительной доле своей известности Flash обязан именно контекстному меню плейера.

Что же делать, если вы хотите написать игру, в которой просто необходимо использовать правую кнопку мыши? На данный момент есть только один путь решения этой задачи — применить нестандартный плейер. Такие плейеры объединяют с фильмом некоторые утилиты, позволяющие создавать на базе swf-файла исполнимые (*.ехе) файлы. Подобных утилит довольно много, и они весьма значительно отличаются как по своей стоимости, так и по возможностям. В данный момент наиболее распространены следующие: Flash Studio Pro, Swiff Canvas, Jugglor, Flash Tuner.

Приведенные утилиты позволяют отключать отображение контекстного меню. Некоторые это делают простой блокировкой сообщений о нажатии правой клавиши мыши. Другие же, более мощные, убирают непосредственно меню, сохраняя возможность создания события правого щелчка. То, какую утилиту выбрать, должно определяться стоящими перед вами задачами.

Главный недостаток, связанный с переводом swf-фильмов в исполнимые файлы, заключается в их размере. Из-за того, что в них полностью включается плейер, они занимают в самом лучшем слу-

чае несколько сотен килобайт (а в худшем —мегабайт и более). Второй недостаток — относительно высокая цена соответствующих утилит. Однако иногда на такие жертвы приходится идти — ввиду отсутствия альтернативы.

12.1.5. Определение выхода указателя мыши за пределы окна плейера

В полноэкранном режиме swf-фильмы проигрываются редко, и это создает определенные сложности, связанные с выходом указателя мыши за пределы окна плейера. Наиболее очевидный пример

— применение пользовательского курсора. При выходе указателя мыши за границы фильма системный курсор визуализируется. Клип же, изображавший в фильме указатель, продолжит отображаться в точке, в которой мышь пересекла границу окна плейера. Естественно, что подобная ситуация совершенно недопустима. Каким-то образом необходимо регистрировать момент выхода указателя мыши за пределы фильма, чтобы скрывать при этом пользовательский курсор. При возвращении указателя в границы окна плейера отображение пользовательского курсора должно быть восстановлено.

Универсального алгоритма, который позволил бы, не жертвуя частью возможностей, надежно определять, что указатель мыши вышел за пределы окна плейера (или вошел в них), не существует. Если в вашем фильме нет полей ввода и вы можете обойтись без применения кнопок и «кнопочных» событий, то наиболее оптимальным представляется следующий подход:

Рисуем полностью прозрачный клип в виде прямоугольника, по размерам совпадающего с полем фильма.

Созданный клип помещаем на основную временную диаграмму выше всех остальных объектов. Располагаем его так, чтобы он закрывал все поле.

Выходу указателя мыши за пределы окна плейера будет соответствовать событие onRollOut созданного клипа, его возвращению — событие onRollOver. Если необходимо учитывать выход или возвращение указателя при нажатой левой клавише мыши, то нужно использовать события onDragOut и onDragOver.

Чтобы указатель мыши не менял форму со стрелки на очертания руки, используем свойство useHandCursor.

Используя возможности программного рисования и метод broadcastMessage() недокументированного объекта AsBroadcaster (см. главу 8), можно создать, применив описанный алгоритм, собственные события, возникающие при выходе указателя за границы окна фильма и возвращении его в них:

//Объект, который будет генерировать задуманные события

_global.borderWatcher={};

//Регистрируем borderWatcher как генератор событий

AsBroadcaster.initialize (borderWatcher); borderWatcher.init = function():Void {

//Создаем пустой клип на очень большой глубине основной временной диаграммы var clipMovieClip = _root.createEmptyMovieClip("list clip" +

Math.random), 100000);

//Обводку и заливку задаем полностью прозрачными clip.lineStyle(1, 0, 0);

clip.beginFill(0, 0);

//Рисуем в клипе clip прямоугольник по контуру границ фильма clip.moveTo(0, 0);

var xMax:Number = Stage.width, yMax:Number = Stage.height; clip.lineTo(0, yMax), clip.lineTo(xMax, yMax), clip.lineTo(xMax, 0), clip.lineTo(0);

clip.endFill();

clip.useHandCursor = false; // Отключаем отображение указателя-"руки"

//При выходе указателя за пределы клипа clip всем листенерам объекта

//borderWatcher отправляем сообщение о событии onStageRollOut

Соседние файлы в папке Литература