9
фев
  Снег во Flash 2 балла
 

В уроке разбирается, как можно в Flash сделать эффект падающего снега.

Вопрос:


Ребята, подскажите, кто знает, как более просто и эффективно сделать анимацию падающего снега во Flash. Или может есть у кого исходник с этим.

Ответ:


Конечно есть. Для вас всё, что угодно, хоть flash-исходник и флешка-пример к уроку =)

Создаём анимацию снега во Flash


Всё, что нам нужно, так это создать экземпляр Movie Clip объекта в библиотеке (Library) нашего Flash проекта .fla, назвать его snow_mc, указать все нужные галочки во вкладке Linkage (правая кнопка мышки на нужном объекте в Library), и вставить приведённый ниже код в первый кадр нашего флеш приложения.

Stage.scaleMode = “noScale”;
_root._quality = “BEST”;
//Создаём переменные ,которые будут влиять на движение снежинок, своеобразный
//ВЕТЕР (по оси X) и ПРИТЯЖЕНИЕ (по оси Y)
//Это ветер (ускорение по оси X)
var dX:Number = 0;
//Это притяжение/гравитация (по оси Y);
var dY:Number = 0.25;
//Функция, которая будет периодически менять значение “СИЛЫ ВЕТРА”.
function glob_func() {
        //Создаём переменную, значение которой будет варьироваться от -1 до +1
        //Это у нас будет новое значение ускорения по оси X (ветер)
        _root.newX = Math.random()*1-Math.random()*1;
        //Вычисляем ШАГ, за который будет изменяться прошлое значение ВЕТРА, на новое
        //значение. Делаем это для того, чтобы смена происходила не рывком, а плавно.
        _root.chX = (_root.newX-_root.dX)/(50+random(50));
        //На всякий случай удаляем старый интервал, если переход старого значения в
        //новое ещё не успел закончиться.
        clearInterval(_root.x_int);
        //Запускаем новый интервал, который будет каждые 30 миллисекунд вызывать
        //функцию, прибавляющую к старому значению слиы ВЕТРА, значение ШАГА, который
        //мы вычислили немного выше.
        _root.x_int = setInterval(function () {
                //Прибавляем к старому значению значение шага
                _root.dX += _root.chX;
                //Проверяем, если текущее значение скорости вестра приближённое до десятых
                //равно новому значению силы вытера, так же приближённому до десятых,
                //то переход старого значения силы ветра в новое уже закончился, а значит
                //можно удалять интервал вызывающий эту функцию.
                if (Math.round(_root.dX*10)/10 == Math.round(_root.newX*10)/10) {
                        clearInterval(_root.x_int);
                }
        }, 30);
}
//Создаём интервал, который будет вызывать функцию изменения СИЛЫ ВЕТРА один
//раз в 5 секунд.
setInterval(glob_func, 5000);
//Создаём функцию движения снежинок
function move_func() {
        //Чем меньше снежинка, тем дальше она от нас находится, чем она дальше от нас
        //находится, тем менее заметны нам изменения в её положении. Другими словами
        //если объект (снежинка) стоящий от нас на рсстоянии 1 метра переместить на
        //5 метров вправо, то мы это увидим точно. А если этот же обхект будет
        //находиться от нас на расстоянии 100 метров, то перемещения на 5 метров,
        //мы, возможно, ине заметим уже.
        //
        //varDif - это переменная, которая будет влиять на изменение положения
        //снежинки, таким образом, что чем снежинка меньше, тем медленней её положение
        //будет изменяться.
        varDif = this._xscale/100;
        //Прибавляем к текущей координате _x переменную скорости снежинки, и,
        //изменённую на значение varDif СИЛУ ВЕТРА
        this._x += this.dX+_root.dX*varDif;
        //Аналогично СИЛЕ ВЕТРА выше
        this._y += this.dY+_root.dY*varDif;
        //Если снежинка ушла за ниднюю границу флешки ,то мы удаляем эту снежинку.
        if (this._y>=Stage.height) {
                this.removeMovieClip();
        }
}
//Функция, которая будет периодически создавать новые снежинки.
function snow_func() {
        //Подключаем на глдавную сцену из библиотеки экземпляр снежинки.
        //По оси _y снежинка будет стоять на 30 px выше верхнего края флешки.
        //По оси _x занчение может быть от -75 до ШИРИНА_ФЛЕШКИ + 75, т.е. созданная
        //снежинка может выходить за края флешки по оси _x
        varTarget = _root.attachMovie(“snow_mc”, “snow”+_root.getNextHighestDepth()+“_mc”, _root.getNextHighestDepth(), {_y:-30, _x:-75+Math.random()*(Stage.width+75)});
        //Опредеяем размер снежинки, который будет варьироваться от 25% исходного
        //размера, до 100%
        varTarget._xscale = varTarget._yscale=25+Math.random()*75;
        //Определяем значение собственной скорости снежинки по оси _x. Оно будет
        //варьироваться от -1 до +1
        varTarget.dX = Math.random()*1-Math.random()*1;
        //Определяем скорость падения снежинки. Скоростьпадения будет зависеть от
        //размера снежинки, но никогда не будет меньше 0.5
        varTarget.dY = 0.5+varTarget._xscale/100;
        //Каждый раз при смене кадра, для снежинки будет вызываться функция move_func
        varTarget.onEnterFrame = _root.move_func;
}
//Создаём интервал, вызывающий функцию СОЗДАНИЯ СНЕЖИНОК раз в 75 миллисекунд.
setInterval(snow_func, 75);
//
logo_mc.onRollOver = function() {
};

