Не помню уже где нашел в сети скрипт на actionscript 2 для анимации волн (эффект ряби), решил переписать его для as3.
Результат работы можно увидеть ниже.
Для использования надо просто создать мувик с нужной картинкой,
присвоить ему класс asflash.Wave
и поместить его на сцену.
Скорость и направление ряби задается параметром в вызове функции makeWave(-0.1), знак отвечает за направление, значение за скорость волн.
Эффект волн (ряби) на actionscript3 для flash
Класс Wave - Wave.as
package asflash
{
/**
* ...
* @author andrew
* @web http://as-flash.blogspot.com
*/
import flash.display.*;
import flash.geom.*;
import flash.filters.*;
import flash.utils.*;
import flash.events.*;
public class Wave extends MovieClip
{
private var w:Number;
private var h:Number;
private var ripple:BitmapData;
private var ripple3:BitmapData;
private var ripple2:BitmapData;
private var ripple1:BitmapData;
private var gradient:BitmapData;
private var gradient_mc:BitmapData;
private var offset3:Point;
private var offset2:Point;
private var offset1:Point;
private var speed1:Number;
private var speed2:Number;
private var speed3:Number;
private var pt:Point;
private var rect:Rectangle;
private var dMap:DisplacementMapFilter;
private var r1pt:Point;
private var r2pt:Point;
private var r3pt:Point;
private var r1rect:Rectangle;
private var r2rect:Rectangle;
private var r3rect:Rectangle;
private var seed:Number;
public function Wave()
{
makeWave(-0.1);
}
public function makeWave(str=-0.1)
{
w = this.width;
h = this.height;
ripple = new flash.display.BitmapData(w, h);
ripple3 = new flash.display.BitmapData(w, h / 2);
ripple2 = new flash.display.BitmapData(w, h / 4);
ripple1 = new flash.display.BitmapData(w, h / 4);
gradient = new flash.display.BitmapData(ripple.width, ripple.height);
gradient.draw(gradient, new flash.geom.Matrix(1, 0, 0, 1, 0, 0));
offset3 = new flash.geom.Point(0, 0);
offset2 = new flash.geom.Point(0, 0);
offset1 = new flash.geom.Point(0, 0);
speed1 = 1*str;
speed2 = 2*str;
speed3 = 4*str;
pt = new flash.geom.Point(0, 0);
rect = new flash.geom.Rectangle(0, 0, ripple.width, ripple.height);
this.addEventListener(Event.ENTER_FRAME, showWave);
r1rect = new flash.geom.Rectangle(0, 0, ripple1.width, ripple1.height);
r2rect = new flash.geom.Rectangle(0, 0, ripple2.width, ripple2.height);
r3rect = new flash.geom.Rectangle(0, 0, ripple3.width, ripple3.height);
r1pt = new flash.geom.Point(0, 0);
r2pt = new flash.geom.Point(0, ripple1.height);
r3pt = new flash.geom.Point(0, ripple1.height + ripple2.height);
}
private function showWave(e:Event)
{
offset1.y = offset1.y + speed1;
offset2.y = offset2.y + speed2;
offset3.y = offset3.y + speed3;
seed = 0;
ripple3.perlinNoise(0, 12, 1, seed, true, true, 1, true, [offset3]);
ripple2.perlinNoise(0, 8, 1, seed, true, true, 1, true, [offset2]);
ripple1.perlinNoise(0, 4, 1, seed, true, true, 1, true, [offset1]);
ripple.copyPixels(ripple1, r1rect, r1pt);
ripple.copyPixels(ripple2, r2rect, r2pt);
ripple.copyPixels(ripple3, r3rect, r3pt);
ripple.merge(gradient, rect, pt, 127, 127, 127, 127);
dMap = new flash.filters.DisplacementMapFilter(ripple, pt, 0, 1, 100, 100, DisplacementMapFilterMode.WRAP);
this.filters = [dMap];
};
}
}
Wave.as в папку с fla ложить?
ОтветитьУдалитьСоздать в папке с фла папку asflash и положить в нее. Класс для флешки asflash.Wave
ОтветитьУдалитьа точно). Спасибо!
ОтветитьУдалитьКрасота!
ОтветитьУдалитьВпечетляет, красота)). Спасибо. Пригодится
ОтветитьУдалить