| 网站镜像:电信 网通 | 加入收藏 | 设为首页

Particle粒子发射效果教程

  • 先给出类文件Particle.as
    class Particle {
    private var _body:MovieClip;
    private var _gravity:Number = 5;
    private var _angle:Number = 90;
    private var _velocity:Number = 20;//: 单位是px每s
    private var _lifeTime:Number = 5000;
    private var startAlpha:Number;//:得到初始粒子透明度,以便计算透明度STEP
    private var JinDu:Number = 30;
    private var Times:Number = 0;
    private var timeID;
    //:下面是一些重要属性的接口函数
    function Particle(b:MovieClip) {
    _body = b;
    startAlpha = _body._alpha;
    }
    public function get body():MovieClip {
    return _body;
    }
    public function set body(b:MovieClip):Void {
    _body = b;
    }
    public function get gravity():Number {
    return _gravity;
    }
    public function set gravity(g:Number):Void {
    _gravity = g;
    }
    public function get angle():Number {
    return _angle;
    }
    public function set angle(a:Number):Void {
    _angle = a;
    }
    public function get velocity():Number {
    return _velocity;
    }
    public function set velocity(v:Number):Void {
    _velocity = v;
    }
    public function get jindu():Number {
    return JinDu;
    }
    public function set jindu(j:Number):Void {
    if (j>0) {
    JinDu = j;
    } else {
    JinDu = 1;
    }
    }
    public function get lifeTime():Number {
    return _lifeTime;
    }
    public function set lifeTime(t:Number):Void {
    if (t>0) {
    _lifeTime = t;
    } else {
    _lifeTime = Infinity;
    //: 小于等于零的生命时间表示无穷大 ://
    }
    }
    public function shoot():Void {
    timeID = setInterval(this, "dirve", JinDu);
    }
    //:驱动粒子的运动
    private function dirve() {
    var t:Number = JinDu/1000;
    //:单位是秒
    var alphaStep:Number = startAlpha/int(_lifeTime/JinDu);
    _body._x += _velocity*Math.cos(_angle*Math.PI/180)*t;
    _body._y += -(_velocity*Math.sin(_angle*Math.PI/180)*t)+(_gravity*Times*Times/2);
    _body._alpha -= alphaStep;
    Times += t;
    if (_x<0 or _y<0 or _x>Stage.width or _y>Stage.height or _alpha<=10) {
    _body.removeMovieClip();
    delete this;
    PStop();
    }
    //: 粒子已飞出舞台 ://
    updateAfterEvent();
    }
    private function PStop() {
    Times = 0;
    clearInterval(timeID);
    }
    public function getClone() {
    return (new Particle(new MovieClip()));
    }
    }

    //:此类的特点是,可以控制粒子刷新率,而不受帧速率影响:)     在第一帧的代码:
    var id:Number = 0;
    var gs:Number = 0; //重力初值
    var vs:Number = 100;//基速初值
    var ls:Number = 1000;//生命初值
    var as:Number = 45;//射角初值
    var a:Array = new Array();
    //绘出粒子BODY并返回
    function createP():MovieClip {
    var body = _root.createEmptyMovieClip("P" add id, id+1);
    body._x = Stage.width/2;
    body._y = Stage.height/2;
    body.lineStyle(0, 0xffffff, 100);
    body.moveTo(0, 0);
    body.lineTo(5, 0);
    body.lineTo(5, 5);
    body.lineTo(0, 5);
    body.lineTo(0, 0);
    var ss = 100+random(50);
    body._xscale = ss;
    body._yscale = ss;
    id++;
    if (id == 50) {
    id = 0;
    }
    return (body);
    }
    function sss() {
    a[id] = new Particle(createP());
    a[id-1].jindu = 20;// 刷新率20表示一秒钟刷1000/20 = 50次,相当于50帧/秒
    a[id-1].gravity = gs;
    a[id-1].velocity = vs+random(50);
    a[id-1].angle = as + random(180-2*as);
    a[id-1].lifeTime = ls+random(2000);
    a[id-1].shoot();
    }
    var tid = setInterval(sss, 50);最后加上按钮:
    重力加:
    on(press){
    _root.as += 5;
    }
    重力减:
    on(press){
    _root.as -= 5;
    }
    基速加:
    on(press){
    _root.as += 5;
    }
    基速减:
    on(press){
    _root.as -= 5;
    }
    生命加:
    on(press){
    _root.ls += 100;
    }
    生命减:
    on(press){
    _root.ls -= 100;
    }
    射角加:
    on(press){
    _root.as -= 5;
    }
    射角减:

    on(press){
    _root.as += 5;
    } //:AS文件和FLA须在同一目录下方可编译成功
    //:粒子的形状可任意绘制
    效果如下: <!-- / message --><!-- sig --><!-- / message --><!-- sig -->

    点这里下载演示效果文件