Статьи

Создание генеративного искусства с HYPE

В этом уроке мы собираемся связать математику и дизайн. Мы исследуем систему HYPE Брандена-Холла и Джошуа Дэвиса и создадим генеративное искусство из кода.


Давайте посмотрим на конечный результат, к которому мы будем стремиться:


Перед тем, как погрузиться в код, давайте на короткое время ознакомимся с файлами проекта.

Внутри исходного файла .zip вы найдете папку для каждого значимого шага, чтобы вы могли точно увидеть, какие изменения были внесены. Кроме того, вы найдете папку с именем Base, сделайте копию этой папки, поскольку она послужит нашей отправной точкой.

Внутри базовой папки у нас есть папка bin, где будет опубликован наш SWF. Папка src, которая содержит наши файлы ActionScript 3 и Flash и, наконец, папку lib, где мы будем хранить SWC-файлы HYPE-фреймворка.

Обзор структуры папок

Далее нам нужно получить последнюю версию HYPE-фреймворка из его дома по адресу www.hypeframework.org .

После завершения загрузки откройте файл .zip. Вы найдете два SWC-файла с именами hype-framework.swc и hype-extended.swc . Скопируйте оба из них в папку Base \ lib.

Эти SWC-файлы, по сути, представляют собой набор исходных файлов для платформы, все для удобства сведены в один файл.

Копирование необходимых файлов SWC

Последний шаг, необходимый для того, чтобы все заработало и работало, — это сказать Flash, что мы ищем два новых SWC-файла, когда мы компилируем фильм, в противном случае он вызовет целую кучу ошибок, не очень приятно!

Откройте файл Main.fla в папке Base \ src , затем выберите «Файл», «Параметры публикации». Выберите вкладку Flash, как показано, в новом открывшемся окне выберите вкладку «Путь к библиотеке».

Добавление SWC во Flash

Нажмите кнопку «Обзор TO SWC» и добавьте оба файла SWC в файл Flash. Как только это будет завершено, пришло время начать добавлять код!

Просмотр файлов SWC

Откройте исходный файл Main.as в выбранном вами редакторе. Добавьте следующие частные свойства и метод initHype() :

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
public class Main extends MovieClip
{
    // private properties
    private var bitmapCanvas:BitmapCanvas;
    private var clipContainer:Sprite;
    private var objectPool:ObjectPool;
     
     
     
    /**
     * constructor
     */
    public function Main()
    {
        // inits the Hype framework
        initHype();
    }
     
     
     
    /**
     * initiation of the Hype members we will be using and configuration prior
     * to running the animation
     */
    private function initHype():void
    {
        // the clipContainer is used as a parent for all of our objects
        clipContainer = new Sprite();
        addChild(clipContainer);
    }
}

В следующих нескольких шагах мы рассмотрим каждый из этих объектов, которые мы добавили как частные свойства, начиная с clipContainer Sprite .

Поскольку в нашем дизайне будет одновременно более ста объектов, движущихся по экрану, нам понадобится что-то для размещения их всех — простое добавление их в Stage станет проблематичным в дальнейшем. Ответ заключается в том, чтобы создать обычный AS3 Sprite будет выступать в роли родителя.


Первую реальную часть HYPE, BitmapCanvas можно представить как Sprite или, еще лучше, Bitmap/BitmapData в который мы будем рисовать наши объекты, каждый кадр, как холст художника.

Мы создаем его чуть ниже кода clipContainer и определяем его шириной и высотой, чтобы соответствовать рабочей области. Мы добавляем его в startCapture(clipContainer, true) но также startCapture(clipContainer, true) ему startCapture(clipContainer, true) , это просто говорит BitmapCanvas делать снимок clipContainer каждом кадре. Но пока держите это закомментированным!

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
    /**
     * initiation of the Hype members we will be using and configuration prior
     * to running the animation
     */
    private function initHype():void
    {
        // the clipContainer is used as a parent for all of our objects
        clipContainer = new Sprite();
        addChild(clipContainer);
     
        // think of the BitmapCanvas as an empty space we will ‘paint’
        // every frame with new image data
        bitmapCanvas = new BitmapCanvas(stage.stageWidth, stage.stageHeight);
        //bitmapCanvas.startCapture(clipContainer, true);
        addChild(bitmapCanvas);
    }
}

