![]() |
40. Событие Render
В AS3 добавлено новое событие Event.RENDER (flash.events.Event.RENDER), которое рассылается после enterFrame, но перед тем, как экран флеш-плеера обновится. Это событие не генерится автоматически, его нужно активировать самостоятельно, вызвав метод stage.invalidate(); (flash.display.Stage.invalidate()), после чего, перед обновлением экрана все объекты приаттаченные на stage (и только они) получат событие Event.RENDER. Если флэш плеер не занимается рендерингом (например окно минимизировано в таск бар), то Event.RENDER не рассылается.
Пример: Код:
var sprite:Sprite = new Sprite();Код:
enter frame |
47. Картинки из библиотеки (library)
Еще во Flash 8 была добавлена возможность загрузить картинку из библиотеки (library) используя linkage ID и метод BitmapData.loadBitmap(). В ActionScript 3 это делается несколько иначе, т.к. все мувиклипы, фреймы и объекты в библиотеке ассоциированы с классами. Классы для картинок в библиотеке являются потомками BitmapData ( flash.display.BitmapData) и перед добавлением картинки к какому-либо визуальному объекту нужно ее связать с классом Bitmap (flash.display.Bitmap), поскольку непосредственно BitmapData приаттачить нельзя.
В качестве примера, добавьте в библиотеку картинку, в диалоге linkage поставьте галочку «Export for ActionScript» и укажите название класса «RomeImage» (этот класс будет сгенерирован автоматически при публикации SWF). Далее нужно написать код для добавления этой картинки на экран: Код:
// создаем класс RomeImage с содержимым картинки |
48. Изменения в typeof
Оператор typeof позволяет узнать базовый тип любого объекта/переменной. Это не информация о классе, а просто тип переменной связанной с объектом. Для детальной информации о классе следует использовать instanceof, getQualifiedClassName, describeType.
В ActionScript 1 и 2, typeof возвращал такие значения:
Код:
// AS1 & AS2Код:
// AS3 |
49. getBounds() и getRect()
Как и в ActionScript 1 и 2, в ActionScript 3 есть метод getBounds() (flash.display.DisplayObject.getBounds()), который вычисляет границу мувиклипа в системе координат любого объекта на timeline. Но в ActionScript 3 метод getBounds возвращает Rectangle (flash.geom.Rectangle) вместо Object со свойствами xMin, xMax, yMin, yMax, как это было раньше.
В ActionScript 3 еще добавлен новый метод getRect() (flash.display.DisplayObject.getRect()), который выполняет аналогичную задачу, но в отличие от getBounds не учитывает толщину линий (strokes on shapes). В качестве наглядного примера, красный прямоугольник высчитывается по getBounds, а синий по getRect: Код:
var sprite:Sprite = new Sprite(); |
50. Разница между for..in и for each..in
В ActionScript 3 добавлен новый вид цикла for each..in который работает аналогично прежнему for..in, но перебираются значения объекта, а не ключи. Пример:
Код:
var object:Object = new Object();Так же обратите внимание, что ActionScript 3 в циклах (for..in и for each..in) сохраняет порядок элементов в массиве, а ActionScript 1 и 2 перебирал в порядке обратном добавлению элементов. См. пример: Код:
var array:Array = new Array();Код:
array[2] = 3Код:
array[0] = 2 |
51. Значения по умолчанию для параметров функции
ActionSript 3 дает возможность присвоить значения по умолчанию для параметров функций. Такие параметры становятся необязательными при вызове функции.
Код:
function method(required:String, optional:String = "default"):void {Код:
// Так неправильно: |
52. Неопределенное количество аргументов
Для того, чтобы в ActionSript 3 функция могла принимать любое количество аргументов необходимо использовать специальный параметр три точки
«... название_переменной» (Keyword: ...(rest)), который всегда располагается последним, после перечисления обязательных аргументов. Переданные аргументы записываются в указанную переменную в виде массива: Код:
usingRest(1, 2, 3, 4); |
53. arguments
В ActionScript 3, как и в ActionScript 1 и 2, любая функция содержит arguments (Top level arguments), куда в виде массива записываются все переданные аргументы. Но в ActionScript 3 убрали свойство arguments.caller, для получения ссылки на вызвавшую функцию советуют передавать эту ссылку самостоятельно в виде аргумента функции.
Код:
args("a", 1); |
54. Поддержка пространства имен (Namespaces)
ActionScript 3 поддерживает пространство имен (namespaces) в классах по аналогии с namespaces в XML. Пространство имен можно сравнить с пакетами (packages), поскольку пакеты позволяют создать несколько различных классов с одинаковым названием, но описанных в разных пакетах, так и пространство имен дает возможность определить несколько разных методов и свойств с одним названием внутри одного класса.
Для использования пространства имен необходимо этому пространству присвоить уникальное название с помощью ключевого слова namespace (namespace Keyword). После объявления пространства имен его название можно использовать аналогично public, private… Пример: Код:
package {При объявлении пространства имен можно дополнительно указать URI. Код:
package { |
55. Оператор (::) для уточнения пространства имен
При вызове метода класса, или обращении к свойству, описанному внутри пространства имен, необходимо уточнить из какого именно пространства имен нужно вызвать метод. Один из способов сделать это - использовать оператор :: (name qualifier operator). Указываете название пространства имен, два двоеточия и название метода (namespace::member).
Код:
package { |
56. Динамичность класса не наследуется
Как и в ActionScript 2 в ActionScript 3 есть возможность создавать динамические классы, для этого используется ключевое слово dynamic (dynamic keyword). В динамические классы можно добавлять новые свойства в процессе выполнения кода.
В AS2, когда создаете новый класс, наследованный от динамического класса, он по умолчанию так же становился динамическим. Код:
// superclass.asКод:
// superclass.as |
57. Создание события mouseWithin (мышка внутри)
В Director Lingo есть удобное событие mouseWithin, которое генерится каждый фрейм, если мышь находится в пределах мувиклипа. Это событие довольно просто реализовать на ActionScript 3. (Конечно можно и на ActionScript 1 или 2, но придется заюзать методы onRollOver и onEnterFrame, а они могут понадобиться и для других целей. В AS3 такой проблемы нет, т.к. вы можете на одно событие навесить сколько угодно слушателей.)
Итак, для реализации события mouseWithin нужно, по событию входа мышки на мувиклип подключиться к событию enterFrame и рассылать каждый фрейм mouseWithin, пока мышь не покинет пределы мувиклипа. Код:
// Реализация события mouseWithinКод:
addEventListener("mouseWithin", mouseWithinHandler); |
58. Ключевое слово final
Ключевое слово final (Toplevel final keyword) можно использовать для предотвращения переопределения метода класса или запрещения наследования от класса.
Если метод помечен как final, классы потомки не смогут переопределить его (override). Код:
final public function methodName() { … }Код:
// superclass.asПримечание: нет смысла делать final методы в final классе, т.к. от этого класса все равно не может быть наследников, а значит, и нет возможности переопределить методы. |
59. MXMLC: SWF Metadata Tag
Если вы используете MXMLC (компилятор из Flex 2 SDK) для компиляции ActionScript 3 SWFs, вы можете использовать SWF metadata tag для назначения свойств флешки. Всего можно установить 4 свойства:
Код:
package { |
60. Класс Proxy
В ActionScript 3 добавлен новый класс Proxy (flash.utils.Proxy) для замены методов addProperty и __resolve из ActionScript 1 и 2.
Proxy классы обычно используются для создания набора переменных с гибкими возможностями (например, Flex классы ArrayCollection, ListCollectionView, XMLListCollection). Proxy класс более детально будет рассмотрен в следующих советах |
61. Оператор «in»
В ActionScript 3 добавлен новый оператор in (in operator), который используется для проверки наличия свойства в объекте. Это аналогично hasOwnProperty, но работает и для унаследованных свойств.
Код:
trace("PI" in Math); // trueКод:
var myArray:Array = ["zero", "one", "two"]; |
62. Методы getProperty и setProperty класса Proxy
Методы getProperty и setProperty используются для управления необъявленными свойствами класса. Если какое-то свойство явно не объявлено в классе, то при попытке прочитать его значение, будет вызван метод getProperty. Аналогично при записи вызывается метод setProperty.
Как и все методы класса Proxy, getProperty и setProperty объявлены в пространстве имен «flash_proxy» (flash.utils.flash_proxy), чтобы не возникало конфликтов с публичными методами. Для переопределения этих методов в своем классе обязательно нужно указывать пространство имен flash_proxy. Пример: класс CustomObject наследуется от Proxy и переопределяет методы getProperty и setProperty для управления динамическими свойствами. Код:
package {Код:
// Пример использования |
63. instance name мувиклипа на сцене
Во Flash 9, когда вы размещаете MovieClip на сцене (timeline) с указанием имени (instance name), автоматически происходят сразу два действия:
1. Вы присваиваете методу «name» этого мувиклипа строку эквивалентную instance name. 2. Вы создаете переменную в timeline с именем аналогичным instance name мувиклипа со ссылкой на этот мувиклип. Флеш делает все это самостоятельно при компиляции SWF файла, чтобы помочь вам управлять мувиклипами на сцене. Важно понимать, что при создании мувиклипами средствами ActionScript, эти действия не выполняются автоматически. К примеру: Код:
// Здесь «my_mc» это instance name мувиклипа на сценеКод:
trace(my_mc.getChildByName("child_mc")); // [object MovieClip];Код:
// Создаем мувиклип с помощью AS и добавляем его к my_mc |
65. Константы
ActionScript 3 позволяет определять константы, для этого используется ключевое слово const (const keyword), которое записывается вместо var (var keyword). Обычно константы записывают большими буквами, разделяя слова подчеркиванием, например, Event.ENTER_FRAME это константа.
Пример объявления константы: Код:
package {Код:
package { |
66. Аналог duplicateMovieClip
В ActionScript 3 больше нет метода duplicateMovieClip, но его можно частично воспроизвести. Например, такая функция:
Код:
package com.senocular.display {Замечание: на данный момент во Flash Player 9 есть баг, некорректно возвращается свойство scale9Grid, эта функция исправляет ошибку, но когда баг в плеере исправят, строчку: Код:
rect.x /= 20, rect.y /= 20, rect.width /= 20, rect.height /= 20;Пример использования функции: Код:
import com.senocular.display.duplicateDisplayObject; |
67. Метод callProperty класса Proxy
Если в классе наследнике от Proxy попытаться вызвать несуществующий метод, то будет вызван метод callProperty, которому передается название метода с массивом аргументов. Это можно использовать для создания динамических методов.
Как и все методы класса Proxy, callProperty объявлен в пространстве имен «flash_proxy» (flash.utils.flash_proxy), чтобы не возникало конфликтов с публичными методами. Для переопределения метода в своем классе обязательно нужно указывать пространство имен flash_proxy. Пример: класс CustomObject наследуется от Proxy и переопределяет метод callProperty для управления динамическими методами. Код:
package {Код:
// пример использования |
68. Копирование динамической графики с помощью класса Proxy
В ActionScript 3 нет возможности непосредственно скопировать графику созданную в Graphics. Но можно использовать класс Proxy для записи всех вызванных методов, чтобы потом их воспроизвести при копировании. Например, такой вариант:
Код:
package com.senocular.display {Пример: Код:
// MyClass.as Класс наследник от Shape с использованием GraphicsCopyКод:
// Пример использования |
69. TextField.appendText()
В класс TextField (flash.text.TextField) добавлен новый метод appendText (flash.text.TextField.appendText()), который добавляет новый текст в конец существующего в текстовом поле (обычный текст, не html). Этот метод аналог TextField.text += newText, но работает гораздо быстрее.
Код:
var my_tf = new TextField(); |
70. Директива include
В ActionScript 3 оставлена директива include для вставки кода из другого файла, только изменился синтаксис, теперь не нужно писать символ #
Код:
include "scripts/myscript.as" |
71. Двойное объявление переменной
В ActionScript 1 и 2 можно было объявить одну переменную дважды в одной области видимости и это не вызывало ошибки. Например:
Код:
// ActionScript 1 и 2 Код:
// ActionScript 3 Код:
// Это НЕВЕРНО для ActionScript 3 Код:
// ПРАВИЛЬНО для ActionScript 3 Код:
// Также ПРАВИЛЬНО для ActionScript 3 |
72. mouseEnabled и блокирование событий
В ActionScript 1 и 2, в случае если несколько мувиклипов, обрабатывающих события от мышки, частично или полностью перекрываются, то события от мышки (onPress, onRollOver …) получал только верхний мувиклип. Для того чтобы событие от мышки мог получить нижестоящий мувиклип, нужно или удалить верхний или удалить у него все обработчики событий мышки, тогда мувиклип станет «прозрачен» для событий от мышки.
В ActionScript 3 ситуация примерно аналогичная, но проверка на то, прозрачен мувиклип для событий от мышки или нет, лежит не на наличие обработчиков этих событий, а на свойстве mouseEnabled (flash.display.InteractiveObject.mouseEnabled). Если mouseEnabled=true (так по умолчанию), то мувиклип перехватывает и обрабатывает события от мышки. Если же mouseEnabled=false, то он становится прозрачен для мышки и события смогут получать и мувиклипы лежащие под ним. В примере ниже, рисуются два частично перекрывающихся круга. Внизу "circle 1" и над ним "circle 2". При клике мышкой по любому кругу вызывается обработчик события "click", который показывает по какому кругу кликнули и переключается свойство mouseEnabled для верхнего "circle 2". Таким образом, если кликать мышкой в область, где круги пересекаются, то сначала событие перехватывает верхний "circle 2", а на второй клик реагирует уже нижний "circle 1", т.к. у вернего круга mouseEnabled=false; Код:
function createCircle(name:String = ""):Sprite { |
73. Свойство mouseChildren
Новое свойство mouseChildren (flash.display.DisplayObjectContainer.mouseChildren) позволяет включать и выключать возможность реагировать на события от мышки для всех вложенных мувиклипов. Присвоить mouseChildren=false аналогично, если присвоить mouseEnabled=false для всех вложенных мувиклипов, после этого никто из вложенных мувиклипов не будет реагировать на события от мышки.
Это может быть полезно, если вы создаете свою кнопку наследуясь от MovieClip или Sprite со вложенными мувиклипами. По умолчанию в обработчике события такой кнопки Event.target будет не сама кнопка, а вложенный в нее мувиклип. Пример: Код:
// Сама кнопкаКод:
//outputКод:
// output |
74. Различия между rollOver/rollOut и mouseOver/mouseOut
Любой интерактивный объект (flash.display.InteractiveObject) имеет две пары очень похожих событий rollOver/rollOut и mouseOver/mouseOut. Оба они реагируют на то когда мышка входит в область объекта или покидает ее. Различия в поведении этих событий возникают только тогда, когда есть вложенные мувиклипы. События rollOver и rollOut не обращают внимание на наличие вложенных мувиклипов, когда мышка войдет в область объекта сработает rollOver, и только когда мышка покинет объект сработает rollOut. События mouseOver и mouseOut будут срабатывать на перемещение мышки над вложенными мувиклипами. mouseOver сработает когда мышка войдет в область объекта, если при дальнейшем движении курсор мышки войдет в область вложенного мувиклипа сработает mouseOut, когда мышка покинет вложенный объект вновь сработает mouseOver, хотя при этих перемещениях курсор мыши фактически не покидал области объекта. События mouseOver и mouseOut будут вести себя аналогично rollOver и rollOut если установить mouseChildren=false;
Лучше всего посмотреть пример: Код:
// Основная кнопкаКод:
// output |
75. DisplayObjectContainer contains()
Метод contains (flash.display.DisplayObjectContainer.contains()) позволяет определить является ли указанный мувиклип вложенным в этот мувиклип (причем не важно в какой степени вложенности).
Пример: Код:
var king:Sprite = new Sprite();Код:
trace(queen.parent == king); // true |
76. Освобождение слушателей событий при удалении с экрана
Когда имеете дело с отображаемыми объектами (display objects) в ActionScript 3 важно помнить, что они могут существовать даже если не добавлены на экран (display list) и при этом продолжают получать и обрабатывать события на которые подписаны (очевидно, кроме событий от мышки). К примеру, событие enterFrame будет продолжать вызываться, и после удаления объекта с экрана. Это существенное отличие от ActionScript 1 и 2, т.к. там удаление мувиклипа с экрана означало и удаление всех событий.
Если вы хотите, чтобы событие типа enterFrame не вызывалось, когда объект удален с экрана, вы должны самостоятельно удалять подобные события. Сделать это просто, достаточно прописать обработчики событий Event.ADDED (вызывается когда объект добавлен к другому отображаемому объекту) и Event.REMOVED (вызывается когда объект удаляется от родителя). Код:
var sprite:Sprite = new Sprite();Код:
// output |
77. Определение добавления или удаления со Stage
В предыдущем примере показано как определить добавление и удаление объекта от другого отображаемого объекта. Но если с экрана будет удален наш родительский объект, то события ADDED/ REMOVED не сработают. Как же отследить реальное добавление или удаление с экрана? Можно воспользоваться классом StageDetection (com.senocular.events.StageDetection)
Код:
package com.senocular.events { |
78. Фазы событий
В ActionScript 3 для отображаемых объектов добавлены три фазы распространения событий:
1. захват (capturing) Событие начинается со stage и спускается вниз, вызывая обработчики связанные с этим событием у всех объектов (если же обработчика не существует, ничего не происходит). Код:
eventНа стадии обработки вызывается обработчик события объекта которому собственно оно и предназначалось. Код:
+--------------+Перебираются все объекты, начиная с "виновника" события и до stage. Код:
+---------^----+Если вы хотите реагировать на стадию захвата (1), необходимо в addEventListener указать третьим параметром true. Код:
target.addEventListener("event", listener, true);Код:
target.addEventListener("event", listener, true); // захват |
79. Определение фазы события
Обработчик события в ActionScript 3 может определить фазу события (см. предыдущий совет о фазах событий) по свойству eventPhase, которое может принимать три значения:
Код:
var circle:Sprite = new Sprite();Код:
//outputКод:
//output |
80. Предотвращение распространения события
Если нужно пресечь дальнейшее распространение события можно использовать методы stopPropagation() (flash.events.Event.stopPropagation()) или stopImmediatePropagation() (flash.events.Event.stopImmediatePropagation()).
stopPropagation – предотвращает дальнейшее распространение события в стадии захвата (capturing) или подъема (bubbling) stopImmediatePropagation – блокирует вообще все, в том числе и фазу обработка (targeting). Смотрим пример: Код:
var circle:Sprite = new Sprite();Код:
//outputЕсли убрать комментарий с evt.stopPropagation(); Код:
//output с использованием stopPropagationЕсли убрать комментарий с evt.stopImmediatePropagation(); Код:
// output с использованием stopImmediatePropagation |
81. Глобальные события
В ActionScript 1 и 2 имелись события onMouseDown и onMouseUp, которые вызывались во всех объектах не зависимо от того, где находилась мышка. В ActionScript 3 такие события распространяются только на те объекты, над которыми находится мышка в момент клика. К примеру, если ваш мувиклип обрабатывает события MOUSE_DOWN и MOUSE_UP, а пользователь нажал кнопку мыши над мувиклипом, отвел мышку в сторону и отпустил кнопку, то событие MOUSE_UP ваш мувиклип не получит. Для обработки события глобально в ActionScript 3 нужно добавлять обработчик события к Stage. Поскольку именно к stage добавляются все отображаемые объекты, то через него проходят все события.
Одна маленькая, но важная деталь. Что если вы добавили обработчик события к stage, а какой-то мувиклип использовал предотвращение распространения события (см. предыдущий совет), в этом случае ваш обработчик события вызван не будет. Значит нужно добавлять обработчик события к stage на фазу захвата (capture). Но если пользователь кликнет по пустому месту, где нет никаких объектов, то целью события в этом случае будет stage и ваш обработчик события на фазу захвата (capture) вызван не будет, поскольку stage в данном случае участвует только в фазе обработка (targeting). Получается, для того чтобы поймать событие глобально в любом случае, нужно добавить два обработчика события к stage на фазе захвата (capture) и на фазе обработка (targeting). Поскольку нельзя поставить обработчик события только на фазу обработка (targeting), то нужно будет фазу подъема (bubbling) игнорировать в обработчике. Пример: Код:
var circle:Sprite = new Sprite();Код:
//клик вне мувиклипа |
82. Реализация onReleaseOutside в AS3
В ActionScript 3 нет события onReleaseOutside, но его можно реализовать самостоятельно. Поскольку события mouseDown и mouseUp привязаны к объекту, то узнать о том, что кнопка мышки была отпущена за пределами объекта можно только слушая событие mouseUp глобально (см. предыдущий совет). Единственное, нужно добавить проверку отпустили кнопку мыши над тем же объектом (тогда это будет просто mouseUp) или над другим (тогда это будет onReleaseOutside).
Пример: Код:
// в этой переменной запоминаем ссылку на объект по которому кликнулиНажать и отпустить кнопку мыши над кругом (объект circle): Код:
//outputКод:
//output |
83. Flash 9: Document Class
В ActionScript 3 можно назначить свой класс (Document class) для главного timeline, который фактически будет являться root для всех отображаемых объектов. Назначить Document class можно в панели Property Inspector для документа (когда ничего не выделено) или же в диалоге ActionScript 3 Settings который расположен: File > Publish Settings > Flash [закладка] > Settings... [кнопка для ActionScript 3]. Просто впишите в поле "Document class" название вашего класса.
Document Class обязательно должен наследоваться от Sprite (flash.display.Sprite) или его потомков. Если будете использовать главную timeline, то document class лучше наследовать от MovieClip (flash.display.MovieClip) т.к. MovieClip поддерживает фреймы. Document Class обязательно должен быть публичным (public). Пример: Код:
package { |
84. Доступ к stage и root
Stage (сцена) – это фактически первый контейнер в который загружаются все остальные отображаемые объекты, включая root. Stage может быть только один, а вот root может быть сколько угодно, по одному на каждую загруженную внешнюю флешку.
Все отображаемые объекты (flash.display.DisplayObject) имеют свойства stage и root. До тех пор, пока объект не добавлен на сцену (stage) эти свойства равны null. Свойство stage, когда доступно, всегда ссылается на объект stage. А вот свойство root в разный случаях содержит разные ссылки:
Код:
package {Код:
package {Другой вариант решения создать статичное свойство в каком-либо классе, в которое прописать ссылку на root или stage и уже к этому свойству обращаться из любого места. Лучше всего для этого подойдет document class, т.к. он изначально имеет доступ к stage и сам является root. Пример: Код:
package {Код:
package { |
85. use namespace
Для уточнения используемого пространства имен (см. совет 54) вместе с оператором «::» (name qualifier operator), можно использовать use namespace (use namespace directive). use namespace определяет пространство имен на весь блок кода (package, class, method). use namespace нельзя дважды использовать в одном блоке, но можно обратиться к другому пространству имен через оператор «::»
Пример: Код:
package { |
87. Класс Error, ошибки выполнения
Flash Player 9 с ActionScript 3 имеет встроенные средства для отображения и предупреждения об ошибках в коде во время выполнения. Если у вас установлена отладочная версия плеера (debug versions player), то появляется диалог с подробным описанием возникшей ошибки.
Возможные типы ошибок можно найти здесь (Top Level) или в пакете (flash.errors). Вы можете создавать свои типы ошибок, расширяя класс Error, и создавать ее с помощью ключевого слова throw (throw statement). Эта возможность была и в ActionScript 1 и 2, но раньше плеер на ошибку никак не реагировал. Пример ошибки, которая возникает во время выполнения: Код:
var value:* = new Array();Дополнительная информация об ошибках выполнения. |
| Часовой пояс GMT +4, время: 09:55. |
Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.