|
|
|||||
Регистрация: Oct 2003
Адрес: Москва
Сообщений: 328
|
56. Динамичность класса не наследуется
Как и в ActionScript 2 в ActionScript 3 есть возможность создавать динамические классы, для этого используется ключевое слово dynamic (dynamic keyword). В динамические классы можно добавлять новые свойства в процессе выполнения кода.
В AS2, когда создаете новый класс, наследованный от динамического класса, он по умолчанию так же становился динамическим. // superclass.as dynamic class superclass { } // subclass.as class subclass extends superclass { } // main movie var instance:subclass = new subclass(); trace(instance.anything); // Ошибки не будет, т.к. subclass унаследовал динамичность |
|
|||||
Регистрация: Oct 2003
Адрес: Москва
Сообщений: 328
|
57. Создание события mouseWithin (мышка внутри)
В Director Lingo есть удобное событие mouseWithin, которое генерится каждый фрейм, если мышь находится в пределах мувиклипа. Это событие довольно просто реализовать на ActionScript 3. (Конечно можно и на ActionScript 1 или 2, но придется заюзать методы onRollOver и onEnterFrame, а они могут понадобиться и для других целей. В AS3 такой проблемы нет, т.к. вы можете на одно событие навесить сколько угодно слушателей.)
Итак, для реализации события mouseWithin нужно, по событию входа мышки на мувиклип подключиться к событию enterFrame и рассылать каждый фрейм mouseWithin, пока мышь не покинет пределы мувиклипа. // Реализация события mouseWithin private function addMouseWithin(event:MouseEvent):void { addEventListener(Event.ENTER_FRAME, mouseWithin); } private function removeMouseWithin(event:MouseEvent):void { removeEventListener(Event.ENTER_FRAME, mouseWithin); } private function mouseWithin(event:Event):void { dispatchEvent(new MouseEvent("mouseWithin")); } // В конструкторе public function MySpriteClass() { addEventListener(MouseEvent.MOUSE_OVER, addMouseWithin); addEventListener(MouseEvent.MOUSE_OUT, removeMouseWithin); } |
|
|||||
Регистрация: Oct 2003
Адрес: Москва
Сообщений: 328
|
58. Ключевое слово final
Ключевое слово final (Toplevel final keyword) можно использовать для предотвращения переопределения метода класса или запрещения наследования от класса.
Если метод помечен как final, классы потомки не смогут переопределить его (override). Если пометить весь класс как final, то от него нельзя будет создать потомков. Например: // superclass.as package { final public class finalclass { } } // subclass.as package { class subclass extends finalclass { } } Примечание: нет смысла делать final методы в final классе, т.к. от этого класса все равно не может быть наследников, а значит, и нет возможности переопределить методы. |
|
|||||
Регистрация: Oct 2003
Адрес: Москва
Сообщений: 328
|
59. MXMLC: SWF Metadata Tag
Если вы используете MXMLC (компилятор из Flex 2 SDK) для компиляции ActionScript 3 SWFs, вы можете использовать SWF metadata tag для назначения свойств флешки. Всего можно установить 4 свойства:
После компиляции будет создан SWF размером 500x450 с белым фоном и частотой кадров 24. |
|
|||||
Регистрация: Oct 2003
Адрес: Москва
Сообщений: 328
|
60. Класс Proxy
В ActionScript 3 добавлен новый класс Proxy (flash.utils.Proxy) для замены методов addProperty и __resolve из ActionScript 1 и 2.
Proxy классы обычно используются для создания набора переменных с гибкими возможностями (например, Flex классы ArrayCollection, ListCollectionView, XMLListCollection). Proxy класс более детально будет рассмотрен в следующих советах |
|
|||||
Регистрация: Oct 2003
Адрес: Москва
Сообщений: 328
|
61. Оператор «in»
В ActionScript 3 добавлен новый оператор in (in operator), который используется для проверки наличия свойства в объекте. Это аналогично hasOwnProperty, но работает и для унаследованных свойств.
Так же оператор in можно использовать для проверки правильности номера индекса в массиве: |
|
|||||
Регистрация: Oct 2003
Адрес: Москва
Сообщений: 328
|
62. Методы getProperty и setProperty класса Proxy
Методы getProperty и setProperty используются для управления необъявленными свойствами класса. Если какое-то свойство явно не объявлено в классе, то при попытке прочитать его значение, будет вызван метод getProperty. Аналогично при записи вызывается метод setProperty.
Как и все методы класса Proxy, getProperty и setProperty объявлены в пространстве имен «flash_proxy» (flash.utils.flash_proxy), чтобы не возникало конфликтов с публичными методами. Для переопределения этих методов в своем классе обязательно нужно указывать пространство имен flash_proxy. Пример: класс CustomObject наследуется от Proxy и переопределяет методы getProperty и setProperty для управления динамическими свойствами. package { import flash.utils.Proxy; import flash.utils.flash_proxy; dynamic public class CustomObject extends Proxy { public var classProperty:String = "classProperty"; // объявленное свойство private var customProperties:Object = new Object(); // хранилище динамических свойств public function CustomObject() { } // Вызывается при чтении динамического свойства override flash_proxy function getProperty(name:*):* { if (name in customProperties) { return customProperties[name]; } return "Property does not exist"; } // Вызывается при записи в динамическое свойство override flash_proxy function setProperty(name:*, value:*):void { customProperties[name] = "Property "+name+": "+value; } } } |
|
|||||
Регистрация: Oct 2003
Адрес: Москва
Сообщений: 328
|
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); // [object MovieClip] trace(my_mc.name); // my_mc // Создаем мувиклип с помощью AS и добавляем его к my_mc var another_mc:MovieClip = new MovieClip(); another_mc.name = "child_mc"; my_mc.addChild(another_mc); // Переменная для доступа к созданному мувиклипу // автоматически не создается в my_mc trace(another_mc); // [object MovieClip] trace(my_mc.child_mc); // undefined trace(my_mc.another_mc); // undefined MerlinTwi: В дополнение к примеру стоит отметить, что поскольку любой мувиклип размещенный на timeline является динамическим, то можно просто создать в нем новое свойство ссылающееся на созданный мувиклип. // Создаем мувиклип с помощью AS и добавляем его к my_mc var another_mc:MovieClip = new MovieClip(); another_mc.name = "child_mc"; my_mc.addChild(another_mc); // создаем в my_mc новое свойство «another_mc» для ссылки на новый мувиклип my_mc.another_mc = another_mc; // проверяем trace(my_mc.another_mc); // [object MovieClip] |
|
|||||
Регистрация: Oct 2003
Адрес: Москва
Сообщений: 328
|
65. Константы
ActionScript 3 позволяет определять константы, для этого используется ключевое слово const (const keyword), которое записывается вместо var (var keyword). Обычно константы записывают большими буквами, разделяя слова подчеркиванием, например, Event.ENTER_FRAME это константа.
Пример объявления константы: package { import flash.display.Sprite; public class MyClass extends Sprite { public const MY_CONSTANT:String = "constant"; public function MyClass () { } } } |
|
|||||
Регистрация: Oct 2003
Адрес: Москва
Сообщений: 328
|
66. Аналог duplicateMovieClip
В ActionScript 3 больше нет метода duplicateMovieClip, но его можно частично воспроизвести. Например, такая функция:
package com.senocular.display { import flash.display.DisplayObject; import flash.geom.Rectangle; /** * duplicateDisplayObject * Создает дубликат DisplayObject, * аналогично методу duplicateMovieClip из AVM1 * @param target Дублируемый объект * @param autoAdd Если true, то созданный дубликат будет добавлен * на сцену туда же, где и оригинал * @return возвращает ссылку на дубликат */ public function duplicateDisplayObject(target:DisplayObject, autoAdd:Boolean = false):DisplayObject { // Создаем дубликат (constructor в кавычках, чтобы компилятор не ругался в strict mode) var targetClass:Class = target["constructor"]; var duplicate:DisplayObject = new targetClass(); // Дублируем свойства duplicate.transform = target.transform; duplicate.filters = target.filters; duplicate.cacheAsBitmap = target.cacheAsBitmap; duplicate.opaqueBackground = target.opaqueBackground; if (target.scale9Grid) { var rect:Rectangle = target.scale9Grid; // Баг, Flash 9 возвращает scale9Grid в 20 раз больше чем на самом деле rect.x /= 20, rect.y /= 20, rect.width /= 20, rect.height /= 20; duplicate.scale9Grid = rect; } // Добавить дубликат к target.parent // если autoAdd установлен в true if (autoAdd && target.parent) { target.parent.addChild(duplicate); } return duplicate; } } Замечание: на данный момент во Flash Player 9 есть баг, некорректно возвращается свойство scale9Grid, эта функция исправляет ошибку, но когда баг в плеере исправят, строчку: нужно будет удалить. Пример использования функции: Учтите, эта функция не является полным аналогом duplicateMovieClip, т.к. не может продублировать что-то динамически нарисованное, только объекты, имеющие свой класс. |
Часовой пояс GMT +4, время: 10:01. |
|
« Предыдущая тема | Следующая тема » |
Опции темы | |
Опции просмотра | |
|
|