Мои пояснения к уроку.
!. Создайте новый документ
AS3 с нужными размерами (у меня 700 на 500), с частотой кадров =
25. Напишите основной класс
Main и сохраните его в папке под названием, например, Снегопад (файл - сохранить как...)
2. Нарисуйте несколько снежинок в программе или импортируйте их в библиотеку (я нарисавала 4 снежинки в фотошопе, применила тиснение и глянец). Перетащите их по очереди на сцену, выделите, измените размер (если нужно), выровняйте по центру

и преобразуйте её в символ (это можно сделать так: а) нажать F8; б) Модификация - Преобразовать в символ; в) нажать правой клавишей на снежинку и в открывшемся окне нажать на Преобразовать в символ) с именем
flake0, поставьте галочку в Экспорт для ActionScript

Появится окно, нажмите ок

Удалите символ со сцены. Так проделайте со всеми снежинками и присвойте
flake1; flake2; flake3 и т.д. столько сколько будет у вас снежинок и не забудьте ставить галочки в Экспорт для ActionScript.
3. Создайте объект к которому будет прилипать снег, это может быть что угодно (автор взял текст), превратите его в символ (клип) с точкой регистрации в верхнем левом углу, дайте имя
headTxt и поставьте галочку в Экспорт для ActionScript (как в снежинках), после чего удалите символ со сцены (если возьмёте текст, то не забудьте поставить динамический и внедрить шрифт).

4. Перетащите на сцену картинку (или нарисуйте как в уроке что-нибудь где будет идти снег. Я взяла гогтовую картинку), превратите его в символ с точкой регистрации в левом верхнем углу, с именем и классом
content (как снежинки и текст).
5. Создайте и сохраните в папке с проектом (Снегопад) 2 пустых as. файла, один назовите
Main.as (это главный класс) и
Flake.as (класс снежинок). Файл - Создать

