![]() |
|
|
|||||
Регистрация: 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 вместо ее удаления. |
|
|||||
Регистрация: Oct 2003
Адрес: Москва
Сообщений: 328
|
![]() Класс Dictionary (flash.utils.Dictionary) - новое дополнение в ActionScript. Он представляет собой то же самое, что и базовые объекты Object, за исключением одной особенности: в объектах Dictionary в качестве ключей могут быть использованы не только строки, но и любые другие значения.
Object использует только строковые ключи. Если в качестве для ключа используется не строковое значение, оно интерпретируется в строку. Пример: var obj:Object = new Object(); obj["name"] = 1; // string key "name" obj[1] = 2; // key 1 (converted to "1") obj[new Object()] = 3; // key new Object() converted to "[object Object]" for (var prop:String in obj) { trace(prop); // traces: [object Object], 1, name trace(obj[prop]); // traces: 3, 2, 1 } var a:Object = new Object(); var b:Object = new Object(); var obj:Object = new Object(); obj[a] = 1; // obj["[object Object]"] = 1; obj[b] = 2; // obj["[object Object]"] = 2; for (var prop:String in obj) { trace(prop); // traces: [object Object] trace(obj[prop]); // traces: 2 } import flash.utils.Dictionary; var a:Object = new Object(); var b:Object = new Object(); var dict:Dictionary = new Dictionary(); dict[a] = 1; // dict[a] = 1; dict[b] = 2; // dict[b] = 2; for (var prop:* in dict) { trace(prop); // traces: [object Object], [object Object] trace(dict[prop]); // traces: 1, 2 } Обратите внимание, что prop здесь определена как *. Это важно, т.к. ключи в объекте dict могут быть любого типа. Если вы используете String как тип prop, объекты a и b при их выборке в цикле будут приводиться к строкам, помещая в prop "[object Object]" вместо действительных ссылок на a и b, которыми они должны быть для корректного доступа к значениям 1 и 2 из dict. |
|
|||||
Регистрация: Oct 2003
Адрес: Москва
Сообщений: 328
|
![]() В ActionScript 3 введены метки (url=http://livedocs.macromedia.com/flex/2/langref/statements.html#label]labels[/url]), новые идентификаторы, которые можно привязывать к блокам циклов. Зачем вам может понадобиться идентифицировать блок цикла? Потому, что этот идентификатор можно использовать в командах break и continue. Представьте себе два цикла, один вложен в другой. Если в какой-то момент вы захотите прервать оба цикла, находясь во внутреннем, вы этого сделать не сможете. Команда break прервет только текущий блок. Обычно для этих целей используют переменную-флаг, которую устанавливают во внутреннем цикле, чтобы иметь возможность проверить во внешнем и, при необходимости, выйти также и из него. Пример:
var i:Number; var j:Number; var exit:Boolean = false; for (i=0; i<10; i++) { for (j=0; j<10; j++) { if (i > 3 && j > 3) { exit = true; break; } } if (exit) { break; } } Метки позволяют вам идентифицировать и прерывать указанный цикл (а также все вложенные в него). Формат метки label: statement Пример: Задав для первого цикла метку mainLoop, мы получили возможность легко прервать вложенный цикл, используя break mainLoop; Это позволяет писать более понятный код и избавляет от необходимости использовать дополнительные переменные. |
![]() |
![]() |
Часовой пояс GMT +4, время: 22:00. |
|
« Предыдущая тема | Следующая тема » |
|
|