除雾特效

最近玩了一个游戏,里面有个特效,就像是玻璃上面有一层雾,然后鼠标移动可以擦除这些雾看清楚雾后面的内容。如图:

感觉这种效果挺有趣的,于是就做了一个DEMO。代码如下:


package
{
	import flash.display.BlendMode;
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.events.MouseEvent;
	
	import flashx.textLayout.formats.BackgroundColor;
	
	[SWF(backgroundColor="#cccccc")]
	public class BlendModeTest extends Sprite
	{
		[Embed(source="back.jpg")]
		private var Back:Class;
		
		private var crtCircleList:Array = [];
		private var returnCircleList:Array = [];
		private var erase:Sprite;
		public function BlendModeTest()
		{
			super();
			addChild(new Back());
			//加入遮罩层
			var maskLayer:Sprite = new Sprite();
			addChild(maskLayer);
			maskLayer.blendMode = BlendMode.LAYER;
			//加入遮挡
			var mask:Sprite = new Sprite();
			mask.graphics.beginFill(0xFFFFFF, 0.8);
			mask.graphics.drawRect(0,0,stage.stageWidth, stage.stageHeight);
			mask.graphics.endFill();
			maskLayer.addChild(mask);
			//加入擦除层
			erase = new Sprite();
			erase.blendMode = BlendMode.ERASE;
			maskLayer.addChild(erase);
			//添加监听
			stage.addEventListener(MouseEvent.MOUSE_DOWN, onMouseDownHd);
			stage.addEventListener(MouseEvent.MOUSE_UP, onMouseUpHd);
			addEventListener(Event.ENTER_FRAME, onEnterFrame);
		}
		
		private function onMouseDownHd(e:MouseEvent):void
		{
			stage.addEventListener(MouseEvent.MOUSE_MOVE, onMouseMoveHd);
		}
		
		private function onMouseUpHd(e:MouseEvent):void
		{
			stage.removeEventListener(MouseEvent.MOUSE_MOVE, onMouseMoveHd);
		}
		
		private function onMouseMoveHd(e:MouseEvent):void
		{
			var cc:Circle;
			if(returnCircleList.length > 0){
				cc = returnCircleList.pop();
				cc.init();
			}else{
				cc = new Circle();
			}
			cc.x = mouseX;
			cc.y = mouseY;
			crtCircleList.push(cc);
			erase.addChild(cc);
		}
		
		private function onEnterFrame(e:Event):void
		{
			var cc:Circle;
			for(var i:int = 0; i<crtCircleList.length; i++){
				cc = crtCircleList[i];
				cc.render();
				if(cc.alpha <= 0){
					erase.removeChild(cc);
					returnCircleList.push(crtCircleList.splice(i, 1)[0]);
					i--;
				}
			}
		}
	}
}
import flash.display.GradientType;
import flash.display.Sprite;
import flash.geom.Matrix;

/**
 *创建一个渐变圆 
 * @author AresLee
 * 
 */
class Circle extends Sprite
{
	public function Circle( ):void
	{
		var cs:Array = [0xFFFFFF, 0xFFFFFF];
		var als:Array = [1, 0];
		var ras:Array = [100, 200];

		this.graphics.beginGradientFill(GradientType.RADIAL, cs, als, ras);
		this.graphics.drawCircle(0,0,80);
		this.graphics.endFill();
	}
	
	public function init( ):void
	{
		this.alpha = 1;
	}
	
	public function render( ):void
	{
		if(this.alpha > 0){
			this.alpha -= 0.01;
		}
	}
}

其核心思想就是用到了Blendmode里面的erase效果。

1、添加背景图片到舞台

2、创建一个渐变的形状

3、添加遮挡层,用来包含遮挡图和擦除层,blendmode设置为layer

4、添加遮挡的图形

5、添加擦除层,blendmode设置为ereas

6、鼠标移动的时候,不断创建渐变形状,为了避免大量创建,事例用了对象池

7、每帧不断降低创建出来的渐变形状的alpha值

8、当alpha为0时回收对象。


由于不知道博客如何插入swf文件所以看不了效果啦。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值