Если вы работали с играми, вы, вероятно, столкнулись с концепцией ObjectPool . Поскольку создание новых объектов является слишком сильным ударом по процессору, мы создаем пул определенного количества объектов перед началом игры или приложения. Затем мы будем использовать объекты из этого пула, и по окончании мы будем перерабатывать и снова использовать их все, что позволит избежать создания новых объектов. Это обычно используется для пуль / лазеров в играх, и та же логика используется в HYPE.

Если вы посмотрите на библиотеку Main.fla во Flash, вы увидите, что я создал MovieClip именем circleShape и присвоил ему идентификатор связывания circleShape чтобы мы могли создать несколько копий этого объекта с кодом; это то, что наш ObjectPool будет ObjectPool .

мувиклип, который будет использоваться с ObjectPool

Добавьте ObjectPool ниже кода BitmapCanvas, например, так:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
/**
 * initiation of the Hype members we will be using and configuration prior
 * to running the animation
 */
private function initHype():void
{
    // the clipContainer is used as a parent for all of our objects
    clipContainer = new Sprite();
    addChild(clipContainer);
 
    // think of the BitmapCanvas as an empty space we will ‘paint’
    // every frame with new image data
    bitmapCanvas = new BitmapCanvas(stage.stageWidth, stage.stageHeight);
    //bitmapCanvas.startCapture(clipContainer, true);
    addChild(bitmapCanvas);
     
    // create a collection of 10 objects and store them in an ObjectPool
    // for use in the animation
    objectPool = new ObjectPool(circleShape, 10);
}

Теперь у нас есть настройка основных игроков: clipContainer , BitmapCanvas и ObjectPool с 10 клипами, пора начинать движение.

Чтобы получить элемент из ObjectPool мы можем использовать objectPool.request(); который даст нам circleShape MovieClip из библиотеки Flash для работы с ним.

ObjectPool также предоставляет нам метод objectPool.onRequestObject() который является удобным способом назначать свойства клипа каждый раз, когда мы запрашиваем его. Добавьте следующее ниже, где вы ObjectPool экземпляр ObjectPool :

01
02
03
04
05
06
07
08
09
10
11
12
13
// create a collection of 10 objects and store them in an ObjectPool
// for use in the animation
objectPool = new ObjectPool(circleShape, 10);
 
// each time we request a new shape from the pool
// it will perform the following
objectPool.onRequestObject = function(clip:MovieClip):void
{
    clip.x = Math.random() * stage.stageWidth;
    clip.y = Math.random() * stage.stageHeight;
     
    clipContainer.addChild(clip);
}

После добавления этого нового кода каждый раз, когда мы запрашиваем объект из пула с помощью objectPool.request() он создает circleShape . Добавьте его в clipContainer и расположите его случайным образом на экране. Вы можете проверить это, внеся изменения в конструктор, чтобы он выглядел следующим образом:

01
02
03
04
05
06
07
08
09
10
/**
 * constructor
 */
public function Main()
{
    // inits the Hype framework
    initHype();
     
    objectPool.request();
}

Если все прошло хорошо, у вас должен быть один одинокий кружок на экране.


Помните, мы установили размер ObjectPool 10? Ну, мы собираемся увеличить анте и увеличить это до 100 объектов, изменив следующее:

1
2
3
// create a collection of 10 objects and store them in an ObjectPool
// for use in the animation
objectPool = new ObjectPool(circleShape, 100);

Мы можем изменить предыдущий оператор запроса следующим образом: requestAll() следующим образом:

01
02
03
04
05
06
07
08
09
10
/**
 * constructor
 */
public function Main()
{
    // inits the Hype framework
    initHype();
     
    objectPool.requestAll();
}

Теперь у нас должно быть 100 кругов, разбросанных по области экрана.


Теперь у нас есть 100 circleShapes распределенных по экрану, и пришло время circleShapes наш дизайн, добавив движение.

Давайте начнем с применения FixedVibration к свойствам alpha и scale каждого клипа. Мы можем использовать метод ObjectPools onRequestObject для его реализации, как показано ниже:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
// create a collection of 10 objects and store them in an ObjectPool
// for use in the animation
objectPool = new ObjectPool(circleShape, 100);
 
