flash 与动画:发光实现

来源:互联网 发布:贴吧推广淘宝店铺 编辑:程序博客网 时间:2024/05/20 20:22
今天抽了点时间做了一个比较简单的实验,就是通过遮罩来实现一道光划过的效果。在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);
   由于设置一个减速的过程,可以修改这个程序让对加速度的值符合动画所需,当中会存在一个不完善的地方,例如遮罩后的光面,没想想象那么强烈,在实验的时候会存在这些疑惑.等等。
原创粉丝点击