![]() |
|
||||||||||
|
|
|
|||||
|
Регистрация: Oct 2003
Адрес: Москва
Сообщений: 328
|
Для уточнения используемого пространства имен (см. совет 54) вместе с оператором «::» (name qualifier operator), можно использовать use namespace (use namespace directive). use namespace определяет пространство имен на весь блок кода (package, class, method). use namespace нельзя дважды использовать в одном блоке, но можно обратиться к другому пространству имен через оператор «::»
Пример: package {
public namespace company = "http://www.example.com/company";
public namespace individual = "http://www.example.com/individual";
public class UsingNameSpaces {
use namespace individual;
company var value:int = 10;
individual var value:int = 2;
public function UsingNameSpaces(){
showValue(); // traces individual::2
company::showValue(); // traces company::2;
}
company function showValue() {
trace("company::" + value);
}
individual function showValue() {
trace("individual::" + value);
}
}
}
|
|
|||||
|
Регистрация: Oct 2003
Адрес: Москва
Сообщений: 328
|
Flash Player 9 с ActionScript 3 имеет встроенные средства для отображения и предупреждения об ошибках в коде во время выполнения. Если у вас установлена отладочная версия плеера (debug versions player), то появляется диалог с подробным описанием возникшей ошибки.
Возможные типы ошибок можно найти здесь (Top Level) или в пакете (flash.errors). Вы можете создавать свои типы ошибок, расширяя класс Error, и создавать ее с помощью ключевого слова throw (throw statement). Эта возможность была и в ActionScript 1 и 2, но раньше плеер на ошибку никак не реагировал. Пример ошибки, которая возникает во время выполнения: Попробуйте запустить SWF с этим кодом в браузере. Здесь генерится ошибка TypeError (Top Level TypeError), поскольку value типа Array и не имеет метода getChildAt. Дополнительная информация об ошибках выполнения. |
|
|||||
|
Регистрация: Oct 2003
Адрес: Москва
Сообщений: 328
|
В ActionScript 3 больше нет класса Color, взамен можно использовать класс ColorTransform (flash.geom.ColorTransform). По сути это тот же класс ColorTransform что был и в Flash Player 8, только свойство rgb было переименовано в color.
// создаем красный квадрат // рисуем черный var square:Shape = new Shape(); square.graphics.beginFill(0x000000); square.graphics.drawRect(0, 0, 100, 100); // и делаем цветокоррекцию с помощью ColorTransform var colorTransform:ColorTransform = square.transform.colorTransform; colorTransform.color = 0xFF0000; square.transform.colorTransform = colorTransform; addChild(square); |
|
|||||
|
Регистрация: Oct 2003
Адрес: Москва
Сообщений: 328
|
Для перехвата ошибок вы можете использовать (try..catch..finally statement).
Первый блок внутри try – это место где ожидается возникновение ошибки. Далее идет блок catch который будет выполнится если в блоке try произойдет ошибка. Блоков catch может быть несколько с указанием на какой тип ошибки реагировать. И в конце идет блок finally, который выполняется после try и catch и выполняется всегда, даже если ошибка не была поймана в catch и дальнейшее выполнение кода будет прервано, или же было вызвано return, блок finally все равно выполняется. Пример: try {
var value:* = new Array();
trace(value.getChildAt(0));
} catch(error:IOErrorEvent) {
trace("IOErrorEvent catch: " + error);
} catch(error:TypeError) {
trace("TypeError catch: " + error);
} catch(error:Error) {
trace("Error catch: " + error);
} finally {
trace("Finally!");
}
trace("Continuing with script...");
TypeError catch: TypeError: Error #1006: getChildAt is not a function. Finally! Continuing with script... Что произойдет, если не будет блока catch соответствующего типу возникшей ошибки: try {
var value:* = new Array();
trace(value.getChildAt(0));
} catch(error:IOErrorEvent) {
trace("IOErrorEvent catch: " + error);
} finally {
trace("Finally!");
}
trace("Continuing with script...");
Ошибка не была поймана, выполнился только блок finally и дальнейшее выполнение скрипта было прервано. |
|
|||||
|
Регистрация: Oct 2003
Адрес: Москва
Сообщений: 328
|
Иногда ошибка может произойти намного позже того, как была вызвана функция ее спровоцировавшая. Например, загрузка внешнего контента с помощью (flash.net.URLLoader). После вызова URLLoader.load с неправильным URL, плеер продолжит выполнение дальнейшего кода, а непосредственно процесс загрузки начнется позже, и только тогда возникнет ошибка. В таких случаях использование блока try..catch..finally не поможет, т.к. в самом коде в момент выполнения ошибки нет.
Пример: var loader:URLLoader = new URLLoader();
loader.load(new URLRequest("Invalid XML URL"));
trace("Continuing with script...");
Continuing with script... Error #2044: Unhandled ioError:. text=Error #2032: Stream Error. URL: file:///C|/DOCUME%7E1/senocular/LOCALS%7E1/Temp/Invalid XML URL at Timeline0_5650dafd68b564789d938267b772078/::frame1() В подобных случаях можно просто использовать обработчики событий. var loader:URLLoader = new URLLoader();
loader.addEventListener(IOErrorEvent.IO_ERROR, catchIOError);
function catchIOError(event:IOErrorEvent){
trace("Error caught: "+event.type);
}
loader.load(new URLRequest("Invalid XML URL"));
trace("Continuing with script...");
|
|
|||||
|
Регистрация: Oct 2003
Адрес: Москва
Сообщений: 328
|
ActionScript 3 поддерживает широкий диапазон типов переменных, включая несколько отсутствующих в предыдущих версиях ActionScript. Основные типы для AS3:
Простые:
Сложные:
Примечание:
|
|
|||||
|
Регистрация: Oct 2003
Адрес: Москва
Сообщений: 328
|
ActionScript 3 пополнилась коллекция "отображаемых объектов", которые могут быть видимы на экране и добавлены в "display list".
Отображаемые объекты AS3 :
*Для ссылки на объекты существующие в timeline; вы не можете создавать их с помощью AS. AVM1Movie представляет собой flash-ролик, созданный в ActionScript 1 или 2. Эти ролики используют ActionScript Virtual Maching 1, тогда как AS3 ролики используют AVM2. AVM2 ролики могут проигрывать ролики AVM1, но не могут взаимодействовать с ними (с их ActionScript) используя AS3. Bitmaps - объекты bitmap. Вы можете задавать им изображение с помощью BitmapData объектов или это могут быть bitmap-картинки из файлов. Объекты Loader - отображаемые объекты, которые загружают в себя внешнее содержимое. Это могут быть изображения или другие SWF-приложения. MorphShapes - это shape tweens (анимации фигур), созданные на timeline. Хотя вы не можете создать их в ActionScript, вы можете получить доступ к уже существующим на timeline, используя ActionScript и они будут иметь тип MorphShape. MovieClips - это ролики, которые вы знаете и любите. Shapes это разобранные ролики, которые по существу содержат только graphics object для рисования в нем с использованием vector drawing API. Использование Shapes вместо MovieClips или Sprites может помочь сэкономить память Sprite объекты - по существу ролики без timelines. Это наиболее часто используемый тип в AS3, и обычно он расширяется при создании вашего собственного подкласса отображаемых объектов. StaticText, как и MorphShapes, не могут быть созданы в ActionScript, ссылаясь вместо этого на объекты static text, созданные на Flash timeline. Объекты TextField включают dynamic и input text. Объекты Video представляют Flash video. |
|
|||||
|
Регистрация: Oct 2003
Адрес: Москва
Сообщений: 328
|
Директива import в ActionScript 3 немного отличается от import в ActionScript 2. В AS2 import использовался только для сокращения имен классов, определенных в пакетах; она не была обязательной для использования класса. Вместо использования import, вы могли просто использовать полное имя класса, например:
В ActionScript 3, директива import обязательна для доступа к классам в их пакетах, даже если вы ссылаетесь на класс по его полному имени. Вы все еще можете использовать полное имя (или только проимпортированное имя класса), но использование import необходимо // ActionScript 3 import flash.geom.Point; var myPoint:flash.geom.Point = new flash.geom.Point(0,0); |
|
|||||
|
Регистрация: Oct 2003
Адрес: Москва
Сообщений: 328
|
ActionScript позволяет заменить назначенный объекту тип на другой совместимый при необходимости. Это называется приведением (casting). Оба ActionScript 2 и 3 поддерживают приведение с использованием синтаксиса type(object). Например, если объект вашего класса был назначен переменной как object, вы можете переопределить типизацию для этого объекта приведением его к типу вашего класса, дав таким образом возможность Flash знать какие именно методы и свойства доступны у этого объекта
ActionScript 3 вводит новый оператор для приведения типов - оператор as. Оператор as заменяет приведение типа с использованием type(object) синтаксиса в ActionScript 2 на синтаксис object as type. Оператор as работает весьма схоже с приведением в ActionScript 2. Если преобразование не может быть выполнено, его результат null. В противном случае приводимый объект возвращается и ему назначается указанный тип. ActionScript 3 все еще поддерживает type(object) приведение, но его поведение имеет теперь некоторые отличия. Вместо возврата null при неправильном приведении, генерируется TypeError. Сбой происходит когда вы пытаетесь привести объект к несовместимому типу, например при попытке привести объект к не связанному (not associated) или унаследованному типу. Примечание: ActionScript также имеет глобальные функции преобразования для этих целей в стиле Class(object), имеющие приоритет над приведением type(object). Это такие функции, как String(), Number(), Array() и т.д. Они не выполняют приведение настолько же как фактическое преобразование одного объекта в другой (когда это возможно). Т.к. эти функции приоритетнее type(object), предпочтительнее использовать оператор as для приведения объектов к другому типу данных. |
|
|||||
|
Регистрация: Oct 2003
Адрес: Москва
Сообщений: 328
|
Ключевое слово delete во Flash используется для удаления определений переменных. Оно не удаляет объекты из памяти (это происходит за кулисами с помощью так называемого "сборщика мусора" /"Garbage Collector"/ ), а просто берет созданную вами переменную и избавляется от нее, делая ее недоступной и невидимой для итераторов (for..in циклы, и т.п.).
Внутренние механизмы Garbage Collector (GC для краткости), знают когда физически удалять объекты из памяти - когда больше нет переменных, ссылающихся на них. Так, например, если у вас есть две переменные A и B и они обе ссылаются на ObjectX, удаление переменной A не приведет к удалению сборщиком мусора ObjectX из памяти. Однако, если вы удалите обе переменные A и B, больше не будет ссылок на ObjectX и GC будет знать, что объект нуждается в удалении из памяти var a:Object = new Object(); var b:Object = a; // reference same new Object(); delete a; trace(b); // [object Object] - still exists in memory delete b; // GC will mark object for deletion from memory Хотя GC и новая виртуальная машина, управляющая им, на самом деле не сильно изменились в ActionScript 3, что изменилось, так это поведение ключевого слова delete. Теперь ключевое слово delete работает только для динамических свойств экземпляров класса, но не для объявленных членов класса (переменных и методов). В ActionScript 1 и 2 delete можно было использовать для всего. ActionScript 3 позволит только удалить динамические переменные и заблокирует прочее. // ActionScript 2
class DeleteVarClass {
public var myVar:Number;
function DeleteVarClass() {
myVar = 1;
trace(myVar); // 1
delete myVar;
trace(myVar); // undefined
}
}
// ActionScript 3
package {
public class DeleteVarClass {
public var myVar:Number;
public function DeleteVarClass() {
myVar = 1;
trace(myVar); // 1
delete myVar;
trace(myVar); // 1
}
}
}
Поскольку вы не можете удалять члены класса в ActionScript 3, если вы хотите, чтобы переменная больше не ссылалась на объект или значение в памяти, вы можете установить значение переменной в null вместо ее удаления. |
![]() |
![]() |
Часовой пояс GMT +4, время: 07:07. |
|
|
« Предыдущая тема | Следующая тема » |
|
|