PDA

Просмотр полной версии : Помогите остановить анимацию снега!


vlad2
26.03.2013, 13:28
Помогите остановить анимацию снега в определенном кадре!

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() {
};

исходник снега
29317

Hauts
26.03.2013, 14:13
var interval = setInterval(...)
clearInterval(interval)

P.S. Белый снег на белом фоне чудесно выглядит.

vlad2
27.03.2013, 08:22
var interval = setInterval(...)
clearInterval(interval)

Что-то у меня вообще ничего не получается :(

dark256
27.03.2013, 10:30
Stage.scaleMode = "noScale";

var dX:Number = 0; //Это ветер (ускорение по оси X)
var dY:Number = 0.25; //Это притяжение/гравитация (по оси Y);

var wind
var snow
var x_int

function recalcWind(){
_root.dX += _root.chX;
if (Math.round(_root.dX*10)/10 == Math.round(_root.newX*10)/10) clearInterval(x_int);
}

function glob_func() {
_root.newX = Math.random()*1-Math.random()*1;
_root.chX = (_root.newX-_root.dX)/(50+random(50));
clearInterval(x_int);
x_int = setInterval( recalcWind, 30);
}

//Создаём функцию движения снежинок
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.attachMovie("snow_mc", "snow"+_root.getNextHighestDepth()+"_mc", _root.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;
}

function allStart(){
//Создаём интервал, который будет вызывать функцию изменения СИЛЫ ВЕТРА один раз в 5 секунд.
wind = setInterval( glob_func, 5000 );
//Создаём интервал, вызывающий функцию СОЗДАНИЯ СНЕЖИНОК раз в 75 миллисекунд.
snow = setInterval(snow_func, 75);
}


function allStop(){
clearInterval(snow)
clearInterval(wind)
clearInterval(x_int)

for( var T in _root ){
var SN = _root[T]
if ( SN.indexOf("snow")>=0 ){
delete SN.onEnterFrame
}
}
}


btn_play.onRelease = allStart
btn_stop.onRelease = allStop

Каждой снежинке надо прибить ее onEnterFrame.
Если клип на ROOT имеет сигнатуру имени снежинки "SN.indexOf("snow")>=0", прибиваем энтерфрэйм.
Можно все снежинки держать в массиве, удаля их оттуда и добавляя, но для простоты сделано так.

Если посмотрите на код, то увидите, что _root вообще не надо использовать. В данном случае обращение к переменной, объявленной вне функции, происходит как к глобальной.

recalcWind() - вынес функцию в явную неанонимную. незачем тут это пихать в параметры. Это вообще уже некрасиво и нечитаемо.

vlad2
27.03.2013, 15:27
Вот спасибо dark256, сейчас буду разбираться!

Добавлено через 17 часов 38 минут
А вы можете вложить исходник на свой вариант кода. Почему-то у меня он отказывается работать :(