烟花效果

      AS2 2006-10-8 15:45
以下是流浪儿做的一个烟花效果,非常漂亮。
import flash.display.BitmapData;
import flash.filters.BlurFilter;
import wing.math.MathExtend;
//
var total:Number = 150;
var bgMc:MovieClip = this.createEmptyMovieClip("bgMc", 1);
var filter:BlurFilter = new BlurFilter(6, 6, 1);
var filterArr:Array = new Array(filter);
bgMc.filters = filterArr;
var containerBitmap:BitmapData = new BitmapData(Stage.width, Stage.height, false, 0);
bgMc.attachBitmap(containerBitmap, 0);
var containerMc:MovieClip = this.createEmptyMovieClip("containerMc", 2);
var mySound:Sound = new Sound(this);
mySound.attachSound("sound01");
function onMouseDown() {
mySound.start(1, 2);
for (var i:Number = 0; i<total; i++) {
var size:Number = Math.random()*5+3;
var color:Number = (255 << 16 | Math.random()*255 << 8 | 0);
var particle:MovieClip = createParticle(containerMc, size, color, _xmouse, _ymouse);
var speed:Number = Math.random()*5+1;
var angle:Number = Math.random()*360;
linearRoll(particle, speed, angle);
}
}
function onEnterFrame() {
containerBitmap.draw(this);
updateAfterEvent();
}
//线性滚动
function linearRoll(rollMc:MovieClip, speed:Number, angle:Number):Void {
var radian:Number = MathExtend.transformRadian(angle);
var speedX:Number = speed*Math.cos(radian);
var speedY:Number = speed*Math.sin(radian);
var x0:Number = rollMc._x;
var y0:Number = rollMc._y;
rollMc.onEnterFrame = function() {
this._x += speedX;
this._y += speedY;
var radius:Number = MathExtend.getBetweenLength(x0, y0, this._x, this._y);
if (radius>70) {
speedX = 0;
speedY = 6;
this._alpha += -6;
}
if (this._x<0 || this._x>Stage.width || this._y>Stage.height || this._alpha<10) {
this.removeMovieClip();
}
updateAfterEvent();
};
}
//创建粒子
function createParticle(target:MovieClip, size:Number, color:Number, x:Number, y:Number):MovieClip {
var depth:Number = target.getNextHighestDepth();
var oval:MovieClip = target.createEmptyMovieClip("oval"+depth, depth);
with (oval) {
lineStyle(size, color);
moveTo(0, 0);
lineTo(.2, 0);
_x = x;
_y = y;
}
return oval;
}


代码中用到流浪儿写的一个类的方法,是扩展的Math的,所有的方法是静态的,导入类后,直接使用

例如,求场景中两个MC的夹角

import wing.math.MathExtend;
var angle:Number = MathExtend.getAngle(mcA._x, mcA._y, mcB._x, mcB._y);
trace(angle);


MathExtend.as

/**
*扩展Math类(静态的)
*Author:流浪儿
*MathExtend.as
**/
class wing.math.MathExtend extends Math {
/**
*获取角度(两点间的夹角)
**/
public static function getAngle(x0:Number, y0:Number, x2:Number, y2:Number):Number {
//x0 y0相当于圆心坐标
var x:Number = x2-x0;
var y:Number = y2-y0;
var angle:Number = Math.atan2(y, x)*180/Math.PI;
return angle;
}
/**
*获取弧度值(两点间的夹角)
**/
public static function getRadian(x0:Number, y0:Number, x2:Number, y2:Number):Number {
var x:Number = x2-x0;
var y:Number = y2-y0;
var radian:Number = Math.atan2(y, x);
return radian;
}
/**
*求两点间的长度
**/
public static function getBetweenLength(x1:Number, y1:Number, x2:Number, y2:Number):Number {
var a:Number = x1-x2;
var b:Number = y1-y2;
var c:Number = Math.sqrt(a*a+b*b);
return c;
}
/**
*已知一线段的一端坐标、夹角、长度,求另一端点的坐标
**/
public static function getCoordinate(x0:Number,y0:Number,angle:Number,radius:Number):Object{
var xpos:Number=x0+radius*cosExtend(angle);
var ypos:Number=y0+radius*sinExtend(angle);
return {x:xpos,y:ypos};
}
/**
*将弧度转换为角度
**/
public static function transformAngle(radian:Number):Number {
var angle:Number = radian*180/Math.PI;
return angle;
}
/**
*将角度转换为弧度
**/
public static function transformRadian(angle:Number):Number {
var radian:Number = angle*Math.PI/180;
return radian;
}
/**
*扩展sin
**/
public static function sinExtend(angle:Number):Number {
var radian:Number;
if (angle == 180 || angle == 360) {
radian = Math.round(Math.sin(angle*Math.PI/180));
} else {
radian = Math.sin(angle*Math.PI/180);
}
return radian;
}
/**
*扩展cos
**/
public static function cosExtend(angle:Number):Number {
var radian:Number;
if (angle == 90 || angle == 270) {
radian = Math.round(Math.cos(angle*Math.PI/180));
} else {
radian = Math.cos(angle*Math.PI/180);
}
return radian;
}
/**
*扩展asin
**/
public static function asinExtend(ratio:Number):Number {
var angle:Number = Math.asin(ratio)*180/Math.PI;
return angle;
}
/**
*扩展acos
**/
public static function acosExtend(ratio:Number):Number {
var angle:Number = Math.acos(ratio)*180/Math.PI;
return angle;
}
/**
*扩展atan
**/
public static function atanExtend(ratio:Number):Number {
var angle:Number = Math.atan(ratio)*180/Math.PI;
return angle;
}
/**
*扩展atan2
**/
public static function atan2Extend(y:Number, x:Number):Number {
var angle:Number = Math.atan2(y, x)*180/Math.PI;
return angle;
}
}


标签集:TAGS:
回复Comments() 点击Count()

回复Comments

{commenttime}{commentauthor}

{CommentUrl}
{commentcontent}