// each time we request a new shape from the pool
// it will perform the following
objectPool.onRequestObject = function(clip:MovieClip):void
{
    clip.x = Math.random() * stage.stageWidth;
    clip.y = Math.random() * stage.stageHeight;
     
    // add a FixedVibration to the alpha and scale properties of each circleShape when requested
    var alphaVib:FixedVibration = new FixedVibration(clip, «alpha», 0.9, 0.05, 0.5, 1.5, false);
    var scaleVib:FixedVibration = new FixedVibration(clip, «scale», 0.9, 0.05, 0.05, 0.8, false);
    alphaVib.start();
    scaleVib.start();
     
    clipContainer.addChild(clip);
}

Давайте FixedVibration рассмотрим созданные FixedVibration объекты FixedVibration . Каждый FixedVibration объект FixedVibration принимает 7 параметров, соответственно:

  • Объект, к FixedVibration применяется FixedVibration , в нашем случае наш circleShape называется «clip».
  • Свойство, к FixedVibration применяется FixedVibration , на этот раз мы работаем со свойствами alpha и scale .
  • Третий параметр — это Spring of the FixedVibration больше число, тем более пружинистое движение. Значение от 0 до 1 будет работать лучше всего.
  • Затем следует Ease вибрации. Чем ниже значение, тем быстрее оно будет скользить между следующими двумя значениями. Значение от 0 до 1 будет работать лучше всего.
  • Следующим будет минимальное значение, оно будет наименьшим при вибрации.
  • Точно так же максимальное значение будет максимальным значением, которое вибрация ударит.
  • Наконец, последний параметр является относительным, по умолчанию это false .

Так как же все это сочетается? Давайте посмотрим, как FixedVibration влияет на FixedVibration . Для него заданы значения Min и Max 0,05 и 0,8, значение Spring довольно высокое на 0,9, а Ease довольно низкое на 0,05, что делает его беспорядочным и быстрым.

Поиграйте с этими ценностями, чтобы понять, как они влияют на движение.

Когда мы тестируем наш файл Flash, мы должны получить что-то вроде этого:


Очень похоже на FixedVibration , VariableVibration будет корректировать свойство объекта со значением, которое колеблется. Разница в том, что VariableVibration не является линейной, как следует из названия.

Измените ваш код следующим образом, чтобы поместить клипы в центр Stage , только на этот раз мы применим VariableVibration к значениям x и y чтобы начать видеть какое-то движение!

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
// each time we request a new shape from the pool
// it will perform the following
objectPool.onRequestObject = function(clip:MovieClip):void
{
    clip.x = stage.stageWidth/2;
    clip.y = stage.stageHeight/2;
     
    // add a VariableVibration for the x/y movement of each circleShape
    var xVib:VariableVibration = new VariableVibration(clip, «x», 0.97, 0.03, 40);
    var yVib:VariableVibration = new VariableVibration(clip, «y», 0.97, 0.03, 40);
    xVib.start();
    yVib.start();
     
    // add a FixedVibration to the alpha and scale properties of each circleShape when requested
    var alphaVib:FixedVibration = new FixedVibration(clip, «alpha», 0.9, 0.05, 0.5, 1.5, false);
    var scaleVib:FixedVibration = new FixedVibration(clip, «scale», 0.9, 0.05, 0.05, 0.8, false);
    alphaVib.start();
    scaleVib.start();
     
    clipContainer.addChild(clip);
}

Давайте подробнее рассмотрим созданные нами объекты VariableVibration . Каждый VariableVibration объект VariableVibration принимает только 5 параметров, соответственно они следующие:

  • Объект для применения VariableVibration , в нашем случае наш circleShape называется «clip».
  • Свойство, к которому применяется VariableVibration , на этот раз мы работаем со свойствами x и y.
  • Третий параметр — это Spring вибрации.
  • Следующим является Ease вибрации.
  • Последний параметр — это Range значений, который производится. Чем выше число, тем более неустойчивый эффект.

Наш файл Flash должен выглядеть примерно так при публикации:


Это начинает хорошо выглядеть, но мы можем сделать намного лучше! Помните bitmapCanvas.startCapture() я просил вас оставить без комментариев в шаге 6? Идите и раскомментируйте его, а затем снова протестируйте фильм.

Это больше похоже на него!


