Скажи "привет!" AS3-у -- говорит Колин Мук и выкладывает на одной короткой странице тезисы и примечания к своей лекции "Введение в ActionScript 3", прочитанной им на недавно прошедшем фестивале Flash In Da Can в Торонто. Основные темы:
Данные тезисы (а еще лучше -- их англоязычный оригинал на сайте Колина, ссылка была выше) можно смело использовать в качестве путеводителя по главным темам языка ActionScript 3.
Наверное, стоит выложить их тут по-русски. Перевод тезисов Колина на русский язык (стиль и оформление -- авторские):
© 2006 Colin Moock's Notes on His ActionScript 3.0 Lectures at FIDC:
обзор
общее введение в ActionScript 3.0
более глубокое изучение выбранных тем
начнем с начала
новая виртуальная машина: "AVM2"
ActionScript 1.0 и ActionScript 2.0: "AVM1"
AVM1 и AVM2 работают одновременно в одном проигрывателе
AVM2 переписана с нуля
основной язык (core language) против API проигрывателя (player API)
ActionScript состоит из "основного языка" и "api проигрывателя"
Основной язык ActionScript 3.0 как следующий шаг в эволюции ActionScript 2.0
api проигрывателя: капитальный ремонт; решительные и далеко идущие изменения
основной язык: главные изменения
полностью переконструирован для производительности
исключения на этапе выполнения (runtime exceptions)
E4X
регулярные выражения
основной язык: второстепенные изменения
предупреждения о недостающих объявлениях типов
ключевое слово final
модификаторы public, internal, protected, private
каждый класс должен быть в пакете
переопределения (overrides) должны быть объявлены
переменные и функции уровня пакета
выражения на уровне класса
константы
связанные методы
типы int, uint, Number
* против Object
Void теперь void
значения параметров по умолчанию
параметр ... (rest)
ошибки при несовпадении аргументов/параметров
выражение is приходит на смену instanceof
цикл for-each-in
flash player api
полностью переписан и реорганизован
значительно более ооп-ориентирован
основные моменты
flex
Flex Builder
Flex Framework
Flex Data Services
бесплатно!
бесплатный компилятор из командной строки: ActionScript 3.0 + Flex Framework
XML является встроенным типом данных в ActionScript 3.0
var novel:XML = <BOOK ISBN="0141182806"> <TITLE>Ulysses</TITLE> <AUTHOR>Joyce, James</AUTHOR> <PUBLISHER>Penguin Books Ltd</PUBLISHER> </BOOK>;
novel.AUTHOR // Все элементы-потомки <BOOK> с именем "AUTHOR"
trace(novel.TITLE); // Выводит: Ulysses
trace(novel.@ISBN); // Выводит: 0141182806
novel.AUTHOR = "Hemingway, Ernest";
novel.PUBLISHER = "Scribner";
novel.@ISBN = "0684800713";
E4X: обход XML-дерева с помощью for-each-in
var order:XML = <ORDER> <ITEM SKU="209"> <NAME>Trinket</NAME> <PRICE>9.99</PRICE> <QUANTITY>3</QUANTITY> </ITEM> <ITEM SKU="513"> <NAME>Gadget</NAME> <PRICE>149.99</PRICE> <QUANTITY>1</QUANTITY> </ITEM> <ITEM SKU="374"> <NAME>Toy</NAME> <PRICE>39.99</PRICE> <QUANTITY>2</QUANTITY> </ITEM> </ORDER> // Задать начальное значение суммарной стоимости как 0. var total:Number = 0; // Этот цикл срабатывает один раз для каждого элемента <ITEM>. for each (var item:XML in order.*) { total += item.QUANTITY * item.PRICE; } trace(total);
E4X: фильтрующие логические условия (filtering predicate)
var staff:XML = <STAFF> <EMPLOYEE ID="501" HIRED="1090728000000"> <NAME>Marco Crawley</NAME> <MANAGER>James Porter</MANAGER> <SALARY>25000</SALARY> <POSITION>Designer</POSITION> </EMPLOYEE> <EMPLOYEE ID="500" HIRED="1078462800000"> <NAME>Graham Barton</NAME> <MANAGER>James Porter</MANAGER> <SALARY>35000</SALARY> <POSITION>Designer</POSITION> </EMPLOYEE> <EMPLOYEE ID="238" HIRED="1014699600000"> <NAME>James Porter</NAME> <MANAGER>Dorian Schapiro</MANAGER> <SALARY>55000</SALARY> <POSITION>Manager</POSITION> </EMPLOYEE> </STAFF> // XMLList, содержащий всех работников var allEmployees:XMLList = staff.*; // XMLList, содержащий Marco и Graham var employeesUnderJames:XMLList = allEmployees.(MANAGER == "James Porter");
api дисплея
делит работу дисплея на три уровня
основные классы api дисплея
нова платформа основа создания отображаемых объектов (они же -- объекты дисплея)
var t:TextField = new TextField()
var mc:MovieClip = new MovieClip()
список отображения
иерархия всех отображаемых в данный момент объектов
корнем (root) иерархии является экземпляр объекта Stage
экземпляр объекта Stage -- это контейнер
первый потомок Stage's загружается автоматически: это главный класс .swf-приложения
отображаемые объекты могут существовать в состоянии открепления (detached) отдельно от списка отображаемых объектов (display list)
состояние объекта (его свойства) сохраняются, даже когда он отделен от списка отображения
контейнеры и потомки
DisplayObjectContainer.addChild()
DisplayObjectContainer.removeChild()
DisplayObjectContainer.addChildAt()
DisplayObjectContainer.removeChildAt()
автоматическое сворачивание уровней глубины (depths auto-collapse) при удалении потомков
векторное рисование
Классы Sprite и Shape определяют объект Graphics для векторного рисования
var rect:Shape = new Shape(); rect.graphics.lineStyle(1); rect.graphics.beginFill(0x0000FF, 1); rect.graphics.drawRect(0, 0, 75, 50);
пример использования api дисплея
package { import flash.display.*; import flash.text.TextField; public class GreetingApp extends Sprite { public function GreetingApp() { // Создать прямоугольник var rect:Shape = new Shape(); rect.graphics.lineStyle(1); rect.graphics.beginFill(0x0000FF, 1); rect.graphics.drawRect(0, 0, 75, 50); // Создать текстовое сообщение var greeting_txt:TextField = new TextField(); greeting_txt.text = "Hello world"; greeting_txt.x = 60; // Добавить элементы в список отображаемых addChild(greeting_txt); // Глубина 0 addChild(rect); // Глубина 1 // Создать круг var circle:Shape = new Shape(); circle.graphics.lineStyle(1); circle.graphics.beginFill(0xFF0000, 1); circle.graphics.drawCircle(0, 0, 25); circle.x = 75; circle.y = 35; // Поместить круг под прямоугольником addChildAt(circle, getChildIndex(rect)); } } }
собственные классы для работы с дисплеем
классы дисплея можно расширять
package { import flash.display.Shape; public class Rectangle extends Shape { public function Rectangle (w:Number = 100, h:Number = 100, lineThickness:Number = 1, lineColor:uint = 0x000000, fillColor:uint = 0xFFFFFF) { graphics.lineStyle(lineThickness, lineColor); graphics.beginFill(fillColor, 1); graphics.drawRect(0, 0, w, h); } } }
addChild(new Rectangle(10, 10));
модель событий: регистрация
основной код
someObj.addEventListener(EventName, listenerFunction)
public function listenerFunction (e:EventType):void { trace("вызвано событие"); }
код примера
var s:Sprite = new Sprite(); s.addChild(new Rectangle(25, 25)); s.addEventListener(MouseEvent.MOUSE_DOWN, mouseDownListener);
public function mouseDownListener (e:MouseEvent):void { trace("слушатель события mouse down услышал то, что нужно"); // Метод связян с текущим объектом (делегирование событий встроено в проигрыватель) trace("текущий объект: " + this); }
модель событий: поток событий
объекты дисплея используют трехфазный поток событий:
var s:Sprite = new Sprite(); s.addChild(new Rectangle(25, 25)); s.addEventListener(MouseEvent.MOUSE_DOWN, mouseDownListener); // Регистрация родителя для фазы сбора addEventListener(MouseEvent.MOUSE_DOWN, mouseDownListener, true); // Регистрация родителя для фазы пузырения addEventListener(MouseEvent.MOUSE_DOWN, mouseDownListener); addChild(s);
public function mouseDownListener (e:MouseEvent):void { trace("слушатель события mouse down услышал то, что нужно"); trace(" фаза события: " + e.eventPhase); trace(" текущая цель события: " + e.currentTarget + ", final target: " + e.target + "\n"); }
модель событий: ваши собственные события
package { import flash.events.*; public class Game extends EventDispatcher { // ИМЯ_СОБЫТИЯ: пишите их ВСЕГДА_ЗАГЛАВНЫМИ // для разделения слов используйте символ подчеркивания // имена хороши в своем настоящем времени public static const GAME_OVER:String = "GAME_OVER"; public function die ():void { dispatchEvent(new Event(Game.GAME_OVER)); } } }
-> Наверное, стоит выложить их тут по-русски еще как стоит!
Уже почти перевел. Через полчаса выложу.
данке шён шён (:
где картинка-то?
Картинка уже на месте. Простите дядьку -- забыл, что URL тут абсолютный нужон был ;)
25cee43492f175b90772377207c0552b d tg peccato menu invia valerio morgagni locandina ristorante decorare 59a34f61cb342c51ca287596994564ea