移植到AS3
很喜欢火焰的效果,所以把LZ的代码移植到了AS3下。
四个文件:一个是显示用的Fla,三个是AS,放到FireWorks子文件夹下。
Fire.Fla就一帧,内容为Code:
import FireWorks.Fire;
var F:Fire=new Fire(0,150);
addChild(F);
F.visible=true;
F.x=stage.stageWidth/2;
F.y=stage.stageHeight/2;
FlameBall.as:
package FireWorks{
import flash.display.Sprite;
import flash.geom.Matrix;
public class FlameBall extends Sprite {
private var Radius:Number=20;
private var Alpha:Number=40;
public function FlameBall():void {
var matrix:Matrix=new Matrix();
var colors:Array=[0xFFFF00,0xFFFF00];
var alphas:Array=[Alpha,0];
var ratios:Array=[0,0xFF];
matrix.createGradientBox(Radius*2,Radius*2,0,-Radius,-Radius);
this.graphics.beginGradientFill("radial",colors,alphas,ratios,matrix);
this.graphics.moveTo(0,0);
this.graphics.drawCircle(0,0,Radius);
this.graphics.endFill();
}
}
}
Flame.as:
package FireWorks{
import flash.display.Sprite;
import flash.geom.Matrix;
import flash.geom.ColorTransform;
import flash.utils.*;
public class Flame extends Sprite {
public static var Velocity:Number=100;//火焰上升速度
public static var VelocityRange:Number=50;//火焰上升速度浮动
public static var Scale:Number=1;//火焰初始最大比率
public static var Alpha:Number=0.5;//火焰初始透明度
public static var ShiftVelocity:Number=0.6;
public static var SizeMin:Number=2;
public static var SizeRange:Number=10;
public static var ScaleMin:Number=0.05;
private var flameball:FlameBall;
private var g:int=255;//当前绿色分量
private var a:Number=Alpha;//当前透明度
private var Shift:Number;//描述的火焰扩散范围,即初始横向偏移量
private var Direct:int=(Math.random()>0.5)?1:-1;//1表示右,-1表示左
private var Size:Number;//描述了不同范围火焰的增长速度
private var Control:Number=ShiftVelocity;//控制方向转向和缩放速度的变量;
private var ColorChange:int;//颜色变化速度
private var StartPosition:Number;
public function Flame(X:Number=0):void {
var scale:Number=(Scale-ScaleMin)*Math.random();
Shift=scale*SizeRange;
Size=SizeRange*(Scale-ScaleMin)-Shift+SizeMin;
scale+=ScaleMin;
ColorChange=(12-Size);
StartPosition=X;
flameball=new FlameBall();
this.addChild(flameball);
flameball.x=StartPosition;
flameball.y=0;
flameball.visible=true;
flameball.scaleX=scale;
flameball.scaleY=scale;
flameball.blendMode="add";
flameball.transform.colorTransform=new ColorTransform(0,0,0,a,255,g,0,0);
}
public function Start():void {
with (flameball) {
x+=Shift*Direct*Control;
y-=(Velocity+VelocityRange*Math.random())/100;
scaleX+=Size*Control/100;
scaleY=scaleX;
a+=0.25*Control;
g-=ColorChange;
if(g<0)g=0;
transform.colorTransform=new ColorTransform(0,0,0,a,255,g,0,0);
}
if (a>1) {
a=1;
Control=-0.04;
}
if (a<0) {
this.removeChild(flameball);
} else {
setTimeout(Start,15);
}
}
}
}
Fire.as:
package FireWorks{
import flash.display.Sprite;
import flash.utils.*;
public class Fire extends Sprite {
public static var Fires:Number=100;
public var flame:Array=new Array(Fires);
private var Num:Number;
public function Fire(X:Number=0,Y:Number=0):void {
Num=0;
Start(X,Y);
}
private function Start(X:Number=0,Y:Number=0):void{
flame[Num]=new Flame(0);
flame[Num].x=X;
flame[Num].y=Y;
this.addChild(flame[Num]);
flame[Num].Start();
Num++;
if(Num>Fires)Num=1;
setTimeout(Start,18,X,Y);
}
}
}
有一个很大的缺点就是火很小。参数调到后来都没信心了。
另一个大问题就是火不能多,一多CPU就挂掉。