1、index主类
package {
import flash.display.MovieClip;
import flash.display.Sprite;
import be.nascom.flash.graphics.Rippler;
import flash.events.Event;
import flash.events.MouseEvent;
public class index extends Sprite {
public var bgmc: MovieClip
private var _rippler: Rippler;
private var fishNum: int = 1;
public function index() {
//舞台出现时的监听方法
this.addEventListener(Event.ADDED_TO_STAGE, initMethod);
}
private function initMethod(e: Event): void {
stage.scaleMode = "noScale";
_rippler = new Rippler(bgmc, 40, 10);
addfishs();
}
private function addfishs(): void {
var i: int = 0;
var yu: fish5;
while (i < fishNum) {
yu = new fish5(_rippler);
addChild(yu);
i++;
}
}
}
}
2、鱼类Class
package
{
import flash.display.*;
import flash.events.*;
import flash.geom.*;
import be.nascom.flash.graphics.Rippler;
/**
*/
dynamic public class fish5 extends MovieClip
{
public var IsTouch:Boolean;
public var targetX:Number;
public var targetY:Number;
private var linePt:Point;//jjw++
//mc...
public var head:MovieClip;//头部
public var link0:MovieClip;//身段+鱼翅
public var link1:MovieClip;//身段1
public var link2:MovieClip;//身段2
public var link3:MovieClip;//身段3
public var link4:MovieClip;//身段4
public var link5:MovieClip;//尾部
public var pdf:MovieClip;//引导1
public var pdp:MovieClip;//引导2
public var pl:MovieClip;//引导3
//
private var ripler:Rippler;
public function fish5(rip:Rippler)
{
ripler = rip;
//为MovieClip及其子类添加脚本代码 其中0表示第一帧
addFrameScript(0, frame1);
return;
}
/**
* 初始化init...
*/
private function frame1()
{
IsTouch = false;
linePt = new Point(0, 0);
targetX = Math.random() * stage.stageWidth;
targetY = Math.random() * stage.stageHeight;
pl.addEventListener(Event.ENTER_FRAME, plupdate);
this.addEventListener(Event.ENTER_FRAME, thisupdate);
this.addEventListener(MouseEvent.CLICK, MouseEventHandle);
pl.visible = false;
pdf.visible = false;
pdp.visible = false;
return;
}
//pl的帧频事件
public function plupdate(param1:Event)
{
if (int(Math.random() * 100) == 99 || IsTouch)
{
targetX = Math.random() * stage.stageWidth;
targetY = Math.random() * stage.stageHeight;
fsMove(pl, 0.8, 0.8, targetX, targetY);
IsTouch = false;
ripler.drawRipple(link3.x, link3.y, 50, 1);
return;
}
fsMove(pl, 0.1, 0.1, targetX, targetY);
return;
}
//帧频事件
public function thisupdate(param1:Event)
{
pdf.rotation = Math.atan2(pl.y - head.y, pl.x - head.x) * 180 / 3.14159;
fsMove(pdf, 0.4, 0.4, pl.x, pl.y);
pdp.x = pdf.getChildByName("pd").localToGlobal(linePt).x;
pdp.y = pdf.getChildByName("pd").localToGlobal(linePt).y;
//头部运动
head.rotation = Math.atan2(pdp.y - head.y, pdp.x - head.x) * 180 / 3.14159;
fsMove(head, 0.04, 0.04, pdp.x, pdp.y);
//鱼翅断运动
rotateBD(link0, head);
link0.x = head.getChildByName("end").localToGlobal(linePt).x;
link0.y = head.getChildByName("end").localToGlobal(linePt).y;
//其他身段运动
lineToLink(linePt); //jjw++
}
private function lineToLink(pt:Point):void {
var index:int = 1;
var obj1:MovieClip;
var obj2:MovieClip;
while (index < 6) {
obj1 = this["link" + index]as MovieClip;
obj2 = this["link" + (index - 1)]as MovieClip;
rotateBD(obj1, obj2);
obj1.x = obj2.getChildByName("end").localToGlobal(pt).x;
obj1.y = obj2.getChildByName("end").localToGlobal(pt).y;
index++;
}return;
}
/**
* 各身段旋转度计算
* @param param1
* @param param2
*/
private function rotateBD(param1:MovieClip, param2:MovieClip)
{
var _loc_3:MovieClip = param1;
_loc_3.rotation = Math.atan2(param2.y - _loc_3.y, param2.x - _loc_3.x) * 180 / 3.14159;
return;
}
/**
*
* @param param1
* @param param2
* @param param3
* @param param4
* @param param5
*/
private function fsMove(param1:MovieClip, param2:Number, param3:Number, param4:Number, param5:Number)
{
param1.x = param1.x + param2 * (param4 - param1.x);
param1.y = param1.y + param3 * (param5 - param1.y);
return;
}
//自定义方法================================
private function MouseEventHandle(e: MouseEvent): void {
ripler.drawRipple(link3.x, link3.y, 50, 1);
IsTouch = true;
return;
}
}
}
3、Ripplerpackage be.nascom.flash.graphics
{
import flash.display.*;
import flash.events.*;
import flash.filters.*;
import flash.geom.*;
public class Rippler extends Object
{
private var _colourTransform:ColorTransform;
private var _origin:Point;
private var _source:DisplayObject;
private var _defData:BitmapData;
private var _expandFilter:ConvolutionFilter;
private var _filter:DisplacementMapFilter;
private var _scaleInv:Number;
private var _drawRect:Rectangle;
private var _matrix:Matrix;
private var _buffer1:BitmapData;
private var _buffer2:BitmapData;
private var _fullRect:Rectangle;
public function Rippler(param1:DisplayObject, param2:Number, param3:Number = 2)
{
var _loc_4:Number;
var _loc_5:Number;
_origin = new Point();
_source = param1;
_scaleInv = 1 / param3;
_buffer1 = new BitmapData(param1.width * _scaleInv, param1.height * _scaleInv, false, 0);
_buffer2 = new BitmapData(_buffer1.width, _buffer1.height, false, 0);
_defData = new BitmapData(param1.width, param1.height);
_loc_4 = _defData.width / _buffer1.width;
_loc_5 = _defData.height / _buffer1.height;
_fullRect = new Rectangle(0, 0, _buffer1.width, _buffer1.height);
_drawRect = new Rectangle();
_filter = new DisplacementMapFilter(_buffer1, _origin, BitmapDataChannel.BLUE, BitmapDataChannel.BLUE, param2, param2, "wrap");
_source.filters = [_filter];
_source.stage.addEventListener(Event.ENTER_FRAME, handleEnterFrame);
_expandFilter = new ConvolutionFilter(3, 3, [0.5, 1, 0.5, 1, 0, 1, 0.5, 1, 0.5], 3);
_matrix = new Matrix(_loc_4, 0, 0, _loc_5);
_colourTransform = new ColorTransform(1, 1, 1, 1, 127, 127, 127);
return;
}// end function
public function destroy() : void
{
_source.stage.removeEventListener(Event.ENTER_FRAME, handleEnterFrame);
_buffer1.dispose();
_buffer2.dispose();
_defData.dispose();
return;
}// end function
public function drawRipple(param1:int, param2:int, param3:int, param4:Number) : void
{
var _loc_5:* = param3 >> 1;
var _loc_6:* = (param4 * 255 & 255) * param4;
_drawRect.x = (-_loc_5 + param1) * _scaleInv;
_drawRect.y = (-_loc_5 + param2) * _scaleInv;
var _loc_7:* = param3 * _scaleInv;
_drawRect.height = param3 * _scaleInv;
_drawRect.width = _loc_7;
_buffer1.fillRect(_drawRect, _loc_6);
return;
}// end function
private function switchBuffers() : void
{
var _loc_1:BitmapData;
_loc_1 = _buffer1;
_buffer1 = _buffer2;
_buffer2 = _loc_1;
return;
}// end function
private function handleEnterFrame(param1:Event) : void
{
var _loc_2:* = _buffer2.clone();
_buffer2.applyFilter(_buffer1, _fullRect, _origin, _expandFilter);
_buffer2.draw(_loc_2, null, null, BlendMode.SUBTRACT, null, false);
_defData.draw(_buffer2, _matrix, _colourTransform, null, null, true);
_filter.mapBitmap = _defData;
_source.filters = [_filter];
switchBuffers();
return;
}// end function
}
}