Два раза в месяц мы возвращаемся к любимым постам наших читателей на протяжении всей истории Activetuts +. Этот учебник был впервые опубликован в мае 2009 года.
Используя ActionScript 3.0, мы создадим отличный анимированный фон, который мы можем использовать на экранах меню или в качестве музыкального визуализатора.
Окончательный результат предварительного просмотра
Давайте посмотрим, над чем мы будем работать:
Шаг 1: Краткий обзор
Мы создадим класс, который позаботится обо всем эффекте. Когда вы позвоните в класс, вы сможете изменить количество источников света, цвет, альфа, размер, направление, скорость и качество фильтра Blur. Таким образом, можно получить много разных результатов при его использовании. Кроме того, вы можете использовать любой фон, который вы хотите.
Шаг 2: Документ .fla
Создайте новый документ ActionScript 3.0 (Файл> Создать …). Установите размер сцены на желаемые размеры, я использовал 600 х 300 пикселей.
Шаг 3: Ваш фон
Добавьте или нарисуйте изображение для использования в качестве фона, я использовал простой синий градиент (# 02C7FB, # 1F63B4).
Шаг 4: Слои
Переименуйте первый слой в «Фон», затем создайте другой и назовите его «Код». Вы можете заблокировать слой «Код», чтобы избежать размещения там ненужных рисунков.
Шаг 5: ActionScript
Сохрани свою работу и давай в код!
Я предполагаю, что у вас уже есть базовое понимание ActionScript 3.0, если у вас есть какие-либо сомнения в отношении ключевых слов, обратитесь к справке Flash (F1).
Создайте новый файл ActionScript (Файл> Новый …).
Шаг 6: Импорт необходимых классов
1
2
3
4
5
6
7
8
|
package Classes
{
/* Import required classes */
import flash.display.MovieClip;
import flash.filters.BitmapFilter;
import flash.filters.BlurFilter;
import flash.events.Event;
|
Здесь мы импортируем классы, которые будем использовать, помните, что слово рядом с «пакетом» — это имя папки, в которой находится наш класс.
Шаг 7: Расширение класса
1
2
3
4
|
//We need to extend the class so we can use the addChild() method.
public class Lights extends MovieClip
{
|
Расширение класса MovieClip позволит нашему классу наследовать все методы, свойства и функции, которыми обладает MovieClip, в этом случае мы используем его для получения доступа к методу addChild ().
Шаг 8: Переменные
Несмотря на то, что они в значительной степени говорят сами за себя, я добавлю короткие комментарии к каждой переменной, чтобы убедиться, что она понятна. Они получают свои значения из параметров функции Main.
1
2
3
4
5
6
7
|
private var lightsNumber:int;
private var xSpeed:int;
private var ySpeed:int;
private var lightsDir:String;
private var areaW:int;
private var areaH:int;
private var lights:Array = new Array();
|
Шаг 9: Основная функция
1
2
3
4
5
6
7
8
9
|
/* Main function */
public function init(areaWidth:int, areaHeight:int, numberOfLights:int, lightSize:int, lightColor:uint, minimumScale:Number, hSpeed:int, vSpeed:int, dir:String, quality:int):void
{
areaW = areaWidth;
areaH = areaHeight;
lightsNumber = numberOfLights;
lightsDir = dir;
|
Это функция, которая нам нужна для запуска эффекта, мы также устанавливаем значения переменных в этом коде.
Шаг 10: Создание огней
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
|
for (var i:int = 0; i < numberOfLights; i++)
{
/* Create the specified number of lights */
var light:MovieClip = new MovieClip();
/* Set random speed to x and y based on the params */
xSpeed = Math.floor((Math.random() * (hSpeed — -hSpeed + 1)) + -hSpeed);
ySpeed = Math.round((Math.random() * vSpeed) + 0.5);
light.xSpeed = xSpeed;
light.ySpeed = ySpeed;
/* Create lights */
light.graphics.beginFill(lightColor);
light.graphics.drawCircle(0, 0, lightSize / 2);
light.graphics.endFill();
|
В этом коде мы используем оператор «For» для создания количества источников света, которые пользователь устанавливает в параметре, и вычисляем полуслучайную скорость для каждого источника света.
Шаг 11: Позиция
Это устанавливает случайную стартовую позицию для источников света на основе параметров области.
1
2
|
light.x = Math.floor(Math.random() * areaWidth);
light.y = Math.floor(Math.random() * areaHeight);
|
Шаг 12: Фильтр размытия
1
2
3
4
5
6
7
|
var b:int = Math.floor(Math.random() * 10) + 5;
var blur:BitmapFilter = new BlurFilter(b,b,quality);
var filterArray:Array = new Array(blur);
light.filters = filterArray;
|
Приведенный выше код применяет Blur. Помните, что этот код по-прежнему является частью For, поэтому огни получают разные пятна.
Шаг 13: Альфа
1
|
light.alpha = Math.random() * 0.6 + 0.1;
|
Легкий; это устанавливает альфа-свойство между 0,1 и 0,6.
Шаг 14: Масштаб
1
2
|
light.scaleX = Math.round(((Math.random() * (1-minimumScale)) + minimumScale) * 100) / 100;
light.scaleY = light.scaleX;
|
Это устанавливает масштаб источников света между исходным размером и параметром минимального масштаба. Мы используем метод округления, чтобы сохранить процессор.
Шаг 15: Добавление огней на сцену
1
2
3
4
5
6
7
8
9
|
addChild(light);
/* Store lights in an array to use it later */
lights.push(light);
/* Check for lights direction */
checkDirection();
|
Это добавляет огни в сцену, затем мы сохраняем их в массиве, чтобы использовать их позже. Это также функция checkDirection, чтобы увидеть, в каком направлении будут двигаться огни.
Шаг 16: Проверьте функцию направления
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
|
private function checkDirection():void
{
for (var i:int = 0; i < lights.length; i++)
{
switch ( lightsDir )
{
case «up» :
lights[i].addEventListener(Event.ENTER_FRAME, moveUp);
break;
case «down» :
lights[i].addEventListener(Event.ENTER_FRAME, moveDown);
break;
case «right» :
lights[i].addEventListener(Event.ENTER_FRAME, moveRight);
break;
case «left» :
lights[i].addEventListener(Event.ENTER_FRAME, moveLeft);
break;
default :
trace(«Invalid Direction!»);
}
}
}
|
Здесь мы используем for
получения доступа ко всем источникам света в массиве, затем проверяем переменную направления, чтобы определить, куда перемещать источники света. В зависимости от направления мы добавляем слушателя к соответствующей функции.
Шаг 17: Функции перемещения
Следующий раздел может показаться немного сложным, но это проще, чем вы думаете. По сути, он перемещает источник света в зависимости от скорости, рассчитанной в функции Main, а затем проверяет, «ушел ли источник света» из области эффекта. Если это так, он устанавливает случайную позицию, противоположную направлению света.
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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
|
private function moveUp(e:Event):void
{
e.target.x += e.target.xSpeed;
e.target.y-=e.target.ySpeed;
/* Reset light position, Y first, then X */
if (e.target.y + (e.target.height / 2) < 0)
{
e.target.y = areaH + (e.target.height / 2);
e.target.x=Math.floor(Math.random()*areaW);
}
if ((e.target.x + e.target.width / 2) < 0 || (e.target.x — e.target.width / 2) > areaW)
{
e.target.y = areaH + (e.target.height / 2);
e.target.x=Math.floor(Math.random()*areaW);
}
}
/* Move Down function */
private function moveDown(e:Event):void
{
e.target.x+=e.target.xSpeed;
e.target.y+=e.target.ySpeed;
/* Reset light position, Y first, then X */
if (e.target.y — (e.target.height / 2) > areaH)
{
e.target.y = 0 — (e.target.height / 2);
e.target.x=Math.floor(Math.random()*areaW);
}
if ((e.target.x + e.target.width / 2) < 0 || (e.target.x — e.target.width / 2) > areaW)
{
e.target.y = areaH + (e.target.height / 2);
e.target.x=Math.floor(Math.random()*areaW);
}
}
/* Move Right function */
private function moveRight(e:Event):void
{
e.target.x+=e.target.ySpeed;
e.target.y+=e.target.xSpeed;
/* Reset light position, Y first, then X */
if (e.target.y — (e.target.height / 2) > areaH || e.target.y + (e.target.height / 2) < 0)
{
e.target.x = 0 — (e.target.height / 2);
e.target.y = Math.floor(Math.random()*areaH);
}
if ((e.target.x — e.target.width / 2) > areaW)
{
e.target.x = 0 — (e.target.height / 2);
e.target.y = Math.floor(Math.random()*areaW);
}
}
/* Move Left function */
private function moveLeft(e:Event):void
{
e.target.x-=e.target.ySpeed;
e.target.y-=e.target.xSpeed;
/* Reset light position, Y first, then X */
if (e.target.y — (e.target.height / 2) > areaH || e.target.y + (e.target.height / 2) < 0)
{
e.target.x = areaW + (e.target.width / 2);
e.target.y=Math.floor(Math.random()*areaH);
}
if ((e.target.x + e.target.width / 2) < 0)
{
e.target.x = areaW + (e.target.width / 2);
e.target.y=Math.floor(Math.random()*areaW);
}
}
}
}
|
Шаг 18: вызов функции
Сохраните ваш класс (помните, что файл должен иметь то же имя, что и класс), и давайте вернемся к Fla. Откройте панель действий и напишите:
1
2
3
4
5
6
7
|
import Classes.Lights;
var light:Lights = new Lights();
light.init(600, 300, 40, 60, 0xFFFFFF, 0.3, 3, 3, «up», 2);
addChild(light);
|
Это оно! Проверьте свой фильм, чтобы увидеть свой хороший анимированный фон!
Вывод
Игра с параметрами в классе приведет к множеству различных эффектов, попробуйте изменить фон, установить более медленные или более высокие скорости, использовать больше света, меньше размытия и так далее!
Я надеюсь, что вы узнали что-то, что вы можете использовать, спасибо за чтение!