游动的鱼AS3

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、Rippler
package 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

    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值