Очень простой трюк для добавления спирального движения — добавить еще одну вибрацию к свойству поворота клипа, например:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
// each time we request a new shape from the pool
// it will perform the following
objectPool.onRequestObject = function(clip:MovieClip):void
{
    clip.x = stage.stageWidth/2;
    clip.y = stage.stageHeight/2;
     
    // add a VariableVibration for the x/y movement of each circleShape
    var xVib:VariableVibration = new VariableVibration(clip, «x», 0.97, 0.03, 40);
    var yVib:VariableVibration = new VariableVibration(clip, «y», 0.97, 0.03, 40);
    xVib.start();
    yVib.start();
     
    // add a FixedVibration to the alpha and scale properties of each circleShape when requested
    var alphaVib:FixedVibration = new FixedVibration(clip, «alpha», 0.9, 0.05, 0.5, 1.5, false);
    var scaleVib:FixedVibration = new FixedVibration(clip, «scale», 0.9, 0.05, 0.05, 0.8, false);
    alphaVib.start();
    scaleVib.start();
     
    // add a FixedVibration to the rotation of the circleShape
    var rotationVib:FixedVibration = new FixedVibration(clip, «rotation», 0.9, 0.05, 0, 360, false);
    rotationVib.start();
     
    clipContainer.addChild(clip);
}

Перед тестированием перепрыгните во Flash и откройте circleShape MovieClip в библиотеке.

Как показано, перетащите круг от центра в любом направлении. Чем дальше вы перемещаете его от центра, тем больше спиралей появится в вашем дизайне при публикации:

Смещение круга Форма для спиралей

Одна из проблем с нашей текущей анимацией состоит в том, что когда клипы удаляются с экрана, они очень редко возвращаются. Мы можем решить эту маленькую проблему, создав ExitShapeTrigger .

ExitShapeTrigger — это область, которая считается безопасной для клипа. Когда клип покидает эту область, нам нужно выполнить какую-то функцию, например, запросить новый клип из ObjectPool .

Мы определяем ExitShapeTrigger как ниже:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
// each time we request a new shape from the pool
// it will perform the following
objectPool.onRequestObject = function(clip:MovieClip):void
{
    clip.x = stage.stageWidth/2;
    clip.y = stage.stageHeight/2;
     
    // add a VariableVibration for the x/y movement of each circleShape
    var xVib:VariableVibration = new VariableVibration(clip, «x», 0.97, 0.03, 40);
    var yVib:VariableVibration = new VariableVibration(clip, «y», 0.97, 0.03, 40);
    xVib.start();
    yVib.start();
     
    // add a FixedVibration to the alpha and scale properties of each circleShape when requested
    var alphaVib:FixedVibration = new FixedVibration(clip, «alpha», 0.9, 0.05, 0.5, 1.5, false);
    var scaleVib:FixedVibration = new FixedVibration(clip, «scale», 0.9, 0.05, 0.05, 0.8, false);
    alphaVib.start();
    scaleVib.start();
     
    // add a FixedVibration to the rotation of the circleShape
    var rotationVib:FixedVibration = new FixedVibration(clip, «rotation», 0.9, 0.05, 0, 360, false);
    rotationVib.start();
     
    // define an ExitShape
    var exit:ExitShapeTrigger = new ExitShapeTrigger(onExitShape, clip, exitShape, true);
    exit.start();
     
    clipContainer.addChild(clip);
}
 
// recycle objects
private function onExitShape(clip:MovieClip):void
{
    trace(«circleShape left the screen!»);
}

Это создаст ExitShapeTrigger со следующими параметрами:

  • Метод для запуска, когда событие произошло.
  • MovieClip чтобы проверить, находится ли он вне заданной области.
  • MovieClip используемый для определения безопасной области, вы, возможно, уже заметили, что мы уже создали это, назвали его exitShape и поместили его на Stage во Flash.
  • Последний параметр — это флаг Enter Once , просто установите для него значение true .

Следуя ExitShape мы представили на последнем шаге, мы собираемся просто отредактировать метод onExitShape чтобы всякий раз, когда клип удалялся с экрана, мы ObjectPool его и запрашивали новый у ObjectPool .

До сих пор мы работали с методами request() и requestAll() объекта ObjectPool , когда мы хотим удалить старый, мы используем метод release(clip) :

01
02
03
04
05
06
07
08
09
10
// recycle objects
private function onExitShape(clip:MovieClip):void
{
    // remove from the ObjectPool and the clipContainer
    objectPool.release(clip);
    clipContainer.removeChild(clip);
     
    // get a new clip from the ObjectPool
    objectPool.request();
}

