В уроке разбирается, как можно в 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() {
};
Если у вас что-то не получилось, то качайте флеш исходник к уроку и смотрите, как сделано там.
Сама флешка » | Исходник » |
Вопрос такого характера. Снег идет поверх слоя, а как можно сделать чтобы был подгружен к примеру еще один обект на новый слой и снег падал позади этого обьекта?
Для этого вам нужно подгружать снег не на _root флешки, а в какой-то другой
клип, пусть это будет клип с именем «snegCont_mc».
Тогда если мы сделаем клип с именем «front_mc» и поместим его впереди клипа
«snegCont_mc» снег будет падать «за» этим объектом.
Надеюсь моё объяснение вам поможет.
Задача: снег должен падать за обьектами (беграунд прозрачный)
Что имеем:
а)библиотека
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);Все ли верно прописано в коде. Прошу поправить меня если ошибся, но вроде бы все работает.
У меня небольшая проблема я хочу сделать анимацию чтоб там падал снег и появлялись надписи типа (С НОВЫМ ГОДОМ итп)Но анимация начинает жутко лагать.
Кстате, да! Это беда всех анимашек со снегом?
Откуда такие лаги?
У меня никакие предедущие примеры не работали, не понятно почему. И я сама написала.
Но покакой то причине то, что я насрочила, не показывается по нормальному.
жутко лагает потому что большая нагрузка на процессор, можно к примеру изменить количество хлопьев, и лагать будет меньше.
А как остановить снег в конце ролика?
Я бы, кстати, в исходнике заменил строку 57 с
if (this._y>=Stage.height) {на
if (this._y>=Stage.height+this._height) {чтобы снег неожиданно не исчезал в низу ролика.
Спабо за пример, очень хорошая анимация снега, и все так как остановить его в конце ролика?
Если еще кому-то актуально, нашла способ остановить снег в конце ролика.
Нужно строчку
setInterval(snow_func, 75);которая почти в самом конце скрипта, заменить на строчку
var myInterval = setInterval(snow_func, 75);а в том кадре, где нужно остановить снег нужно написать строчку
clearInterval(myInterval);тогда новые снежинки перестанут появляться и снег постепенно закончит идти
А у меня почему то не получается, исходник загрузил- все работает прекрасно, а если копирую код в новый файл, создаю в библиотеке символ(копирую прямо)snow_mc, выдает кучу ошибок при компиляции, все не перечислить, верхние
1120: Access of undefined property _root. на 13ю строчку, потому на 16ю такая же ошибка и т.д.
Все вроде делаю как у вас написано! Подскажите может что не так?(( заранее спасибо
Все, разобрался, у меня был документ создан AS3, а мануал для AS2 написан)) Спасибо большое за урок!=)
А как всё это на ActionScript 3 сделать?
Всем привет)
Если модераторы позволят, то хотелось бы тут разместить ссылку на свой видеоурок по данному сабжу. Применить сможет любой, кто хотя бы немного знаком с Adobe Flash (в принципе даже уметь кодить не обязательно, хотя эффект создатеся на AS3.0).
Собстно вот ссылка: http://redflasher.ru/blog/kak-sdelat-novogodnij-banner-za-5-minut/
redflasher@yandex.ru, сайт умер.
Очень жаль, серьёзно..