纯AS3实现Flash炫动背景
纯AS3实现Flash炫动背景,多种可选形状,随机大小(一定范围内),随机位置。背景随鼠标移动滑动。
先看效果截图:
效果示例(全屏浏览):
示例代码:
import Dots; var dot:Dots=new Dots(10,60); stage.addChild(dot);类代码:
package
{
import flash.display.Sprite;
import flash.events.Event;
import flash.events.MouseEvent;
import flash.display.GradientType;
import flash.display.JointStyle;
import flash.display.CapsStyle;
import flash.filters.BlurFilter;
import flash.display.StageAlign;
import flash.display.StageScaleMode;
import flash.display.MovieClip;
import flash.display.DisplayObject;
import flash.geom.Matrix;
public class Dots extends Sprite
{
//层数
public var layers:int;
//每层数量
public var numbers:int;
//大小
public var r:int=50;
public var mr:int=20;
public var bgColor:int;
//大小,不透明度随机范围
public var t:Number=.5;
//颜色
public var c:Array;
//不透明度
public var a:Number=.7;
//倍率
public var m:int= 10;
//缓冲量
public var b=.02;
//当前使用的形状
public var shapFun:String='Heart';
//所有支持的形状
public var shapes:Array=null;
//所有层
private var l:Array=[];
//鼠标位置
private var m_x:Number=0;
private var m_y:Number=0;
//
private var s_w:int=0;
private var s_h:int=0;
private var arrStar:Array=null;
public function Dots(ls:int=10,ns:int=50,bg:int=0x6e0000,cs:Array=null):void
{
layers = ls;
numbers = ns;
c = cs?cs:[0xff0000,0x00ffff,0xff00ff,0x00ff00,0x0000ff,0xffff00];
bgColor = bg;
shapes = ['Circle','Huan','Star','Curen','Heart'];
addEventListener(Event.ADDED_TO_STAGE,init);
addEventListener(Event.REMOVED_FROM_STAGE,term);
}
public function init(e:Event=null):void
{
stage.align = StageAlign.TOP_LEFT;
stage.scaleMode=StageScaleMode.NO_SCALE;
x = 0;
y = 0;
refresh();
stage.addEventListener(MouseEvent.MOUSE_MOVE,startMove);
stage.addEventListener(Event.RESIZE,refresh);
}
//画示例
public function exam(obj:Sprite,type:String,c:uint=0xffffff,w:int=30,h:int=30):void
{
this['draw'+type](obj,Math.min(w,h)*.5,w*.5,h*.5,c,1);
}
private function create():void
{
var cr:int,ca:Number,cc:int,cx:int,cy:int;
var sw=s_w*(m-1),sh=s_h*(m-1);
m_x = .5;
m_y = .5;
graphics.clear();
//画背景
var maxr:Number=(s_w+s_h)*.5;
var mtx:Matrix=new Matrix();
mtx.createGradientBox(maxr,maxr,0,(s_w-maxr)*.5,(s_h-maxr)*.5);
//graphics.beginFill(0xffffff,.3)
graphics.beginGradientFill(GradientType.RADIAL,[bgColor,bgColor,bgColor,bgColor],[1,.9,.3,0],[0,30,180,255],mtx);
graphics.drawCircle(s_w*.5,s_h*.5,maxr*.5);
graphics.endFill();
//画层
for(var i:int=0;i<layers;i++)
{
var tLayer:MovieClip=new MovieClip(),cp=(i+1)/layers,
cr_b:int=mr + (r-mr) * cp,sw_b:int = sw*cp, sh_b:int=sh*cp;
//加模糊滤镜吃内存
//var blurFiler:BlurFilter=new BlurFilter((1-cp)*10,(1-cp)*10,1);
//tLayer.filters=[blurFiler];
for(var j:int=0;j<numbers;j++)
{
if(Math.random()>=.5)
{
cr = cr_b * (1+t*Math.random());
ca = a * (1+t*Math.random());
}else{
cr = cr_b * (1-t*Math.random());
ca = a * (1-t*Math.random());
}
cc = c[Math.floor(Math.random()*c.length)];
cx = (sw_b+s_w)* Math.random();
cy = (sh_b+s_h)* Math.random();
this['draw'+shapFun](tLayer, cr, cx, cy, cc, ca);
}
addChild(tLayer);
tLayer.addEventListener(Event.ENTER_FRAME,moves);
l[i]=tLayer;
}
}
public function term(e:Event=null):void
{
destroy();
stage.removeEventListener(MouseEvent.MOUSE_MOVE,startMove);
stage.removeEventListener(Event.RESIZE,refresh);
}
private function drawCircle(obj, cr, cx, cy, cc, ca):void
{
obj.graphics.lineStyle(1,cc);
obj.graphics.beginFill(cc,ca);
obj.graphics.drawCircle(cx,cy,cr);
obj.graphics.endFill();
}
private function drawHuan(obj, cr, cx, cy, cc, ca):void
{
obj.graphics.lineStyle(cr*.2,cc,ca);
obj.graphics.drawCircle(cx,cy,cr);
obj.graphics.lineStyle(cr*.4,cc,ca*.7);
obj.graphics.drawCircle(cx,cy,cr*.4);
}
//计算五角星的八个长度与外圈半径比
//内圈半径,外圈2,5点x,y 外圈3,4点x,y 内圈1,5点x,y 内圈2,4点x,y
private function calcStar():Array
{
var dgr:Number = 360 * .1 * Math.PI / 180;
var tanDgr:Number=Math.tan(dgr),
sinDgr:Number=Math.sin(dgr),cosDgr:Number=Math.cos(dgr),
cos2Dgr:Number=Math.cos(dgr*2),sin2Dgr:Number=Math.sin(dgr*2);
var ir:Number = cos2Dgr / cosDgr;
var arrReturn:Array=[];
arrReturn[0] = ir;
arrReturn[1] = sin2Dgr;
arrReturn[2] = cos2Dgr;
arrReturn[3] = sinDgr;
arrReturn[4] = cosDgr;
arrReturn[5] = sinDgr * ir;
arrReturn[6] = cosDgr * ir;
arrReturn[7] = sin2Dgr * ir;
arrReturn[8] = cos2Dgr * ir;
return arrReturn;
}
private function drawStar(obj:Sprite, cr:Number, cx:Number, cy:Number, cc:uint, ca:Number):void
{
if(!arrStar)arrStar = calcStar();
obj.graphics.lineStyle(cr*.2,cc,ca,true,null,null,JointStyle.MITER);
//1-1
obj.graphics.moveTo(cx,cy-cr);
//2-1
obj.graphics.lineTo(cx + cr * arrStar[5],cy - cr * arrStar[6]);
//1-2
obj.graphics.lineTo(cx + cr * arrStar[1],cy - cr * arrStar[2]);
//2-2
obj.graphics.lineTo(cx + cr * arrStar[7],cy + cr * arrStar[8]);
//1-3
obj.graphics.lineTo(cx + cr * arrStar[3],cy + cr * arrStar[4]);
//2-3
obj.graphics.lineTo(cx,cy + cr * arrStar[0]);
//1-4
obj.graphics.lineTo(cx - cr * arrStar[3],cy + cr * arrStar[4]);
//2-4
obj.graphics.lineTo(cx - cr * arrStar[7],cy + cr * arrStar[8]);
//1-5
obj.graphics.lineTo(cx - cr * arrStar[1],cy - cr * arrStar[2]);
//2-5
obj.graphics.lineTo(cx - cr * arrStar[5],cy - cr * arrStar[6]);
//回到原点
obj.graphics.lineTo(cx,cy-cr);
}
private function drawCuren(obj:Sprite, cr:Number, cx:Number, cy:Number, cc:uint, ca:Number):void
{
var pr:Number=cr * .2;
obj.graphics.lineStyle(pr,cc,ca);
obj.graphics.drawCircle(cx,cy,cr);
pr = cr * .4;
obj.graphics.lineStyle(pr,cc,ca*.7,false,null,null,JointStyle.MITER);
obj.graphics.drawRect(cx - pr,cy - pr,pr*2, pr*2);
}
private function drawHeart(obj:Sprite, cr:Number, cx:Number, cy:Number, cc:uint, ca:Number):void
{
//画空心
//obj.graphics.lineStyle(cr*.3,cc,ca,true,null,null,JointStyle.MITER);
//画实心
obj.graphics.lineStyle(1,cc)
obj.graphics.beginFill(cc,ca);
obj.graphics.moveTo(cx, cy-cr*.46);
obj.graphics.curveTo(cx + cr*.2,cy - cr*.84,cx + cr*.52,cy - cr*.84);
obj.graphics.curveTo(cx + cr,cy - cr*.84,cx + cr,cy - cr*.22);
obj.graphics.curveTo(cx + cr*.96,cy+cr*.16,cx + cr*.42,cy + cr*.46);
obj.graphics.curveTo(cx + cr*.11,cy+cr*.65,cx,cy + cr*.9); //底部中心点
obj.graphics.curveTo(cx - cr*.11,cy+cr*.65,cx - cr*.42,cy + cr*.46);
obj.graphics.curveTo(cx - cr*.96,cy+cr*.16,cx - cr,cy - cr*.22);
obj.graphics.curveTo(cx - cr,cy - cr*.84,cx - cr*.52,cy - cr*.84);
obj.graphics.curveTo(cx - cr*.2,cy - cr*.84,cx, cy-cr*.46);
//画实心
obj.graphics.endFill();
}
public function moves(e:Event):void
{
var fmx=0,fmy=0,mv=e.target;
var cw:Number = (s_w-mv.width) * m_x;
fmx = mv.x;
mv.x=fmx + (cw - fmx)*b;
var ch:Number = (s_h-mv.height) * m_y;
fmy = mv.y;
mv.y=fmy + (ch - fmy)*b;
}
public function startMove(e:MouseEvent):void
{
//trace('start!');
m_x = e.stageX/s_w;
m_y = e.stageY/s_h;
}
private function destroy():void
{
var cc:DisplayObject=null;
while(numChildren>0)
{
cc=getChildAt(0);
if(cc.hasEventListener(Event.ENTER_FRAME)){
cc.removeEventListener(Event.ENTER_FRAME,moves);
}
removeChildAt(0);
}
}
public function refresh(e:Event=null):void
{
s_w = stage.stageWidth;
s_h = stage.stageHeight;
destroy();
create();
}
}
}