• 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();

                         }

              }

    }

  • 相关阅读:
    2014.12.31今年最后的一天
    leetcode11 盛最多水的容器(Medium)
    leetcode23 合并k个排序链表(Hard)
    leetcode148 排序链表(Medium)
    leetcode48 旋转图像(Medium)
    leetcode227基本计算器II (Medium)
    leetcode338 比特位计数(Medium)
    leetcode32 最长有效括号(Hard)
    leetcode面试题10.01 合并排序的数组(Easy)
    leetcode55 跳跃游戏(Medium)
  • 原文地址:https://www.cnblogs.com/klh5211314/p/2754288.html
Copyright © 2020-2023  润新知