天天看點

Flash 火焰

通過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測試效果如下:

Flash 火焰