6. Вставить в Flake.as код (описание кода почитайте в уроке)
package {
import flash.display.*;
import flash.events.*;
import flash.utils.*;
//Импортируем нужные пакеты
public class Flake extends Sprite {
//Объявление класса
private var sn:MovieClip;
//Ссылка на клип снежинки
private var ymax:Number;
//Высота документа
private var x0:Number;
//Стартовая х-координата снежинки
private var speed:Number;
//Скорость движения (величина задержки таймера)
private var angle:Number;
//Угол. Его проецируем на траекторию движения
private var scale:Number;
//Массштаб снежинки
private var tim:Timer;
//Таймер
private var targ:MovieClip;
//Ссылка на объект, к которому снежинка прилипает
private var movingFlag:int;
//Разрешение/Запрет движения
private var stopDelay:Number
//Продолжительность прилипания снежинки
//Конструктор. Аргументом является клип снежинки
public function Flake(arg:MovieClip):void {
//Запомним и кэшируем аргумент
sn=arg;
sn.cacheAsBitmap=true;
//Дефолтные установки для переназначаемых переменных
speed=100;
angle=0;
scale=1;
movingFlag=1;
//Снежинку – в дисплей список.
addChild(sn);
//Создание таймера
tim=new Timer(speed);
//События.
// Экземпляр класса добавлен на сцену
addEventListener(Event.ADDED_TO_STAGE, init);
//Отработал очередной интервал таймера
tim.addEventListener(TimerEvent.TIMER, moving);
}
//Эти методы (сеттеры) позволяют установить нужные свойства класса извне.
// Установка новой задержки таймера (скорости движения)
public function set _speed(arg:Number):void {
speed=arg;
tim.delay=speed;
stopDelay=speed;
}
//Угол
public function set _angle(arg:Number):void {
angle=arg;
}
//Массштаб
public function set _scale(arg:Number):void {
scale=arg;
this.scaleX=this.scaleY=scale;
}
// Целевой объект прилипания
public function set _target(arg:MovieClip){
targ=arg;
}
//Слушатели событий
/*Эта функция вызовется единожды, когда экземпляр класса будет добавлен на сцену.
Здесь выясним высоту документа, начальную х-координату и, запустив таймер, начнем движение.*/
private function init(e:Event) {
ymax=stage.stageHeight;
x0=this.x;
tim.start();
}
/* Функция перемещения снежинки. Вызывается с каждым интервалом таймера
Двигаем снежинку, следим за пересечением с целевым объектом, прилипаем и отлипаем*/
private function moving(e:TimerEvent) {
/*Ось у. Если снежинка опустилась за пределы документа, переставим ее вверх, иначе опускаем с постоянной скоростью. Когда movingFlag=0, движение остановится*/
this.y>ymax?this.y=-10:this.y+=2*movingFlag;
/*Ось х. Вычисляем приращение, основанное на синусе угла, прибавляем его к стартовой координате и перемещаем объект по горизонтали*/
this.x=x0+Math.sin(angle/180*Math.PI)*80;
//Циклично меняем значение угла
angle+=scale*2*movingFlag;
angle%=360;
/*Если задан целевой объект, то проверим пересечение с ним.
Если пересечение есть, то остановим движение*/
targ==null?null:targ.hitTestPoint(this.x, this.y, true)?movingFlag=0:movingFlag=1;
/*Если движение остановлено, уменьшаем счетчик паузы. Когда счетчик обнулится,
возобновим движение, а счетчик обновим */
!movingFlag?stopDelay?stopDelay--:movingFlag=1:stopDelay=speed;
}
}
}
7. Файл - Сохранить как...
Класс Flake.as готов. Чтобы проверить его, в файле Main.as, вставьте этот код:
package{
import flash.display.*;
public class Main extends Sprite{
public function Main():void{
var sn:Flake=new Flake(new flake0());
sn.x=200;
sn.y=10;
addChild(sn)
}
}
}
Протестируйте ролик. Если вы увидите одинокую снежинку, падающую по синусоиде, то вы всё сделали правильно, можно продолжать дальше, а этот код из Main.as удалить .
8. Теперь заменим код в главный класс документа Main.as (как, что и для чего почитайте в уроке) следующим:
package{
import flash.display.*;
import flash.utils.*;
import flash.events.*;
import flash.geom.*;
import flash.filters.*;
// Импортируем нужные пакеты
public class Main extends Sprite{
//Объявление класса
private var total:int;
//Кол-во снежинок
private var lastFlakeNumber:int;
//Последний номер снежинки в библиотеке
private var w:int;
private var h:int;
//Размеры проекта
private var snowHolder:Sprite;
//Контейнер пролетающего снега
private var snowStickyHolder:Sprite;
//Контейнер прилипающего снега
private var headHolder:Sprite;
//Контейнер предмета и "сугроба"
private var header:MovieClip;
//Предмет засыпаемый снегом
private var snowHead:Bitmap;
//Битмап "сугроба"
private var maskBD:BitmapData;
//Маска сугроба
private var snowBD:BitmapData;
//БД для текущих снимков снегопада
private var matr:Matrix;
//Координатор снимков снегопада
private var tim:Timer;
//Таймер запуска снимка
private var speed:Number;
//Задержка таймера
private var snowWeight:Number;
//Отступы на толщину сугроба в БД
//Конструктор класса. Определим размеры документа и перейдем к стартовым установкам
public function Main():void{
w=stage.stageWidth;
h=stage.stageHeight;
init();
}
/*Инициализация. Определяем переменные, расставляем на нужные уровни контейнеры и содержимое.
Создаем маску, таймер и командуем создание снегопада*/
private function init():void{
speed=300;
total=150;
snowWeight=30;
lastFlakeNumber=2;
headHolder = new Sprite();
snowHead = new Bitmap();
snowHolder = new Sprite();
snowStickyHolder = new Sprite();
//Фоновая картинка
var cont:content = new content();
//Класс заснеженного предмета. Сразу его отцентрируем
header = new headTxt() as MovieClip;
header.x=header.y=snowWeight;
//Разборка по уровням. Вначале – фон.
addChild(cont);
// Потом контейнер предмета
addChild(headHolder);
//В этот контейнер – предмет и сугроб
headHolder.addChild(header);
headHolder.addChild(snowHead);
//Теперь контейнер прилипающего снега
addChild(snowStickyHolder);
//И контейнер пролетающего снега
addChild(snowHolder);
//Предмет ставим на нужное место на сцене
headHolder.x=10;
headHolder.y=30;
//Создадим матрицу с настройкой на расположение контейнера предмета
matr=new Matrix();
matr.tx=- headHolder.x;
matr.ty=- headHolder.y;
//Создадим битмапдаты.
//Сугроба. Ее сделаем видимой
var bd:BitmapData=new BitmapData(header.width+snowWeight*2,header.height+snowWeight*2,true,0);
snowHead.bitmapData=bd;
//Снегопада
snowBD=bd.clone();
//Маски сугроба
maskBD=bd.clone();
//Скопируем предмет в БД, с зазорами размером с snowWeight
bd.draw(header,new Matrix(1,0,0,1,snowWeight,snowWeight));
// Размоем копию снимка в БД маски
var bf:BlurFilter = new BlurFilter(8,16,3);
maskBD.applyFilter(bd,bd.rect,new Point(0,0),bf);
//Подправим цветовой диапазон.
var trans:ColorTransform = new ColorTransform(16,16,16,3,0,0,0,0);
maskBD.colorTransform(maskBD.rect,trans);
//Объявим таймер и "привяжем" к нему слухача
tim=new Timer(speed);
tim.addEventListener(TimerEvent.TIMER, animate);
//Творим снегопад. Аргументом передаем засыпаемый предмет.
generate(header);
}
/*Генератор снега. В каждой итерации цикла рандомно выбирается одна из библиотечных снежинок.
Наделим ее случайными координатами, масштабом, скоростью и углом вылета.
Половине снежинок назначим целью предмет и сделаем их прилипающими, другая половина будет пролетать мимо.
Таким же образом распределим их по контейнерам.
Стартуем таймер*/
private function generate(arg:MovieClip):void{
for(var i:int=0; i<total; i++){
var s:*=getDefinitionByName('flake'+rNum(0, lastFlakeNumber));
var sn:Flake=new Flake(new s());
sn.x=rNum(20,w-20);
sn.y=rNum(-10,h-20);
sn._scale=rNum(.3,1.5,2);
sn._speed=rNum(10,40);
sn._angle=rNum(0,180);
i%2?sn._target=arg:null;
i%2?snowStickyHolder.addChild(sn):snowHolder.addChild(sn);
}
tim.start();
}
/*Чуть доработанный рандомайзер. Первые 2 параметра – обязательны и определяют
диапазон результата. 3 необязательный параметр – кол-во знаков после запятой. Без него получим целочисленный результат*/
private function rNum(min:Number, max:Number, exp:int=0):Number{
var decPt:Number=Math.pow(10,exp);
var n:Number=min+Math.random()*(max-min);
return Math.round(n*decPt)/decPt;
}
/*Функция вызывается таймером и меняет рисунок сугроба, соответственно снегопаду*/
private function animate(e:TimerEvent){
//Текущий снимок снегопада в районе предмета
snowBD.draw(snowStickyHolder,matr,null,null,null,true);
//Копируем его в БД сугроба с применением маски
snowHead.bitmapData.copyPixels(snowBD,snowBD.rect,new Point(0,0),maskBD, new Point(0,0),true);
//Чистим БД текущего снимка
snowBD.fillRect(snowBD.rect,0);
//Делаем БД сугроба чуть прозрачнее.
var trans:ColorTransform = new ColorTransform(1,1,1,1,0,0,0,-4);
snowHead.bitmapData.colorTransform(snowHead.bitmapData.rect, trans);
}
//
}
}
Взять его можно отсюда Вложение
10. Файл - Сохранить как...


Протестируйте ролик. Сохраните в fla (файл - сохранить как...) и в swf (файл - экспорт - экспортировать ролик). Вот и всё.
Если ничего не пропустили и не перепутали - будет работать! Проверил!