|
|
|||||
Регистрация: Oct 2003
Адрес: Москва
Сообщений: 328
|
Дополнение к заметке про абстрактные классы. Для создания своего абстрактного класса, можно использовать такой код:
|
|
|||||
Регистрация: Oct 2003
Адрес: Москва
Сообщений: 328
|
37. Оператор is вместо instanceof
В ActionScript 3 введен новый оператор “is” (is operator) для проверки принадлежности экземпляра класса к типу класса или интерфейса.
var mySprite:Sprite = new Sprite(); trace(mySprite is Sprite); // true trace(mySprite is DisplayObject); // true trace(mySprite is IEventDispatcher); // true 1. поскольку, AS3 классы воссоздают цепочку прототипов, то с помощью instanceof теоретически можно проверить принадлежность экземпляра класса к определенному типу AS3 класса, но не к интерфейсу: var mySprite:Sprite = new Sprite(); trace(mySprite instanceof Sprite); // true trace(mySprite instanceof DisplayObject); // true trace(mySprite instanceof IEventDispatcher); // false – нет в цепочке прототипов var AS1StyleClass:Function = function(){} AS1StyleClass.prototype = new MovieClip(); var as1Instance:* = new AS1StyleClass(); trace(as1Instance instanceof AS1StyleClass); // true trace(as1Instance instanceof MovieClip); // true trace(as1Instance is AS1StyleClass); // true trace(as1Instance is MovieClip); // false The instanceof operator is deprecated, use the is operator instead. |
|
|||||
Регистрация: Oct 2003
Адрес: Москва
Сообщений: 328
|
38. Timelines как класс
Во Flash 9 вы можете ассоциировать timeline с классом, в том числе и рутовый. Timeline мувиклипа ассоциируется с классом так же как и в ActionScript 2 используя диалог linkage. Timeline рута может быть ассоциирован с классом в диалоге property inspector или в настройках публикации (publish settings - ActionScript settings).
Если вы написали код внутри фрейма в timeline, то он будет автоматически преобразован в класс. При этом переменные объявленные внутри какого-либо фрейма становятся свойствами класса, а функции методами класса. Поэтому вы не сможете объявить переменную или функцию с одинаковым названием в разных фреймах. Любой скрипт внутри фрейма ассоциируются с методом, который автоматически называется, когда происходит переход на этот фрейм. Например, такой код написанный внутри фрейма: Будет преобразован в примерно такой класс: |
|
|||||
Регистрация: Oct 2003
Адрес: Москва
Сообщений: 328
|
39. Использование RegExp для проверки корректности написания email
Пример, как можно использовать регулярное выражение (Top level RegExpх) для проверки корректности написания email:
function isValidEmail(email:String):Boolean { var emailExpression:RegExp = /^[a-z][\w.-]+@\w[\w.-]+\.[\w.-]*[a-z][a-z]$/i; return emailExpression.test(email); } //... trace(isValidEmail("senocular@example.com")); // true trace(isValidEmail("@example.com")); // false trace(isValidEmail("senocular@example")); // false trace(isValidEmail("seno\\cular@example.com")); // false |
|
|||||
Регистрация: Oct 2003
Адрес: Москва
Сообщений: 328
|
41. Оператор @ для работы с атрибутами XML
В ActionScript 3 для удобства работы с XML добавлен новый оператор “@”, предназначенный для доступа к атрибутам XML, и является аналогом метода attribute (Top level XML.attribute()).
var myXML:XML = <user name="senocular" id="2867" />; trace(myXML.attribute("name")); // senocular trace(myXML.attribute("id")); // 2867 trace(myXML.@name); // senocular trace(myXML.@id); // 2867 |
|
|||||
Регистрация: Oct 2003
Адрес: Москва
Сообщений: 328
|
42. Распространение событий
ActionScript 3 поддерживает распространение события (event propagation) – передача одного события нескольким объектам. К примеру, в ActionScript 1 и 2 события для кнопок (такие как onPress, onRelease, …) перехваченные мувиклипом никогда не дойдут до вложенных в него мувиклипов, даже если мышкой кликнули именно по вложенному мувиклипу. Например, кликаем мышкой по мувиклипу child_mc, который вложен в parent_mc:
// AS1 и AS2 parent_mc.onPress = function(){ trace("parent pressed"); } parent_mc.child_mc.onPress = function(){ trace("child pressed"); } /* trace при клике мышкой по child_mc: parent pressed */ // AS3 parent_mc.addEventListener(MouseEvent.CLICK, parentClick); parent_mc.child_mc.addEventListener(MouseEvent.CLICK, childClick); function parentClick(event:MouseEvent):void { trace("parent pressed"); } function childClick(event:MouseEvent):void { trace("child pressed"); } /* trace при клике мышкой по child_mc: child pressed parent pressed */ |
|
|||||
Регистрация: Oct 2003
Адрес: Москва
Сообщений: 328
|
43. Получение спектра звука
Используя ActionScript 3 можно получить информацию о спектре проигрываемого flash-плеером в данный момент звука/музыки. Для этого можно вызывать статичный метод computeSpectrum класса SoundMixer (flash.media.SoundMixer), и в качестве параметра передать массив ByteArray, куда и будет записана информация о спектре: 256 чисел с плавающей запятой (floating-point в диапазоне -1.0 … 1.0) для левого канала и следом 256 чисел для правого канала.
Эту информацию можно использовать для создания визуализации звука, как в популярных медиа-плеерах. |
|
|||||
Регистрация: Oct 2003
Адрес: Москва
Сообщений: 328
|
44. Преобразование Number() больше не поддерживает восьмеричную систему
В ActionScript 1 и 2 преобразовывая строку в число, используя Number(), если строка начиналась с нуля “0”, то число интерпретировалось как восьмеричное. Если строка начиналась с “0x”, то число интерпретировалось как шестнадцатеричное:
Это могло создать определенные проблемы, если вы ожидали получить обычное десятичное число. Теперь ActionScript 3 интерпретирует строку, начинающуюся с нуля как десятичное число. Если же нужно интерпретировать строку как восьмеричное число (или в любую другу систему счисления), то нужно использовать функцию parseInt: |
|
|||||
Регистрация: Oct 2003
Адрес: Москва
Сообщений: 328
|
45. Сборщик мусора (Garbage Collection)
Сборщик мусора (Garbage Collection - GC) автоматический процесс во Flash-плеере, который удаляет данные из памяти, когда они более не нужны. GC оценивает необходимость удаления по двум критериям: счетчик ссылок (reference counting) и очистка по меткам (mark and sweep)
1. Счетчик ссылок - это процесс, который следит за количеством переменных, ссылающихся на объекты в памяти. var a:Object = new Object(); //создается новый объект и новая переменная "a", которая ссылается на этот объект, счетчик ссылок = 1 var b:Object = a; // еще одна ссылка на тот же объект, счетчик ссылок = 2 a=null; // счетчик ссылок стал равен 1 b=null; // счетчик ссылок стал равен 0, и объект будет удален из памяти var a:Object = new Object(); // счетчик ссылок на первый объект = 1 var b:Object = new Object(); // счетчик ссылок на второй объект = 1 a.b = b; // счетчик ссылок на второй объект = 2 b.a = a; // счетчик ссылок на первый объект = 2 a=null; // счетчик ссылок на первый объект = 1 b=null; // счетчик ссылок на второй объект = 1 2. Очистка по меткам – это процесс, который сканирует все объекты от базового класса (root или stage) и помечает каждого, кого нашел. Все не найденные объекты недоступны и потому будут удалены. Из предыдущего примера про "a" и "b", поскольку "a" и "b" более недоступны из root они не будут помечены и будут удалены. [root] <- сканирование... [objectRef (помечен)] <- сканирование... [objectRef (помечен)] <- сканирование... [objectRef (помечен)] <- сканирование... [objectRef (помечен)] <- сканирование... [objectRef (помечен)] <- сканирование... ... [удалить все непомеченное] MerlinTwi: Хочу обратить ваше внимание на то, что добавление обработчиков событий к объекту (или setInterval) не позволит сборщику мусора (GC) удалить этот объект, т.к. на него остаются ссылки из процессов рассылающих события. Например: init(); function init():void { var test:Sprite = new Sprite(); test.addEventListener(Event.ENTER_FRAME, handle); } function handle(e:Event):void { trace("enterFrame"); } |
|
|||||
Регистрация: Oct 2003
Адрес: Москва
Сообщений: 328
|
46. Мягкие ссылки
В ActionScript 3 есть две возможности поставить мягкую ссылку (Weak Reference) на объект, которая не будет учитываться счетчиком ссылок.
1. При использовании класса Dictionary его конструктору можно передать параметр true, чтобы использовались мягкие ссылки на объекты. В этом случае Dictionary в качестве ключей будет использовать мягкие ссылки на объекты, которые не учитываются счетчиком ссылок и не мешают удалению объектов из памяти. var obj:Object = new Object(); dict[obj] = true; delete obj; // сборщик мусора удалит объект obj, поскольку ссылка на него из dict мягкая // addEventListener(type:String, listener:Function, useCapture:Boolean = false, priority:int = 0, useWeakReference:Boolean = false):void addEventListener(MouseEvent.CLICK, clickHandler, false, 0 true); // использовать мягкую ссылку init(); function init():void { var test:Sprite = new Sprite(); test.addEventListener(Event.ENTER_FRAME, handle, false,0,true); } function handle(e:Event):void { trace("enterFrame"); } Экспериментально был найден способ заставить сборщик мусора сработать немедленно, нужно создать много объектов для которых потребуется выделение большого куска памяти. Подтолкнем таким способом сборщик мусора сработать по клику мышки: init(); addEventListener(MouseEvent.CLICK, immediatelyGC); function init():void { var test:Sprite = new Sprite(); test.addEventListener(Event.ENTER_FRAME, handle, false,0,true); } function handle(e:Event):void { trace("enterFrame"); } function immediatelyGC(e:Event):void { trace("run GC"); var ar:Array = new Array(); for (var i:int=0; i<100000; i++) { ar.push( new Object() ); } } . . . enterFrame enterFrame enterFrame run GC После клика мышки и запуска функции immediatelyGC, сборщик мусора удалил спрайт из памяти и более функция handle не вызывается. |
Часовой пояс GMT +4, время: 12:07. |
|
« Предыдущая тема | Следующая тема » |
|
|