4.4.3. Программная анимация

1. Открываем ранее созданный проект fish1.fla. У нас есть рыбка, двигающаяся водоросль, не хватает пузырей. Пузыри будем создавать программно. Для этого нажимаем Ctrl+F8, создаём новый мувик Bubble, в первом кадре которого изображаем пузырь.

2. На основной сцене создаём новый слой Bubble и вставляем на него только что созданный мувик, располагая его ниже дна водоема.

3. Выделяем мышкой пузырь, открываем вкладку Properties и даём имя мувику bub.

4. Теперь выделим мышкой первый кадр слоя Bubble, откроем вкладку Actions-Frame и вставляем код, написанный на языке Action Script. Код программы приведён ниже (комментарии можно не писать, но читать обязательно). Конечно, необходим опыт программирования на любом другом языке, иначе вы не поймёте, что пишете. Книги по Action Script (создание программной анимации в Macromedia Flash) можно скачать в Интернете или купить в книжном магазине, также можно проконсультироваться на форумах флэшеров.

stop();

//Вероятность появления нового пузыря

var probality = 5;

//Вероятность смены направления движения пузырей

var probality2 = 60;

//Гравитация

var gravity = 3;

//Начальные счётчики

var n = 0;

var n_lev = 0;

//Поворот пузыря

var rotSp = 6;

///////////////////////////

//ДЕЙСТВИЯ НА КАЖДЫЙ КАДР//

///////////////////////////

_root.onEnterFrame = function() {

//////////////////////////

//========НАПРАВЛЕНИЕ ДВИЖЕНИЯ=========//

//////////////////////////

// >> Берём случайное число от 0 до probality2

rand = random(probality2);

// >> если оно равно 1 и направление влево, меняем направление

if (rand == 1 && (global_xsp == 0 || global_xsp<−5)) {

global_sp = 0.4;

}

// >> если оно равно 2 и направление вправо

if (rand == 2 && (global_xsp == 0 || global_xsp>5)) {

global_sp = −0.4;

}

// >> увеличиваем движение в определённом направлении на global_sp

global_xsp += global_sp;

// >> ограничиваем скорость движения пузырей от −10 до 10

if (global_xsp>10) {

global_xsp = 10;

}

if (global_xsp<−10) {

global_xsp = −10;

}

////////////////////////////////////////

//========ДОБАВЛЕНИЕ ПУЗЫРЯ=========//

////////////////////////////////////////

// >> Если случайное число от 0 до probality равно 0, то создаём пузырь

if (!(random(probality))) {

// >> создаём пустой MovieClip createEmpty

duplicateMovieClip(_root.bub,"bub"+n, n_lev);

// >> определяем начальные координаты

eval("bub"+n)._y = 350;

eval("bub"+n)._x = random(550);

eval("bub"+n)._alpha = random(100);

// >> Определяем размер пузыря

eval("bub"+n)._xscale = eval("bub"+n)._yscale=random(80)+50;

// >> Увеличиваем порядковый счётчик N и уровневый счётчик N_LEV

n++;

n_lev++;

}

//////////////////////////////////////

//========ДВИЖЕНИЕ ПУЗЫРЕЙ=========//

//////////////////////////////////////

// >> Перебираем все пузыри счётчиком FOR

for (i=0; i // >> поворачиваем пузырь на rotSp

eval("bub"+i)._rotation += rotSp;

// >> перемещаем пузырь по координате X

// − Пузырь должен колебаться влево и вправо. Для этого мы переместим его по координате X на синус поворота (_rotation), умноженный на 2

// − На передвижение по оси X также влияет величина global_xsp. Но эта величина по−разному влияет на пузыри разных размеров. Те, что больше, меньше поддаются. Значит, мы приплюсуем к перемещению по оси X global_xsp, но перед этим поделим global_xsp на размер пузыря _xscale, делённый на 100. То есть чем больше размер, тем меньше будет влиять global_xsp на пузырь.

eval("bub"+i)._x += Math.sin(eval("bub"+i)._rotation)*2+global_xsp/(eval("bub"+i)._xscale/100);

// >> перемещаем пузырь по координате Y

// − Большие пузыри летят к поверхности быстрее, чем маленькие. Значит, мы переместим пузырь на gravity вниз, но перед этим поделим это gravity на размер _xscale, делённый на 100. То есть получается обратная пропорциональность: чем больше размер, тем меньше gravity.

eval("bub"+i)._y −= gravity*(eval("bub"+i)._xscale/100);

// >> если пузырь выходит за границы, он выходит с противоположной стороны экрана

if (eval("bub"+i)._x>550) {

eval("bub"+i)._x = 0;

}

if (eval("bub"+i)._x<0) {

eval("bub"+i)._x = 550;

}

// >> необходимо сжалиться над ресурсами компьютера и удалять лишние пузыри, которые скрылись вверху экрана.

// >> если координата Y меньше 0, то удаляем объект

if (eval("bub"+i)._y<0) {

// >> удаляем

eval("bub"+i).removeMovieClip();

// >> а теперь, чтобы не осталось дырки в цикле FOR, мы уменьшим порядковый номер всех последующих пузырей на 1

for (a=i+1; a eval("bub"+a)._name = "bub"+(a−1);

}

// >> уменьшаем порядковый счётчик на 1

n−−;

}

}

};

5. Нажимаем Ctrl+Enter. Анимация готова.