通過flash的blendMode屬性,beginGradientFill屬性,可以做出很多有趣的效果,下面以火焰效果來加以展示。
分析:火焰可以看做很多小球往上抛,隻不過這些小球的位置,角度,透明度時刻在變化着,再加上blendMode為add,就更加逼真了。
1、建立一fla檔案,命名Blaze.fla,設定舞台寬高為200x300
2、建立一as檔案,命名Blaze.as,并與fla關聯
3、建立一as檔案,命名Ball.as,模拟小球
Ball.as代碼如下:
package
{
import flash.display.GradientType;
import flash.display.Sprite;
import flash.geom.Matrix;
public class Ball extends Sprite
{
//振幅
public var swings:Number = 0;
//角度
public var angles:Number = 0;
public function Ball(color:int=0xffffff,swing:Number=10,angle:Number=-1)
{
swings = swing;
angles = angle;
var colors:Array = [0xffff00,0x000000];
colors[0] = color;
var alphas:Array = [1,0];
var ratios:Array = [0,255];
var matrix:Matrix = new Matrix ;
matrix.createGradientBox(100,100,0,-50,-50);
graphics.beginGradientFill(GradientType.RADIAL,colors,alphas,ratios,matrix);
graphics.drawCircle(0,0,50);
graphics.endFill();
}
}
}
Blaze.as 代碼如下:
package
{
import flash.display.Sprite;
import flash.ui.Mouse;
import Ball;
import flash.events.Event;
public class Blaze extends Sprite
{
private var balls:Array = [];
private var ballnum:int = 100;
private var ballcolor:Array = [0x201099];
private var speed:Number = 0.5;
private var ball:Ball;
public function Blaze()
{
Mouse.hide();
init();
}
private function init():void
{
this.graphics.beginFill(0x0,1);
this.graphics.drawRect(0,0,stage.stageWidth,stage.stageHeight);
this.graphics.endFill();
var n:int = 0;
ball = new Ball(ballcolor[n],Math.random() * 20,1 - Math.random() * 3);
ball.cacheAsBitmap = true;
ball.blendMode = "add";
//ball.y = mouseY;
//ball.x = mouseX;
ball.y = 240;
ball.x = 100;
ball.height = ball.width = ball.width * Math.random() + 50;
addChild(ball);
for (var i:int=0; i<ballnum; i++)
{
n = Math.random() * ballcolor.length;
var _ball:Ball = new Ball(ballcolor[n],Math.random() * 20,1 - Math.random() * 3);
_ball.blendMode = "add";
_ball.cacheAsBitmap = true;
//_ball.x = stage.stageWidth / 2;
//_ball.y = stage.stageHeight / 2;
_ball.x = 100;
_ball.y = 240;
_ball.alpha = 0;
_ball.height = ball.width = ball.width * Math.random() / 2 + 20;
addChild(_ball);
balls.push(_ball);
}
addEventListener(Event.ENTER_FRAME,onEnterFrameHandler);
}
private function onEnterFrameHandler(event:Event):void
{
//ball.y = mouseY;
//ball.x = mouseX;
ball.y = 240;
ball.x = 100;
for (var i:int =0; i<ballnum; i++)
{
balls[i].y -= 11;
balls[i].alpha -= balls[i].width / 1000;
balls[i].x += Math.sin(balls[i].angles) * balls[i].swings / 2;
balls[i].angles += speed;
if (balls[i].alpha <= 0 || balls[i].width < 50)
{
//balls[i].y = mouseY;
//balls[i].x = mouseX;
balls[i].y = 240;
balls[i].x = 100;
balls[i].swings = Math.random() * 10;
balls[i].alpha = 1;
balls[i].height = balls[i].width = Math.random() * 100;
}
}
}
}
}
Ctrl+Enter測試效果如下: