原文链接:http://www.longsihao.com/?p=56
下面我来介绍下,我们玩游戏的时候经常会看到有些技能释放后有一定的冷却时间的,就好像有一个阴影围着那个技能转圈圈一样,当圈圈转完之后技能又可以释放了,这个在AS3中怎么才能实现呢?
参考:http://bbs.9ria.com/thread-67903-1-1.html
其实很简单,主要是mask和graphics方法就可以实现,详细代码如下:
package
{
import flash.display.Bitmap;
import flash.display.Loader;
import flash.display.LoaderInfo;
import flash.display.Sprite;
import flash.events.Event;
import flash.net.URLRequest;
public class CDTimeSample extends Sprite
{
private var cdMask :CDMask;
public function CDTimeSample()
{
init();
}
private function init():void
{
loadImg();
}
private function loadImg():void
{
var imgLoader :Loader = new Loader();
var url:String = "http://www.longsihao.com/wp-content/uploads/2011/CDMaskSample/YP2.jpg";
imgLoader.contentLoaderInfo.addEventListener(Event.COMPLETE,imgLoaderHandler);
imgLoader.load(new URLRequest(url));
}
private function imgLoaderHandler(e:Event):void
{
var imgBMP :Bitmap = (((e.target) as LoaderInfo).content as Bitmap);
cdMask = new CDMask(imgBMP.bitmapData);
addChild(cdMask);
}
}
}
CDMask
package
{
import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.display.Shape;
import flash.display.Sprite;
import flash.events.Event;
import flash.events.MouseEvent;
import flash.filters.ColorMatrixFilter;
import flash.utils.getTimer;
/**冷却时间遮罩类
* */
public class CDMask extends Sprite
{
private var icon :Bitmap; //图标
private var cdMask :Sprite; //冷却时间遮罩
private var currentAngle :Number; //当前的角度
private var speed :Number; //CD时间速度
private var radius :Number; //遮罩半径
private var background :Bitmap; //背景图
private var startTime :Number; //开始时间
private var totalTime :Number = 1000; //CD冷却时间,1秒
public function CDMask(BMD :BitmapData)
{
super();
this.icon = new Bitmap(BMD);
this.background = new Bitmap(BMD);
this.background.filters = [new ColorMatrixFilter([1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,1,0])]; //灰色滤镜数组
addChild(background);
addChild(icon);
this.addEventListener(MouseEvent.CLICK, startCDHandler);
}
private function startCDHandler(e:MouseEvent):void
{
startTime = getTimer(); //开始获取时间
cdMask = new Sprite();
this.addChild(cdMask);
icon.mask = cdMask;
currentAngle = 0;
speed = 1;
radius = Math.sqrt(this.width/2 * this.width/2 + this.height/2 * this.height/2); //遮罩半径,勾股定理,你们都懂的
cdMask.x = this.width/2;
cdMask.y = this.height/2;
cdMask.graphics.beginFill(0);
cdMask.graphics.lineTo(radius,0);
cdMask.addEventListener(Event.ENTER_FRAME , efHandler);
removeEventListener(MouseEvent.CLICK,startCDHandler);
}
private function efHandler(e:Event):void
{
var postTime :Number = getTimer() - startTime; //程序运行到这里的时间-开始的时间
currentAngle += speed;
if(postTime <= totalTime)
{
var currAngle:Number = 2 * Math.PI * ( postTime / totalTime );//根据经过时间算出弧度
var toX :Number = radius * Math.cos(currAngle);
var toY :Number = radius * Math.sin(currAngle);
cdMask.graphics.lineTo(toX,toY);
}else
{
if (this.contains(cdMask))
{
this.removeChild(cdMask);
icon.mask = null;
this.addEventListener(MouseEvent.CLICK, startCDHandler);
removeEventListener(Event.ENTER_FRAME, efHandler);
}
}
}
}
}