HYPE имеет возможность очень легко добавлять фильтры, такие как размытие и свечение к объектам. Чтобы добавить немного стиля в дизайн, мы добавим BlurFilter в проект, используя FilterCanvasRhythm :

01
02
03
04
05
06
07
08
09
10
11
12
13
// think of the BitmapCanvas as an empty space we will ‘paint’
// every frame with new image data
bitmapCanvas = new BitmapCanvas(stage.stageWidth, stage.stageHeight);
bitmapCanvas.startCapture(clipContainer, true);
addChild(bitmapCanvas);
 
// adding a blur
var blur:FilterCanvasRhythm = new FilterCanvasRhythm([new BlurFilter(1.1, 1.1, 1)], bitmapCanvas);
blur.start(TimeType.TIME, 100);
 
// create a collection of objects and store them in an ObjectPool
// for use in the animation
objectPool = new ObjectPool(circleShape, 100);

Приведенный выше код создает FilterCanvasRhythm который принимает Filter в качестве параметра и применяет его к bitmapCanvas мы объявили ранее.

Протестируйте проект, он действительно начинает собираться сейчас!


Мы можем легко добавить немного глубины в композицию, добавив больше фигур в микс. Вместо того, чтобы создавать и управлять несколькими ObjectPools , мы можем добавлять кадры к исходному используемому нам кольцу, и произвольно выбирать, какой кадр воспроизводить.

Попробуйте это сейчас, отредактируйте объект circleShape в библиотеке Flash. Создайте новый ключевой кадр, выберите новый цвет и нарисуйте новую форму. Создайте несколько собственных ключевых кадров, на следующем шаге мы рассмотрим их реализацию с помощью кода. Это наша новая форма:

Смещение круга Форма для спиралей

… по сравнению с нашей старой формой:

Смещение круга Форма для спиралей

Теперь, когда наш circleShape содержит несколько новых ключевых кадров, мы можем просто вставить эту единственную строку кода, чтобы выбрать кадр, который будет использоваться каждый раз, когда мы вызываем objectPool.request() :

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
// each time we request a new shape from the pool
// it will perform the following
objectPool.onRequestObject = function(clip:MovieClip):void
{
    clip.x = stage.stageWidth/2;
    clip.y = stage.stageHeight/2;
     
    // choose a random frame
    clip.gotoAndStop(Math.ceil(Math.random() * 3));
     
    // add a VariableVibration for the x/y movement of each circleShape
    var xVib:VariableVibration = new VariableVibration(clip, «x», 0.97, 0.03, 40);
    var yVib:VariableVibration = new VariableVibration(clip, «y», 0.97, 0.03, 40);
    xVib.start();
    yVib.start();
     
    // add a FixedVibration to the alpha and scale properties of each circleShape when requested
    var alphaVib:FixedVibration = new FixedVibration(clip, «alpha», 0.9, 0.05, 0.5, 1.5, false);
    var scaleVib:FixedVibration = new FixedVibration(clip, «scale», 0.9, 0.05, 0.05, 0.8, false);
    alphaVib.start();
    scaleVib.start();
     
    // add a FixedVibration to the rotation of the circleShape
    var rotationVib:FixedVibration = new FixedVibration(clip, «rotation», 0.9, 0.05, 0, 360, false);
    rotationVib.start();
     
    // define an ExitShape
    var exit:ExitShapeTrigger = new ExitShapeTrigger(onExitShape, clip, exitShape, true);
    exit.start();
     
    clipContainer.addChild(clip);
}

В качестве краткого примечания, приведенный выше случайный код кадра будет переключаться между кадрами 1, 2 и 3. Возможно, вам придется настроить его на количество кадров в вашем circleShape .


Пришло время проверить ваш фильм и насладиться смесью причудливых узоров и цветов, так как среда HYPE берет ваш код и смешивает его в произведение искусства.

Вот окончательный код для справки:

001
002
003
004
005
006
007
008
009
010
011
012
013
014
015
016
017
018
019
020
021
022
023
024
025
026
027
028
029
030
031
032
033
034
035
036
037
038
039
040
041
042
043
044
045
046
047
048
049
050
051
052
053
054
055
056
057
058
059
060
061
062
063
064
065
066
067
068
069
070
071
072
073
074
075
076
077
078
079
080
081
082
083
084
085
086
087
088
089
090
091
092
093
094
095
096
097
098
099
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
package
{
    import hype.extended.behavior.FixedVibration;
 
    import flash.display.Sprite;
    import flash.display.MovieClip;
    import flash.filters.BlurFilter;
    import hype.extended.behavior.VariableVibration;
    import hype.extended.rhythm.FilterCanvasRhythm;
    import hype.extended.trigger.ExitShapeTrigger;
    import hype.framework.core.ObjectPool;
    import hype.framework.core.TimeType;
    import hype.framework.display.BitmapCanvas;
     
 
    /**
     * A tutorial to introduce HYPE.
     * by Branden Hall and Joshua David for creating
     * generative / iterative design with code.
     *
     * @author Anton Mills
     * @version 06/02/2011
     */
    public class Main extends MovieClip
    {
        // private properties
        private var bitmapCanvas:BitmapCanvas;
        private var clipContainer:Sprite;
        private var objectPool:ObjectPool;
         
         
         
        /**
         * constructor
         */
        public function Main()
        {
            // inits the Hype framework
            initHype();
             
            // begin sequence
            objectPool.requestAll();
        }
         
         
         
        /**
         * initiation of the Hype members we will be using and configuration prior
         * to running the animation
         */
        private function initHype():void
        {
            // the clipContainer is used as a parent for all of our sprites
            clipContainer = new Sprite();
            addChild(clipContainer);
             
            // think of the BitmapCanvas as an empty space we will ‘paint’
            // every frame with new image data
            bitmapCanvas = new BitmapCanvas(stage.stageWidth, stage.stageHeight);
            bitmapCanvas.startCapture(clipContainer, true);
            addChild(bitmapCanvas);
             
            // adding a blur
            var blur:FilterCanvasRhythm = new FilterCanvasRhythm([new BlurFilter(1.1, 1.1, 1)], bitmapCanvas);
            blur.start(TimeType.TIME, 100);
 
            // create a collection of objects and store them in an ObjectPool
            // for use in the animation
            objectPool = new ObjectPool(circleShape, 100);
             
            // each time we request a new shape from the pool
            // it will perform the following
            objectPool.onRequestObject = function(clip:MovieClip):void
            {
                clip.x = stage.stageWidth/2;
                clip.y = stage.stageHeight/2;
             
                // choose a random frame
                clip.gotoAndStop(Math.ceil(Math.random() * 3));
                 
                // add a VariableVibration for the x/y movement of each circleShape
                var xVib:VariableVibration = new VariableVibration(clip, «x», 0.97, 0.03, 40);
                var yVib:VariableVibration = new VariableVibration(clip, «y», 0.97, 0.03, 40);
                xVib.start();
                yVib.start();
                 
                // add a FixedVibration to the alpha and scale properties of each circleShape when requested
                var alphaVib:FixedVibration = new FixedVibration(clip, «alpha», 0.9, 0.05, 0.5, 1.5, false);
                var scaleVib:FixedVibration = new FixedVibration(clip, «scale», 0.9, 0.05, 0.05, 0.8, false);
                alphaVib.start();
                scaleVib.start();
                 
                // add a FixedVibration to the rotation of the circleShape
                var rotationVib:FixedVibration = new FixedVibration(clip, «rotation», 0.9, 0.05, 0, 360, false);
                rotationVib.start();
                 
                // define an ExitShape
                var exit:ExitShapeTrigger = new ExitShapeTrigger(onExitShape, clip, exitShape, true);
                exit.start();
                 
                clipContainer.addChild(clip);
            };
        }
         
         
         
        // recycle objects
        private function onExitShape(clip:MovieClip):void
        {
            objectPool.release(clip);
            clipContainer.removeChild(clip);
             
            objectPool.request();
        }
    }
}

Это почти завершает представление HYPE Framework, большое спасибо за ваше время. Надеюсь, вам понравилось, и помните, что мы лишь немного поцарапали некоторые фантастические эффекты, которые можно сделать с помощью фреймворка. Пожалуйста, зайдите на веб-сайт HYPE Framework по адресу www.hypeframework.org, где вы найдете несколько фантастических примеров структуры и то, как другие подняли ее на новый уровень благодаря интеграции Away3D / Papervision!