Как теперь работать с клипами ?
Что-то давно я ничего не писал , блог зафлудили спамеры, тем не менее посещаемость растёт. Последнее обстоятельство заставило меня пристыдиться и написать что-нибудь.
Разницы между AS1 и AS2 невелика, некоторые фичи API плеера (например битмап фильтры и ExternalInterface) и эмуляция ООП среды на стадии компилляции. Это именно эмуляция, компиллятор собирает из исходников AS2 код AS1. Посмотрите на параметры публикации, выберите Flash Player 6 и убедитесь что среда предалагает публикацию на двух языках AS1 и AS2.
Многие флешеры говорят что они "кодят на AS2", но большинство из них не понимают что такое ООП. Они имеют какие-то представления об этом, но пишут программы приемущественно в кадрах клипов и считают "классы" лишним наворотом большого смысла в котором видят. ООП идеология - ключевой момент, отличающий AS1 от AS2.
Если пишите программы приемущественно в кадрах, значит кодите на AS1.
Если AS1 — ваш первый язык программирования. То перейти на ActionScript 3 вам будет сложнее. Т.К. в вашем мозге (как и ранее в моём) есть вредные извилины абстрактной модели MovieClip'ов.
Если вы работали на ActionScript 2 то всё немного проще, из-за принципов ООП, которым можно научиться в ActionScript 2.
Всех флешеров AS1, смутит новая модель работы с клипами.
Раньше приаттачить клип из библиотеки можно было так:
1. cоздали новую копию символа linkageId
2. создали новую переменную clipName в клипе clip.
Процесс довольно не привычный для программиста. Двумя строковыми литералами мы создаём переменную непонятного типа в объекте clip.
В Actions Script 3 логика больше соответсвует стандартам.
Что бы создать какой-то графический элемент и разместить его на сцене нужно:
1. Создать новый сомвол в библиотеке и нарисовать что-то в этом символе.
2. Ассоциировать созданный символ с классом:
Просто щёлкните правой кнопкой на символе в билиотеке, выберите Linkage. В открывшемся окне поставьте галочку Export for ActionScript.
В подсветившемся поле "Class" введите название класса.
3. Создать инстанцию класса и приаттачить куда нужно методом addChild().
Допустим вы создали в библиотеке символ и ассоциировали его с классом Square.
- 1 — объявляем пакет.
- 3 — импортируем класс Sprite из базового пакета flash.display.
- 4 — объявляем новый класс Board наследующий Sprite.
- 8-9 — объявляем переменную типа Square и записываем в неё ссылку на только что созданный объект типа Square.
В строке 9 "аттачим" "клип" aSquare к инстации Document Class, которая служит "рутом".
Обратите внимание ,что для вызова конструктора Square() - не нужно ничего импортировать ( как это нужно было для создания Board наследника Sprite) потому, что все классы созданные в билиотеке являются Top Level и общедоступны для всего приложения. Так же в любом месте программы нам не нужно импортировать класс Board, так как он находится в "верхнем" TopLevel пакете.
Усложняем пример, создаём в библиотеке новый символ, например кружок поменьше квадратика, и ассоциируем его с классом Round.
Создём в одном фолдере вместе с .fla файлом, файл Board.as:
- 4 — импортируем функцию setTimeout из пакета flash.utils. В пакете можно объявлять не только классы но и функции, константы и т.д. Подробнее эта тема обсуждалась здесь.
- 8-9 — объявляем пустые ссылки на будущие экземпляры классов Square и Round.
- 12-13 — создаём объекты aRound и aSquare.
- 14-15 — у только что созданных объектов нет родителей, и на сцене они не отображены.
- 16-17 — функция setTimeout позволяет вызвать другую функцию через определённый промежуток времени. Вызоваем функцию addToBoard через одну секунду, а функцию addToSquare через две с половиной секунды.
- 21 — задаём квадрату координаты 100, 100. Круг остаётся на месте (0,0).
- 22-23 — строки - добавляем квадрат и круг на сцену. После этого они появятся на сцене. Круг в начале координат, а квадрат в точке 100, 100.
- 24-25 — строки - родителем обоих объектов стал объект Board.
- 29 — удаляем со сцены (Board) круг;
- 30 — смотрим что у круга нет родителя;
- 31 — аттачим круг в квадрат, вызывая метод addChild в объекте aSquare. Теперь круг сохранит свои координаты 0,0 внутри квадрата.
- 32-33 — смотрим на родителей клипов aSquare и aRound.
Ещё через 1,5 секунды будет вызвана функция addToSquare:
Важный момент: мы отказались и полностью игнорируем имёна клипов. Нет необходимости отслеживать путь к объекту и юзать извращения targetPath и eval, стиль требует передавать ссылки на объекты. Например в объекте aSquare создать поле round ссылающееся на aRound.
Вообще-то если вы настоящиий AS2 программист , вы уже должны так делать =)
В AS1/2 конструктор мувиклипов приватный, это значит что вызвать его мы можем только из другого клипа. Новый клип создаётся и сразу присоединяется к родителю на указанный уровень.
Таким образом в AS1/2 мы НЕ можем создать клип без родителя. И не можем поменять родителя у уже созданного клипа.
Итог:
В AS3 "клипы" можно создавать где угодно, аттачить куда угодно и когда угодно.
Конструкции типа this['aSquare']['aRound'].targetPath() и eval('aSquare.aRound') уходят в прошлое, юзаем ссылки.
3 Responses to 'Как теперь работать с клипами ?'
Leave a Reply
You must be logged in to post a comment.

on September 8th, 2007 at 7:20 pm
“Разницы между AS1 и AS2 невелика, некоторые фичи API плеера (например битмап фильтры и ExternalInterface) и эмуляция ООП среды на стадии компилляции. Это именно эмуляция, компиллятор собирает из исходников AS2 код AS1″.
Эмуляция ООП?? - странное утверждение. Понятно, что AS2 - надстройка над AS1. Но скажи, по твоему AS1 не объектноориентированный язык?
P.S.: формальный синтаксис классов.
on September 11th, 2007 at 3:57 am
Вот вот, считаю что между AS2 и AS3 та же самая соразмерновеликая разница, что и между AS1 и AS2 !
on December 11th, 2007 at 3:35 pm
а вот еще вопрос такой, с аддчилдом разобрался но один вопрос всетаки меня мучает. вот в АС2 в аттаче присутствовала еще такая вещь как инит объекта , те
attachMovie(linkage,”name”, 1, {_x:, _y: , _alhpa и тд и тп});
так вот можно ли addChild мне обратиться к объекту, который я аттачу, или же нужно присваивать каждое свойство приаттаченого объекта послле того как я сделал addChild в АС3?