今天抽了点时间做了一个比较简单的实验,就是通过遮罩来实现一道光划过的效果。在flash 可以通过遮罩层来实现遮罩光效,简单实用,下面无聊写了一个比较简单的东西。实现简单的发光,不过,光效并不强烈,总是缺少一点什么。
package
{
import flash.display.Sprite;
import flash.display.DisplayObject;
import flash.utils.Timer;
import flash.events.TimerEvent;
import flash.display.Bitmap;
import flash.display.Shape;
import flash.display.BitmapData;
import flash.filters.GlowFilter;
import flash.geom.ColorTransform;
import flash.display.BlendMode;
import flash.events.Event;
import flash.geom.*;
public class LightEffect
{
private var timer:Timer;
private var glowShape:Shape;
private var speed:Number;
private var initSpeed:Number;
private var maxLen:int;
private var isFinish:Boolean = false;
public var a:Number = 0.12;
private var bitmap:Bitmap;
public var init_a:Number=0.12;
public function LightEffect(delay:Number,speed:Number)
{
timer = new Timer(delay);
this.speed = speed;
this.initSpeed = speed;
timer.addEventListener(TimerEvent.TIMER,onTimer);
}
private function onTimer(event:TimerEvent):void
{
if (isFinish==false)
{
isFinish = true;
glowShape.addEventListener(Event.ENTER_FRAME,onMoveGlow);
}
}
private function onMoveGlow(event:Event):void
{
glowShape.x += speed;
speed -= a;
if (glowShape.rotation != 0)
{
glowShape.y += speed;
if (glowShape.x > maxLen + 20)
{
glowShape.x = 0;
glowShape.y = 0;
isFinish = false;
a = init_a;
speed = initSpeed;
glowShape.removeEventListener(Event.ENTER_FRAME,onMoveGlow);
}
}
else
{
if (glowShape.x > maxLen + 10)
{
glowShape.x = - glowShape.width;
isFinish = false;
a = init_a;
speed = initSpeed;
glowShape.removeEventListener(Event.ENTER_FRAME,onMoveGlow);
}
}
}
//设置发光对象
public function setTargetGlow(displayObject:Sprite,rotation:Number,mask_W:Number=0,mask_H:Number=0):void
{
var container:Sprite=new Sprite();
var copyBmp:BitmapData = new BitmapData(displayObject.width,displayObject.height,true,0x0);
copyBmp.draw(displayObject);
bitmap = new Bitmap(copyBmp);
bitmap.blendMode = BlendMode.SCREEN;
this.maxLen = bitmap.width;
container.addChild(bitmap);
glowShape=new Shape();
glowShape.graphics.beginFill(0xffffff);
if (rotation!=0)
{
glowShape.rotation = rotation;
var w:Number = mask_W == 0 ? displayObject.width / 6:mask_W;
var h:Number = mask_H == 0 ? displayObject.height:mask_H;
glowShape.graphics.drawRect(-w/2,-h/2,w,h);
}
else
{
glowShape.graphics.drawRect(0,0,displayObject.width/4,displayObject.height);
}
glowShape.graphics.endFill();
glowShape.cacheAsBitmap = true;
bitmap.cacheAsBitmap = true;
container.addChild(glowShape);
bitmap.mask = glowShape;
displayObject.addChild(container);
timer.start();
}
//停止发光
public function stopGlow():void
{
timer.stop();
}
//移除效果
public function removeListener():void
{
timer.stop();
glowShape.removeEventListener(Event.ENTER_FRAME,onMoveGlow);
timer.removeEventListener(TimerEvent.TIMER,onTimer);
timer = null;
}
}
}
//调用 即可,mc 为舞台设置的影片剪辑参考了游戏http://www.shengshiyouxi.com的图片非常感谢!
var effect:LightEffect=new LightEffect(80,6);
effect.setTargetGlow(mc,45,mc.width/8,mc.height+30);
由于设置一个减速的过程,可以修改这个 程序 让对加速度的值符合动画所需,当中会存在一个不完善的地方,例如遮罩后的光面,没想想象那么强烈,在实验的时候会存在这些疑惑.等等。
package
{
import flash.display.Sprite;
import flash.display.DisplayObject;
import flash.utils.Timer;
import flash.events.TimerEvent;
import flash.display.Bitmap;
import flash.display.Shape;
import flash.display.BitmapData;
import flash.filters.GlowFilter;
import flash.geom.ColorTransform;
import flash.display.BlendMode;
import flash.events.Event;
import flash.geom.*;
public class LightEffect
{
private var timer:Timer;
private var glowShape:Shape;
private var speed:Number;
private var initSpeed:Number;
private var maxLen:int;
private var isFinish:Boolean = false;
public var a:Number = 0.12;
private var bitmap:Bitmap;
public var init_a:Number=0.12;
public function LightEffect(delay:Number,speed:Number)
{
timer = new Timer(delay);
this.speed = speed;
this.initSpeed = speed;
timer.addEventListener(TimerEvent.TIMER,onTimer);
}
private function onTimer(event:TimerEvent):void
{
if (isFinish==false)
{
isFinish = true;
glowShape.addEventListener(Event.ENTER_FRAME,onMoveGlow);
}
}
private function onMoveGlow(event:Event):void
{
glowShape.x += speed;
speed -= a;
if (glowShape.rotation != 0)
{
glowShape.y += speed;
if (glowShape.x > maxLen + 20)
{
glowShape.x = 0;
glowShape.y = 0;
isFinish = false;
a = init_a;
speed = initSpeed;
glowShape.removeEventListener(Event.ENTER_FRAME,onMoveGlow);
}
}
else
{
if (glowShape.x > maxLen + 10)
{
glowShape.x = - glowShape.width;
isFinish = false;
a = init_a;
speed = initSpeed;
glowShape.removeEventListener(Event.ENTER_FRAME,onMoveGlow);
}
}
}
//设置发光对象
public function setTargetGlow(displayObject:Sprite,rotation:Number,mask_W:Number=0,mask_H:Number=0):void
{
var container:Sprite=new Sprite();
var copyBmp:BitmapData = new BitmapData(displayObject.width,displayObject.height,true,0x0);
copyBmp.draw(displayObject);
bitmap = new Bitmap(copyBmp);
bitmap.blendMode = BlendMode.SCREEN;
this.maxLen = bitmap.width;
container.addChild(bitmap);
glowShape=new Shape();
glowShape.graphics.beginFill(0xffffff);
if (rotation!=0)
{
glowShape.rotation = rotation;
var w:Number = mask_W == 0 ? displayObject.width / 6:mask_W;
var h:Number = mask_H == 0 ? displayObject.height:mask_H;
glowShape.graphics.drawRect(-w/2,-h/2,w,h);
}
else
{
glowShape.graphics.drawRect(0,0,displayObject.width/4,displayObject.height);
}
glowShape.graphics.endFill();
glowShape.cacheAsBitmap = true;
bitmap.cacheAsBitmap = true;
container.addChild(glowShape);
bitmap.mask = glowShape;
displayObject.addChild(container);
timer.start();
}
//停止发光
public function stopGlow():void
{
timer.stop();
}
//移除效果
public function removeListener():void
{
timer.stop();
glowShape.removeEventListener(Event.ENTER_FRAME,onMoveGlow);
timer.removeEventListener(TimerEvent.TIMER,onTimer);
timer = null;
}
}
}
//调用 即可,mc 为舞台设置的影片剪辑参考了游戏http://www.shengshiyouxi.com的图片非常感谢!
var effect:LightEffect=new LightEffect(80,6);
effect.setTargetGlow(mc,45,mc.width/8,mc.height+30);
由于设置一个减速的过程,可以修改这个 程序 让对加速度的值符合动画所需,当中会存在一个不完善的地方,例如遮罩后的光面,没想想象那么强烈,在实验的时候会存在这些疑惑.等等。