as3.0系统星云离子(学习例子)

                                                                 星云离子

package

{

            import flash.display.Sprite;

 import flash.events.Event;

 import flash.display.Bitmap;

 import flash.display.BitmapData;

 import flash.events.MouseEvent;

 import flash.filters.BlurFilter;

 import flash.filters.ColorMatrixFilter;

 import flash.filters.GlowFilter;

 import flash.geom.Matrix;

 import flash.geom.Point;

 [SWF(width = "465",height = "465",backgroundColor = "0",fps = "30")]

 public class Particles extends Sprite

         {

  private var NUM:int = 300;

  private var p:Particle = new Particle;

  private var bd:BitmapData = new BitmapData(465,465,true,0);

  private var m:Matrix = new Matrix(1,0,0,1,0,0);

  public function Particles()

         {

   // take a capture after 10 sec

   //Wonderfl.capture_delay(10);

   var bmp:Bitmap = new Bitmap(bd);

   bd.fillRect(bd.rect,0);

   addChild(bmp);

   for (var i:int = 0; i < NUM; i++)

          {

    var next:Particle = p;

    p = new Particle  ;

    p.next = next;

    addChild(p);

 }

   addEventListener(Event.ENTER_FRAME,onEnterFrame);

   stage.addEventListener(MouseEvent.MOUSE_DOWN,onDown);

   stage.addEventListener(MouseEvent.MOUSE_UP,onUp);

   stage.addEventListener(Event.MOUSE_LEAVE,onUp);

          }

  private var isDown:Boolean = false;

  private function onDown(e:MouseEvent):void

  {

   isDown = true;

  }   

private function onUp(e:Event):void

  {    

isDown = false;

  }  

 private function onEnterFrame(e:Event):void

  {

   if (! stage)

             {    

 return;

             }  

            var current:Particle = this.p;

            var p:Point = isDown ? new Point(stage.mouseX,stage.mouseY):null;

          do   

            {

               current.update(p);

            }

        while (current = current.next);

   bd.lock();

   bd.applyFilter(bd,bd.rect,new Point  ,new ColorMatrixFilter([0.9994,0,0,0,0,0,0.9994,0,0,0,0,0,0.9994,0,0,0,0,0,0.9994,0,]));

   bd.draw(stage);

   bd.applyFilter(bd,bd.rect,new Point  ,new BlurFilter(4,4,2));

   bd.unlock();

         }

 }

}

import flash.display.*;

import flash.geom.Point;

class Particle extends Sprite {;

public var next:Particle;

private var vx:Number;

private var vy:Number;

private var vz:Number;

public function Particle()

{

 graphics.beginFill((0x8888 | 0xFFFFFF * Math.random()),1);

 graphics.drawRect(-1,-1,2,2);

 init();

}

private function init():void

{

 var theta:Number = Math.random() * Math.PI * 2;

 var phi:Number = Math.random() * Math.PI;

 phi =  -  Math.PI * 0.35;  

// x,y,z: 初期位置の単位ベクトル

 var x:Number = Math.cos(theta);

// 最初から x を使うとなにかおかしい

 var y:Number = Math.sin(theta) * Math.cos(phi);

 var z:Number = Math.sin(theta) * Math.sin(phi);

 // px, py, pz: ランダム速度

 var px:Number = Math.random() - 0.5;

 var py:Number = Math.random() - 0.5;

 var pz:Number = Math.random() - 0.5;

 // i: 速度の原点方向の成分の大きさ

 var i:Number = px * x + py * y + pz * z;  px -=  i * x;  py -=  i * y;  pz -=  i * z;

 // i: ジャイロの軸方向の成分の大きさ

 i = py * Math.sin(phi) - pz * Math.cos(phi);

 py -=  i * Math.sin(phi);  pz +=  i * Math.cos(phi);

 var p:Number = 1 / Math.sqrt((((px * px) + py * py) + pz * pz));

 px *=  p;

 py *=  p;

 pz *=  p;

 // px, py, pz: 正規化完了

 if ((((x * py) - y * px) > 0))

 {

// 座標と進行方向の外積のz座標

  px *=  -1;

  py *=  -1;

  pz *=  -1;

              }

 // 向きを揃えた

 var r:Number = 130 + Math.random() * Math.random() * 130;// 初期半

 var v:Number = Math.sqrt(r) * 0.185;// 初期速度

 this.x = 232 + r * x;// 232:wonderfl的中心座標

 this.y = 200 + r * y;

 this.z = r * z;

 vx = px * v;

 vy = py * v;

 vz = pz * v;

 this.blendMode = "add";

}

public function update(p:Point):void

{

 x +=  vx;

 y +=  vy;

 z +=  vz;

 if (! p)

 {  

 p = new Point(232,200);

              }  

var px:Number = x - p.x;  

var py:Number = y - p.y;

 var r:Number = 1000 / Math.pow((((px * px) + py * py) + z * z),1.5);

 vx -=  px * r;

 vy -=  py * r;

 vz -=  z * r;

 if (((x > 1465) || x < -1000))

 {  

                               init();

                     }

          }

}

原文地址:https://www.cnblogs.com/klh5211314/p/2754288.html