Если у вас что-то не получилось, то качайте флеш исходник к уроку и смотрите, как сделано там.

Сама флешка »
| Исходник »

Комментарии (7)   Автор: admin
Комментарии
Spaik
24.09.09 | 19:59
0 баллов

Вопрос такого характера. Снег идет поверх слоя, а как можно сделать чтобы был подгружен к примеру еще один обект на новый слой и снег падал позади этого обьекта?

admin
24.09.09 | 20:17
0 баллов

Для этого вам нужно подгружать снег не на _root флешки, а в какой-то другой
клип, пусть это будет клип с именем «snegCont_mc».

Тогда если мы сделаем клип с именем «front_mc» и поместим его впереди клипа
«snegCont_mc» снег будет падать «за» этим объектом.

Надеюсь моё объяснение вам поможет.

Spaik
25.09.09 | 18:12
0 баллов

Задача: снег должен падать за обьектами (беграунд прозрачный)

Что имеем:
а)библиотека
1. logo.png
2. logo_mc
3. snow_mc

б)один слой с actionscript

Stage.scaleMode = "noScale";
_root._quality = "BEST";
_root.attachMovie("logo_mc", "logo2_mc", 2, {_x:372.5, _y:112.5, _alpha:100});
_root.attachMovie("snow_mc", "snow2_mc", 1, {_x:5, _y:5, _alpha:100});
var dX:Number = 0;
var dY:Number = 0.25;
function glob_func() {
        _root.newX = Math.random()*1-Math.random()*1;
        _root.chX = (_root.newX-_root.dX)/(50+random(50));
        clearInterval(_root.x_int);
        _root.x_int = setInterval(function () {
                _root.dX += _root.chX;
                if (Math.round(_root.dX*10)/10 == Math.round(_root.newX*10)/10) {
                        clearInterval(_root.x_int);
                }
        }, 30);
}
setInterval(glob_func, 5000);
function move_func() {
        varDif = this._xscale/100;
        this._x += this.dX+_root.dX*varDif;
        this._y += this.dY+_root.dY*varDif;
        if (this._y>=Stage.height) {
                this.removeMovieClip();
        }
}
function snow_func() {
        varTarget = _root.snow2_mc.attachMovie("snow_mc", "snow"+_root.snow2_mc.getNextHighestDepth(1)+"_mc", _root.snow2_mc.getNextHighestDepth(), {_y:-30, _x:-75+Math.random()*(Stage.width+75)});
        varTarget._xscale = varTarget._yscale=25+Math.random()*75;
        varTarget.dX = Math.random()*1-Math.random()*1;
        varTarget.dY = 0.5+varTarget._xscale/100;
        varTarget.onEnterFrame = _root.move_func;
}
setInterval(snow_func, 75);

Все ли верно прописано в коде. Прошу поправить меня если ошибся, но вроде бы все работает.

getfull
19.12.09 | 10:30
0 баллов

У меня небольшая проблема я хочу сделать анимацию чтоб там падал снег и появлялись надписи типа (С НОВЫМ ГОДОМ итп)Но анимация начинает жутко лагать.

vinaction
11.01.10 | 23:21
0 баллов

Кстате, да! Это беда всех анимашек со снегом?
Откуда такие лаги?

Goldlara
19.01.10 | 14:18
0 баллов

У меня никакие предедущие примеры не работали, не понятно почему. И я сама написала.
Но покакой то причине то, что я насрочила, не показывается по нормальному.

suVrik
04.04.10 | 13:04
0 баллов

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

 
 
 
 

Последние комментарии

Полезные ссылки

Реклама сайтов

Купальники известный марки Amarea
В широком ассортименте мебель для ванной в Вашу квартиру
Сайт о фильмах любых жанров и направлений
проектирование пожаротушения на производстве для обеспечения пожарной безопасности