![]() |
Изменение частоты кадров flash-ролика
В ActionScript 3, можно динамически менять частоту кадров (frame rate) ролика используя класс Stage.
Класс Stage (flash.display.Stage) связан со сценой главного ролика и имеет свойство frameRate, которое может принимать значения от 0.01 до 1000, и определяет частоту кадров, с которой Flash плеер проигрывает ролик. Изменять это значение можно на лету. Код:
// изменить частоту кадров на 12 fps: |
Методы класса теперь связаны с областью видимости класса
ActionScript 3 полностью базируется на классах. Создавая классы, вы создаете переменные и функции (методы) которые связаны с экземпляром класса. В отличие от ActionScript 2 методы в ActionScript 3 сохраняют область видимости их класса, даже если вызываются из другого объекта, или через Function.call и Function.apply. Например:
Код:
package { |
Объект Graphics и методы для рисования
Как и в ActionScript 1,2 в ActionScript 3 есть методы для динамического рисования в отображаемых объектах (movie clips, sprites, и т.п.), которые имеют свойство graphics (flash.display.Graphics). Свойство graphics выступает в роли специального слоя для рисования, который расположен под всеми дочерним клипами. Так же в ActionScript 3 добавлены новые методы для рисования прямоугольников (в том числе и со скругленными углами), окружностей и эллипсов:
Код:
// Нарисовать синий прямоугольник со скругленными углами: |
8. Уникальность переменных в классах
В ActionScript 2 переменные со значениями объявленные в теле класса сохранялись в прототипе класса. Из-за этого возникали проблемы с переменными, которые являются ссылками на объекты (например массивы Array):
Код:
class myClass{В ActionScript 3 этой проблемы нет, такие переменные будут уникальны. |
Новое поведение MouseMove
В ActionScript 2 событие MouseMove срабатывало глобально, неважно над каким клипом находилась мышка, любой listener от Mouse или любой мувиклип получали событие о перемещении мышки.
В ActionScript 3 для того чтобы получать события от мышки, нужно у интерактивного клипа (InteractiveObject такие как Sprites, MovieClips, Stage) добавить слушателя событий мышки (Listener), но события будут приходить только тогда, когда мышка находится над этим клипом. Для того чтобы получать события мышки в любом месте ролика, нужно добавить Listener к Stage. Код:
stage.addEventListener(MouseEvent.MOUSE_MOVE, onMouseMove); |
|
14. Класс SimpleButton
В ActionScript 3 появился новый класс SimpleButton (flash.display.SimpleButton). Теперь можно динамически с помощью ActionScript создавать кнопки (Button).
Код:
var myButton:SimpleButton = new SimpleButton();Код:
myButton.upState = mySprite1; |
|
17. Вспомогательные классы
Один класс описывается в одном .as файле, так было в ActionScript 2 так остается и в ActionScript 3, но теперь есть возможность включать вспомогательные классы в тот же .as файл в дополнение к основному классу.
Вспомогательные классы описываются после блока package и видны только основному классу (или функции) в блоке package, или другим вспомогательным классам, описанным в этом же файле. Код:
package { |
18. Права доступа
В ActionScript 3 добавлено два новых ключевых слова для описания прав доступа и усовершенствовано свойство private по сравнению с ActionScript 2. Итак, теперь мы имеем следующие ключевые слова для регулирования прав доступа:
public: то же самое, что и в ActionScript 2, все определенное как public может быть прочитано откуда угодно. Конструкторы теперь всегда public. protected: новое ключевое слово, указывает, что метод или переменная скрыта от всех кроме классов потомков. Классы и конструкторы не могут быть определены как protected. private: в ActionScript 2 было это ключевое свойство, но фактически работало как protected, т.е. классы потомки имели полный доступ к методу или свойству, описанному как private. Теперь в ActionScript 3 private это полноценная приватность, т.е. доступ только в этом классе, в котором метод или переменная описана, для всех остальных, включая потомков, она не будет существовать. Это означает, что в классе-потомке можно объявить еще одну переменную или метод с таким же именем и при этом не возникнет никаких конфликтов. Классы и конструкторы не могут быть определены как private. internal: аналогично public, но ограничено пределами пакета (package). Только классы, описанные в этом же пакете, будут иметь доступ к internal переменным или методам. Internal ставится по умолчанию для любого класса, переменным или методам класса, кроме конструкторов, которые всегда public. Права доступа во вспомогательных классах немного отличаются. Поскольку они фактически описываются вне пакета (package), то переменные или методы, объявленные как internal будут доступны только классам, описанным в этом же файле. В ActionScript 3 проверка прав доступа осуществляется не только на этапе компиляции, но и при выполнении, т.е. хаки использовавшиеся в ActionScript 2, чтобы получить доступ к скрытым методам больше не будут работать. Рассмотрим все это на примерах. Пример 1. Код:
package {Код:
package {Код:
package containers {Код:
package containers { |
19. Абстрактные классы
20. Ключевое слово override Временно не буду иметь возможность продолжить, минимум до понедельника. |
23 Подход к сортировке глубин
В ActionScript 3.0, подход к управлению глубинами DibsplayObject'ов изменился. Разберем пример, когда мы хотим поставить мувики с наибольшей "y" координатой наверх, а наименьшей в низ, в AS 1-2, мы могли просто назначить им глубину, в ActionScript 3, мы работаем с массивом дочерних объектов, а значит никаких пустых глубин между двумя мувиками быть не может.
Один из способов сделать это, это отсортировать наши мувики в массиве. Сначала мы создадим массив с сылками на на мувики, после чего отсортируем его с помощью свойства sortOn. Код:
var sortedItems:Array = new Array(mc1, mc2, mc3);Nirth: я писал статью-обзор о коллекциях в AS3 и Flex Framework, с некоторыми другими коллекциями можно сотворить более качественную глубинную сортировку. |
24 Полное Копирование объекта
С помощью класса ByteArray, мы можем копировать полностью объекты. Под полным копированием имеется ввиду, что мы можем копировать так же "дочерние" объекты копируемого объекта, и так далее. Например если у нас есть массив с объектами, и мы копируем его, то кроме самого массива скопируются и объекты.
Пример функции: Код:
import flash.utils.ByteArray;Код:
newObjectCopy = clone(originalObject);Код:
package { |
21. Использование прототипов (prototype)
Прототип объекта в ActionScript — это объект, который существует среди классов, чьи значения доступны для всех экземпляров класса, к которым он (объект) принадлежит. В ActionScript 1.0/2.0 prototype использовался для контроля наследования класса. Когда экземпляр подкласса обращается к переменной, сначала проверяется наличиие этой переменной в текущем экземпляре класса, потом (если не нашел) в прототипе данного класса, потом в прототипе базового класса, и так далее по цепочке наследственности (прототипов), до тех пор пока есть базовые классы.
В ActionScript 3.0 наследование в основном управляется через Класс Наследований и не зависит от прототипа объекта. Однако, прототип объекта всё же существует и обеспечивает большую часть функциональности, как это было и в AS1.0/2.0 Каждый класс и внутриклассовая функция (метод), созданные в ActionScript 3.0 имеют прототипный объект связанный с ними. Для классов прототип имеет имеет аттрибут «read-only», что значит, что вы не можете изменять его значение новым. Однако, это вовсе не значит, что вы не можете задать новую переменную и присвоить ей значение внутри прототипа (иначе наличие прототипа было б бессмысленным ;)). Прототипы функций изменяемы, что позволяет создавать динамические классы, используя определение классов написанием функций и определением наследований через прототипы («old style» как это делалось раньше). Пример: ActionScript Code: Код:
package { |
25 Одинаковые имена свойств
В ActionScript 1, мы могли дать свойству экземпляра и свойству класса одинаковое имя, в ActionScript 2 ввели ограничение на это. Теперь в ActionScript 3 мы опять можем это делать.
Код:
package { |
В ActionScript 3 используется класс flash.events.EventDispatcher для работы с событиями (рассылка, подписка обработчиков). Одна из реализаций данного класса была доступна в ActionScript 2, но это был внешний класс, для работы с событиями в mx.* пакетах. Теперьэто встроенный класс, а значит он работает быстрее.
Кажды раз когда вы хотите обработать событие в ActionScript 3 (например "enterFrame" или "click") вы должны использовать методы EventDispatcher. Теперь у классов нету методов вроде onEnterFrame, onPress, onLoad. У EventDispatcher'а есть следующие методы: addEventListener(type:String, listener:Function, useCapture:Boolean = false, priority:int = 0, useWeakReference:Boolean = false):void Метод подписывает обработчик события. type - Тип(имя) события listener - ссылка на функцию - обработчика useCapture - используется ли capture фаза или bubbles фаза. priority - приоритет вызова обработчика useWeakReference - использовать слабую проверку типов. dispatchEvent(event:Event):Boolean Метод рассылает события. event - Экземпляр класса Event или подкласса, который будет разослан. hasEventListener(type:String):Boolean Проверяет есть ли обработчик события у события указанного в параметре type removeEventListener(type:String, listener:Function, useCapture:Boolean = false):void Удаляет обработчик событий, параметры аналогичны addEventListener willTrigger(type:String):Boolean Запомните, теперь в качестве слушателя выступают функции а не объекты как это было в случае с addListener. Теперь о хорошем: Нам больше не нужно использовать mx.utils.Delegate или подобные ему, теперь this указывает на то что надо. У класса Event есть свойство target, которое ссылается на экземпляр который разослал событие, при использовании capture или bubble фаз, так же можно испоьзовать свойство currentTarget. Простой пример Код:
package {Но иногда нам нужно наследовать классы, которые не расширяют EventDispatcher, в этом случае мы можем реализовать интерфейс IEventDispatcher, и создать в классе экземпляр EventDispatcher. Тоесть мы используем композицию вместо наследования. Пример: Код:
package {Nirth: В FAQ на flasher.ru есть еще несколько статей о событиях: Создание и рассылка собственных событий Обработка событий |
97. Закрытие сетевых соединений
Предыдущие версии Flash плеера не могли оборвать соединение после начала загрузки данных с сервера. Например, если вы начали загружать 50-ти мегабайтный swf в свой ролик, но хотите прекратить загрузку т.к. юзер решил не ждать загрузки а посмотреть что-то другое, у вас ничего не получится. Единственным способом избежать продолжения загрузки было бы закрыть плэйер (например перейти на другую html страницу)
Теперь, исползуя AS3, вы можете остановить соединения и оборвать загрузку запросов сделанных плеером. Рассмотрим класс Loader (flash.display.Loader). Это субкласс displayObjectContainer-а который загружает внешний контент в ваш ролик. Вы можете загружать содержимое в этот класс используя метод load. Что бы оборвать процесс загрузки, вы должны исползовать метод close. Пример: Код:
var loader:Loader = new Loader(); |
Регулярные выражения RegExp
ActionScript 3 поддерживает регулярные выражения! Реализация аналогична что и в JavaScript. Для создания регулярного выражения можно использовать конструктор RegExp или строку заключенную в слеши (/), например:
Код:
var reCon:RegExp = new RegExp("\\w+", "i");
|
27. События и типы событий
В ActionScript 3 все события имеют свой класс. Базовые события расположены в классе Event (flash.events.Event), события связанные с мышкой в классе MouseEvent ( flash.events.MouseEvent). Остальные классы событий расположены в пакете flash.events и все они потомки базового класса Event.
Вызывая EventDispatcher.dispatchEvent(), в качестве аргумента нужно передать экземпляр класса события Event (или любой потомок от Event). Например, для рассылки события "enterFrame" вызываем dispatchEvent, передавая ему экземпляр класса Event с типом (type) "enterFrame". Код:
dispatchEvent(new Event("enterFrame"));Код:
addEventListener("enterFrame", eventHandler);Код:
addEventListener(Event.ENTER_FRAME, eventHandler); |
28. Запись XML в тексте скрипта
В ActionScript 3 можно писать XML прямо в тексте скрипта, больше нет необходимости записывать XML в виде строки с последующим парсингом. Компилятор Flash проверяет синтаксис XML, что спасает от опечаток.
Код:
var myXml:XML = |
29. Определение имени класса
В ActionScript 3 есть новая функция getQualifiedClassName (flash.utils.getQualifiedClassName) с помощью которой можно запросто узнать имя класса:
Код:
var sprite:Sprite = new Sprite();Код:
trace(getQualifiedSuperclassName(sprite)); // "flash.display::DisplayObjectContainer"Код:
trace(getDefinitionByName("flash.display::Sprite")); // [class Sprite]Код:
var sprite:Sprite = new Sprite(); |
30. Вызов super()
В ActionScript 2, вызвать super() можно было только в самом начале конструктора класса, иначе компилятор сообщит об ошибке «The superconstructor must be called first in the constructor body». В ActionScript 3, super можно вызывать в любом месте конструктора.
Код:
package { |
31. Определение метки текущего фрейма (Frame Label)
В класс MovieClip (flash.display.MovieClip) добавлены новые методы для работы с метками фреймов: currentLabels и currentLabel.
currentLabels - это массив всех меток FrameLabel (flash.display.FrameLabel) которые есть на timeline в мувиклипе. Каждый FrameLabel содержит два свойства: name:String – название метки, и frame:int – номер фрейма. currentLabel - возвращает название метки текущего фрейма. Код:
var label:String = my_mc.currentLabel; |
32. Несколько аргументов в trace()
В ActionScript 3, функции trace можно передавать любое количество аргументов, все они будут выведены в Output panel.
Код:
trace(value1, value2, value3);Код:
trace([value1, value2, value3]); |
33. Вызов обработчика события без события
Обработчик события в ActionScript 3 должен получать один аргумент класса Event. Если же нужно самостоятельно вызывать функцию обработчика события, можно написать так:
Код:
myHandler(new Event(someEventType));Код:
public function myHandler(event:Event = null):void {...} |
34. URLRequest вместо строки URL
Классы и функции работающие с URL в ActionScript 3 используют класс URLRequest (flash.net.URLRequest), который кроме самой строки URL, содержит дополнительные свойства, более детально описывающие способ запроса:
Код:
var request:URLRequest = new URLRequest("http://www.adobe.com/"); |
Цитата:
|
XML или XMLDocument
В ActionScript 3 работа с XML приведена к стандарту E4X - ECMAScript's XML specification. Этот подход обеспечивает более удобные методы работы с узлами и атрибутами XML дерева. Все методы собраны в новом классе XML (top level XML)
Код:
var myXML:XML = new XML(objectToConvert);Код:
var myXML:XML = <node />;Код:
var myXML:XMLDocument = new XMLDocument("<node />"); |
36. Загрузка текста и XML с использованием URLLoader
В предыдущих версиях ActionScript для загрузки внешнего текста использовали LoadVars или XML. В ActionScript 3 все собрано в один класс URLLoader (flash.net.URLLoader), который немного похож на прежний LoadVars. Из класса XML убрана функция по загрузки, теперь нужно загружать текст при помощи URLLoader, а затем передавать XML классу для преобразования.
Для начала загрузки нужно использовать метод load(), который получает один параметр URLRequest (это не просто строка URL!). Далее следует использовать события, для того, чтобы узнать об окончании загрузки или ошибке. Когда текст загружен, он сохраняется в свойстве data. Пример: Код:
var loader:URLLoader; |
Дополнение к заметке про абстрактные классы. Для создания своего абстрактного класса, можно использовать такой код:
Код:
package { |
37. Оператор is вместо instanceof
В ActionScript 3 введен новый оператор “is” (is operator) для проверки принадлежности экземпляра класса к типу класса или интерфейса.
Код:
var mySprite:Sprite = new Sprite();1. поскольку, AS3 классы воссоздают цепочку прототипов, то с помощью instanceof теоретически можно проверить принадлежность экземпляра класса к определенному типу AS3 класса, но не к интерфейсу: Код:
var mySprite:Sprite = new Sprite();Код:
var AS1StyleClass:Function = function(){}The instanceof operator is deprecated, use the is operator instead. |
38. Timelines как класс
Во Flash 9 вы можете ассоциировать timeline с классом, в том числе и рутовый. Timeline мувиклипа ассоциируется с классом так же как и в ActionScript 2 используя диалог linkage. Timeline рута может быть ассоциирован с классом в диалоге property inspector или в настройках публикации (publish settings - ActionScript settings).
Если вы написали код внутри фрейма в timeline, то он будет автоматически преобразован в класс. При этом переменные объявленные внутри какого-либо фрейма становятся свойствами класса, а функции методами класса. Поэтому вы не сможете объявить переменную или функцию с одинаковым названием в разных фреймах. Любой скрипт внутри фрейма ассоциируются с методом, который автоматически называется, когда происходит переход на этот фрейм. Например, такой код написанный внутри фрейма: Код:
var num:Number = 1;Код:
package { |
39. Использование RegExp для проверки корректности написания email
Пример, как можно использовать регулярное выражение (Top level RegExpх) для проверки корректности написания email:
Код:
function isValidEmail(email:String):Boolean { |
41. Оператор @ для работы с атрибутами XML
В ActionScript 3 для удобства работы с XML добавлен новый оператор “@”, предназначенный для доступа к атрибутам XML, и является аналогом метода attribute (Top level XML.attribute()).
Код:
var myXML:XML = <user name="senocular" id="2867" />;Код:
var myXML:XML = <user name="senocular" id="2867" />; |
42. Распространение событий
ActionScript 3 поддерживает распространение события (event propagation) – передача одного события нескольким объектам. К примеру, в ActionScript 1 и 2 события для кнопок (такие как onPress, onRelease, …) перехваченные мувиклипом никогда не дойдут до вложенных в него мувиклипов, даже если мышкой кликнули именно по вложенному мувиклипу. Например, кликаем мышкой по мувиклипу child_mc, который вложен в parent_mc:
Код:
// AS1 и AS2Код:
// AS3 |
43. Получение спектра звука
Используя ActionScript 3 можно получить информацию о спектре проигрываемого flash-плеером в данный момент звука/музыки. Для этого можно вызывать статичный метод computeSpectrum класса SoundMixer (flash.media.SoundMixer), и в качестве параметра передать массив ByteArray, куда и будет записана информация о спектре: 256 чисел с плавающей запятой (floating-point в диапазоне -1.0 … 1.0) для левого канала и следом 256 чисел для правого канала.
Код:
// запустить проигрывание музыки |
44. Преобразование Number() больше не поддерживает восьмеричную систему
В ActionScript 1 и 2 преобразовывая строку в число, используя Number(), если строка начиналась с нуля “0”, то число интерпретировалось как восьмеричное. Если строка начиналась с “0x”, то число интерпретировалось как шестнадцатеричное:
Код:
// ActionScript 1 и 2Код:
// ActionScript 3Код:
trace(parseInt("010", 8)); // 8 |
45. Сборщик мусора (Garbage Collection)
Сборщик мусора (Garbage Collection - GC) автоматический процесс во Flash-плеере, который удаляет данные из памяти, когда они более не нужны. GC оценивает необходимость удаления по двум критериям: счетчик ссылок (reference counting) и очистка по меткам (mark and sweep)
1. Счетчик ссылок - это процесс, который следит за количеством переменных, ссылающихся на объекты в памяти. Код:
var a:Object = new Object(); //создается новый объект и новая переменная "a", которая ссылается на этот объект, счетчик ссылок = 1Код:
a=null; // счетчик ссылок стал равен 1Код:
var a:Object = new Object(); // счетчик ссылок на первый объект = 12. Очистка по меткам – это процесс, который сканирует все объекты от базового класса (root или stage) и помечает каждого, кого нашел. Все не найденные объекты недоступны и потому будут удалены. Из предыдущего примера про "a" и "b", поскольку "a" и "b" более недоступны из root они не будут помечены и будут удалены. Код:
[root] <- сканирование...MerlinTwi: Хочу обратить ваше внимание на то, что добавление обработчиков событий к объекту (или setInterval) не позволит сборщику мусора (GC) удалить этот объект, т.к. на него остаются ссылки из процессов рассылающих события. Например: Код:
init();Код:
test.removeEventListener(Event.ENTER_FRAME, handle); |
46. Мягкие ссылки
В ActionScript 3 есть две возможности поставить мягкую ссылку (Weak Reference) на объект, которая не будет учитываться счетчиком ссылок.
1. При использовании класса Dictionary его конструктору можно передать параметр true, чтобы использовались мягкие ссылки на объекты. Код:
var dict:Dictionary = new Dictionary(true); // использовать мягкие ссылкиКод:
var obj:Object = new Object();Код:
// addEventListener(type:String, listener:Function, useCapture:Boolean = false, priority:int = 0, useWeakReference:Boolean = false):void Код:
init();Экспериментально был найден способ заставить сборщик мусора сработать немедленно, нужно создать много объектов для которых потребуется выделение большого куска памяти. Подтолкнем таким способом сборщик мусора сработать по клику мышки: Код:
init();. . . enterFrame enterFrame enterFrame run GC После клика мышки и запуска функции immediatelyGC, сборщик мусора удалил спрайт из памяти и более функция handle не вызывается. |
| Часовой пояс GMT +4, время: 20:44. |
Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.