Эта фотография говорит все. На ней изображены люди, встретившиеся совсем недавно, чтобы поговорить о будущем технологии f, но вместо этого воспользовавшиеся радостями беспроводного интернет-доступа.
Слева направо: Дэниел Дура, Джош Дура, Дэррон Шелл, Майк Чэмберс (спрятался за Дэрроном), Чэфик Казоун, ноутбук Колина Мука, Майк Дауни и Брэндан Холл.
Угадайте, где Колин Мук?
Использующие флэш-компоненты от Макромедии сталкиваются с такой проблемой: компоненты, имеющие определяемое пользователем содержимое (например, компонент Window или ScrollPane), не реагируют на изменение размеров этого содержимого. Например, в случае с компонентом ScrollPane, увеличение его контента до размеров, выходящих за видимую область компонента, не приводит автоматически к появлению полос прокрутки, хотя должно. Чтобы ScrollPane и подобные ему отреагировали на изменение своего контента, нужно принудительно вызвать событие изменения размера на компоненте. Сделать это может метод doLater, наследуемый всеми компонентами от класса UIObject (это только один из вариантов его применения):
doLater
UIObject
scrollPane.content._yscale = 1000; // Изменяем размер контента scrollPane.doLater(scrollPane, "size"); // Заставляем компонент отреагировать на изменение размера контента.
Мелочь, а голова уже не болит ;)
Nox Noctis перевел с английского статью о базовых алгоритмах определения столкновений. В статью вошли "теорема о разделяющих осях для разных геометрических фигур, а также приёмы определения столкновений для маленьких и быстро движущихся объектов". Причем большая пиксельная длина этой статьи во многом определена большим количеством просто офигенных интерактивных ее иллюстраций.
Похоже, эта статья -- не последняя: Нокс собирается перевести еще несколько статей этих же авторов, о чем написано на странице "N: уроки по программированию игр во флэше". Почитайте там примечания переводчика внизу.
Спасибище тебе, Нокс!
Скажи "привет!" 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)); } } }
Update: Обратите внимание, что вышел релиз Flash Player под Linux!
Качать здесь: Flash Player 9 for Linux.
Adobe официально присвоила следующей, третьей и последней, бета-версии самого ожидаемого сейчас флэш-проигрывателя имя Flash Player 9 вместо временного имени Flash Player 8.5.
Выход релизов Adobe Flex (среда для кодеров), Adobe Flash (для дизайнеров, кодовое имя -- Blaze, спасибо constantiner -- поправил (спасибо еще раз))) и Flash Player 9 ожидается летом 2006 года.
Ну вот, опять в отпуск ехать не захочется (update: a в отпуск-то и не пускают, хахаха ;).
Kelvin Luck выпустил и развивает библиотеку flashr -- API-обертку для работы с фото-сайтом flickr (на самом деле это нечто большее, чем просто фото-сайт), известным своей открытостью и готовностью обмениваться фотоинформацией и ее метаданными типа заголовков, описаний, тэгов и даже комментариев к фото с любым приложением по протоколу REST. Впрочем, о последнем читателю можно сейчас же забыть, так как задача flashr заключается в том, чтобы дать флэш-программистам возможность говорить с flickr на языке ActionScript, и flashr с этой задачей справляется. А поскольку flickr находится рядом с пиком своей популярности (только не знаю, с какой от него стороны ;-) то и flashr пригодится. Существует также полная документация к flashr и несколько примеров его работы, включая просто неоценимое приложение для тестирования методов API flashr.
Сайт ActionScript.com объявил о начале конкурса "The Battle of the Script-2006: Injecting TextScript". Тема -- владение библиотекой для создания текстовых эффектов под названием TextScript. Организаторы конкурса призывают не зацикливаться на сложных задачах и просто поиграть. Прием работ заканчивается 1 Мая 2006 года, призы есть.
Подробности: The Battle of the Script-2006: Injecting TextScript.
Adobe опубликовала эскиз официальной спецификации языка ActionScript 3.0.
Пусть слово "эскиз" никого не пугает, сейчас многие развивающиеся продукты пребывают в постоянной "бета-версии", как пребывает в статусе "эскиза" их же документация, но они при этом иногда оказываются даже завершенне многих "релизов"..
Совсем древнее: 17-20.09.2002, 23-30.09.2002, 01-04.10.2002, 07-11.10.2002, 14-19.10.2002, 20-26.10.2002, 27.10-02.11.2002, 04-08.11.2002, 11-16.11.2002, 18-23.11.2002 25-30.11.2002, 02-07.12.2002, 09-14.12.2002 Сайт заработал 17.09.2002