※現在、「wonderfl build flash online」求人コンテンツ制作に関してのアンケートを実施中です!みなさまのお力添えを頂いて、続々とアンケート結果が集まっていますが、まだまだ募集しております。ご協力のほど、どうぞよろしくお願いいたします!

wonderfl運営事務局
→アンケートページ(※ログインしてからお答えいただけるようになっています。)

 notice: Flash editor updated! Join the development! Thanks to MiniBuilder


forked from : clockmaker's 3D Flow Simulation with Field of Blur [diff(104)]

FAVORITE BY
:
:
:
BitmapData矢印がいっぱいなんだけど、高速なデモ 矢印 1000個
:
:
:
:
:
:
:
:
:
:
:
Speed
:
:
:
高速化はやい
:
:
:
:
bitmapdata高速BitmapDataで配列にすると高速なのか〜
:
:
:
Amazing
:
BitmapData最適化最適化の勉強
:
パーティクル祭こういうのを作ろうと思ったら、もう作られてた。
:
:
:
:
:
:
矢印いっぱい見た目も楽しいです
:
particlebitmapdataすばらしーです
FORKED

BitmapDataで配列に格納すると高速化するよ forked from: BitmapDataで配列に格納すると高速化するよ [diff(124)]

  1. // forked from clockmaker's 3D Flow Simulation with Field of Blur
  2. // forked from clockmaker's 3D Flow Simulation
  3. // forked from clockmaker's Interactive Liquid 10000
  4. // forked from clockmaker's Liquid110000 By Vector
  5. // forked from munegon's forked from: forked from: forked from: forked from: Liquid10000
  6. // forked from Saqoosha's forked from: forked from: forked from: Liquid10000
  7. // forked from nutsu's forked from: forked from: Liquid10000
  8. // forked from nutsu's forked from: Liquid10000
  9. // forked from zin0086's Liquid10000
  10. package 
  11. {
  12.     /**
  13.      * 矢印がいっぱいなんだけど、高速なデモ
  14.      * 画質はディフォルトの StageQuality.HIGH で
  15.      * 矢印 1000個
  16.      * @author Yasu
  17.      */
  18.     import flash.display.*;
  19.     import flash.geom.*;
  20.     import flash.events.*;
  21.     import flash.utils.*;
  22.     import flash.geom.*;
  23.     import flash.filters.*;
  24.     import net.hires.debug.Stats;
  25.     
  26.     [SWF(width="465", height="465", backgroundColor="0xFFFFFF" , rate="60")]
  27.     public class Main extends Sprite {
  28.         private const NUM_PARTICLE:uint = 1000;
  29.         private const H:Number = 465;
  30.         private const W:Number = 465;
  31.        
  32.         private var forceMap:BitmapData = new BitmapData( W, H, false, 0x000000 );
  33.         private var particleList:Vector.<Arrow> = new Vector.<Arrow>(NUM_PARTICLE, true);
  34.         private var rotArr:BitmapData ;
  35.         private var world:Sprite = new Sprite();
  36.         private var muse:Point;
  37.         public function Main() {
  38.             addChild(world);
  39.             world.addChild(new Bitmap(forceMap));
  40.             resetFunc();
  41.             
  42.             
  43.             // 矢印をプレレンダリング
  44.             var dummy:Sprite = new Sprite();
  45.             dummy.graphics.beginFill(0xFFFFFF, 1);
  46.             dummy.graphics.lineStyle(1, 0x0, 1);
  47.             dummy.graphics.moveTo(24);
  48.             dummy.graphics.lineTo(84);
  49.             dummy.graphics.lineTo(80);
  50.             dummy.graphics.lineTo(207);
  51.             dummy.graphics.lineTo(814);
  52.             dummy.graphics.lineTo(810);
  53.             dummy.graphics.lineTo(210);
  54.             dummy.graphics.lineTo(24);
  55.             
  56.             var matrix:Matrix;
  57.             matrix = new Matrix();
  58.             matrix.translate( -11, -11);
  59.             matrix.rotate(0);
  60.             matrix.translate( 1111);
  61.             rotArr = new BitmapData(2222true, 0x0);
  62.             rotArr.draw(dummy, matrix);
  63.             
  64.             // パーティクルを生成します
  65.             for (var i:int = 0; i < NUM_PARTICLE; i++) {
  66.                 var px:Number = Math.random() * H;
  67.                 var py:Number = Math.random() * W;
  68.                 particleList[i] = new Arrow(px, py,W,H);
  69.                 particleList[i].bitmapData = rotArr;
  70.                 world.addChild(particleList[i]);
  71.             }
  72.             museinit()
  73.             addChild(new Stats);
  74.             addEventListener( Event.ENTER_FRAME, loop );
  75.         }
  76.         
  77.         //loop
  78.         private function loop( e:Event ):void {
  79.             
  80.             var len:uint = particleList.length;
  81.             var col:Number;
  82.             
  83.             for (var i:uint = 0; i < len; i++) {
  84.                 var arrow:Arrow = particleList[i];
  85.                 col = forceMap.getPixel( arrow.x , arrow.y );
  86.                 arrow.update(
  87.                       ((col & 0xff)      - 0x80 ) * .0005 ,
  88.                       ((col >> 8 & 0xff) - 0x80 ) * .0005);
  89.             }
  90.         }
  91.         
  92.         private function museinit():void{
  93.            stage.addEventListener(MouseEvent.MOUSE_MOVE,mouseMove);
  94.            stage.addEventListener(MouseEvent.MOUSE_UP,mouseUp);
  95.            stage.addEventListener(Event.MOUSE_LEAVE,mouseLeave);
  96.            stage.addEventListener(MouseEvent.MOUSE_DOWN,mouseDown);
  97.         }
  98.         private var mouseDownSt:Boolean=false;
  99.         private function mouseDown( e:MouseEvent ):void {mouseDownSt=true;}
  100.         private function mouseUp( e:MouseEvent ):void {mouseDownSt=false;}
  101.         private function mouseLeave( e:Event ):void {mouseDownSt=false;}
  102.         
  103.         private var rect:Rectangle=new Rectangle(0,0,10,10);
  104.         private var filter:BlurFilter=new BlurFilter(4,4,10);
  105.         private function mouseMove( e:MouseEvent ):void {
  106.             if(mouseDownSt){
  107.               rect.x=mouseX;
  108.               rect.y=mouseY;
  109.               forceMap.setPixel(mouseX,mouseY,0x0)
  110.               //forceMap.generateFilterRect(rect,filter);
  111.             }
  112.         }
  113.         
  114.         //noise reset
  115.         private function resetFunc(e:Event = null):void{
  116.             forceMap.perlinNoise(W,H,30, Math.floor( Math.random() * 0xFFFFFF ), falsetrue6falsenull);
  117.         }
  118.     }
  119. }
  120. import flash.display.*;
  121. class Arrow extends Bitmap
  122. {
  123.     public var mx:Number = 0;
  124.     public var my:Number = 0;
  125.     public var vx:Number = 0;
  126.     public var vy:Number = 0;
  127.     public var ax:Number = 0;
  128.     public var ay:Number = 0;
  129.     public function Arrow( x:Number, y:Number,mx:Number,my:Number) {this.x = x;this.y = y;this.mx = mx;this.my = my;}
  130.     public function update(aax:Number,aay:Number):void{
  131.         ax += aax;
  132.         ay += aay;
  133.         vx += ax;
  134.         vy += ay;
  135.         x += vx;
  136.         y += vy;
  137.         ( x > mx ) ? x = 0 :( x < 0 ) ? x = mx : 0;
  138.         ( y > my ) ? y = 0 :( y < 0 ) ? y = my : 0;
  139.         ax *= .95;
  140.         ay *= .95;
  141.         vx *= .90;
  142.         vy *= .90;
  143.     }
  144. }
noswf
  1. // forked from clockmaker's BitmapDataで配列に格納すると高速化するよ
  2. // forked from clockmaker's 3D Flow Simulation with Field of Blur
  3. // forked from clockmaker's 3D Flow Simulation
  4. // forked from clockmaker's Interactive Liquid 10000
  5. // forked from clockmaker's Liquid110000 By Vector
  6. // forked from munegon's forked from: forked from: forked from: forked from: Liquid10000
  7. // forked from Saqoosha's forked from: forked from: forked from: Liquid10000
  8. // forked from nutsu's forked from: forked from: Liquid10000
  9. // forked from nutsu's forked from: Liquid10000
  10. // forked from zin0086's Liquid10000
  11. package 
  12. {
  13.     /**
  14.      * 矢印がいっぱいなんだけど、高速なデモ
  15.      * 画質はディフォルトの StageQuality.HIGH で
  16.      * 矢印 1000個
  17.      * @author Yasu
  18.      */
  19.     import flash.display.*;
  20.     import flash.geom.*;
  21.     import flash.events.*;
  22.     import flash.utils.*;
  23.     import flash.geom.*;
  24.     import net.hires.debug.Stats;
  25.     
  26.     [SWF(width="465", height="465", backgroundColor="0xFFFFFF")]
  27.     public class Main extends Sprite {
  28.         private const NUM_PARTICLE:uint = 300;
  29.         private const ROT_STEPS:int = 120;
  30.         
  31.         private var forceMap:BitmapData = new BitmapData( 233233false, 0x000000 );
  32.         private var randomSeed:uint = Math.floor( Math.random() * 0xFFFF );
  33.         private var particleList:Vector.<Arrow> = new Vector.<Arrow>(NUM_PARTICLE, true);
  34.         private var rect:Rectangle = new Rectangle( 00465465 );
  35.         private var seed:Number = Math.floor( Math.random() * 0xFFFF );
  36.         private var offset:Array = [new Point(), new Point()];
  37.         private var timer:Timer;
  38.         private var world:Sprite = new Sprite();
  39.         private var rotArr:Vector.<BitmapData> = new Vector.<BitmapData>(ROT_STEPS, true);
  40.         public function Main() {
  41.             
  42.             stage.align = StageAlign.TOP_LEFT;
  43.             stage.scaleMode = StageScaleMode.NO_SCALE;
  44.             stage.frameRate = 60;
  45.             
  46.             addChild(world);
  47.             
  48.             // フォースマップの初期化をおこないます
  49.             resetFunc();
  50.             
  51.             // ループ処理
  52.             addEventListener( Event.ENTER_FRAME, loop );
  53.             
  54.             // 時間差でフォースマップと色変化の具合を変更しています
  55.             var timer:Timer = new Timer(1000)
  56.             timer.addEventListener(TimerEvent.TIMER, resetFunc);
  57.             timer.start();
  58.             
  59.             // 矢印をプレレンダリング
  60.             var dummy:Sprite = new Sprite();
  61.             dummy.graphics.beginFill(0xFFFFFF, 1);
  62.             dummy.graphics.lineStyle(1, 0x0, 1);
  63.             dummy.graphics.moveTo(24);
  64.             dummy.graphics.lineTo(84);
  65.             dummy.graphics.lineTo(80);
  66.             dummy.graphics.lineTo(207);
  67.             dummy.graphics.lineTo(814);
  68.             dummy.graphics.lineTo(810);
  69.             dummy.graphics.lineTo(210);
  70.             dummy.graphics.lineTo(24);
  71.             
  72.             var matrix:Matrix;
  73.             var i:int = ROT_STEPS;
  74.             while (i--)
  75.             {
  76.                 matrix = new Matrix();
  77.                 matrix.translate( -11, -11);
  78.                 matrix.rotate( ( 360 / ROT_STEPS * i )* Math.PI / 180);
  79.                 matrix.translate( 1111);
  80.                 rotArr[i] = new BitmapData(2222true, 0x0);
  81.                 rotArr[i].draw(dummy, matrix);
  82.             }
  83.             
  84.             // パーティクルを生成します
  85.             for (i = 0; i < NUM_PARTICLE; i++) {
  86.                 var px:Number = Math.random() * 465;
  87.                 var py:Number = Math.random() * 465;
  88.                 particleList[i] = new Arrow(px, py);
  89.                 world.addChild(particleList[i]);
  90.             }
  91.             
  92.             // デバッグ用のスタッツを表示しています
  93.             addChild(new Stats);
  94.         }
  95.         
  96.         private function loop( e:Event ):void {
  97.             
  98.             var len:uint = particleList.length;
  99.             var col:Number;
  100.             
  101.             for (var i:uint = 0; i < len; i++) {
  102.                 
  103.                 var arrow:Arrow = particleList[i];
  104.                 
  105.                 var oldX:Number = arrow.x;
  106.                 var oldY:Number = arrow.y;
  107.                 
  108.                 col = forceMap.getPixel( arrow.x >> 1, arrow.y >> 1);
  109.                 arrow.ax += ( (col      & 0xff) - 0x80 ) * .0005;
  110.                 arrow.ay += ( (col >> 8 & 0xff) - 0x80 ) * .0005;
  111.                 arrow.vx += arrow.ax;
  112.                 arrow.vy += arrow.ay;
  113.                 arrow.x += arrow.vx;
  114.                 arrow.y += arrow.vy;
  115.                 
  116.                 var _posX:Number = arrow.x;
  117.                 var _posY:Number = arrow.y;
  118.                 
  119.                 var rot:Number = - Math.atan2((_posX - oldX), (_posY - oldY)) * 180 / Math.PI + 90;
  120.                 var angle:int = rot / 360 * ROT_STEPS | 0;
  121.                 // Math.absの高速化ね
  122.                 angle = (angle ^ (angle >> 31)) - (angle >> 31);
  123.                 arrow.rot += (angle - arrow.rot) * 0.2;
  124.                 arrow.bitmapData = rotArr[arrow.rot];
  125.                     
  126.                 arrow.ax *= .96;
  127.                 arrow.ay *= .96;
  128.                 arrow.vx *= .92;
  129.                 arrow.vy *= .92;
  130.                 
  131.                 // あと配置座標を整数化しておきます
  132.                 arrow.x = arrow.x | 0;
  133.                 arrow.y = arrow.y | 0;
  134.                 
  135.                 ( _posX > 465 ) ? arrow.x = 0 :
  136.                     ( _posX < 0 ) ? arrow.x = 465 : 0;
  137.                 ( _posY > 465 ) ? arrow.y = 0 :
  138.                     ( _posY < 0 ) ? arrow.y = 465 : 0;
  139.             }
  140.         }
  141.         
  142.         private function resetFunc(e:Event = null):void{
  143.             forceMap.perlinNoise(1171173, seed, falsetrue6false, offset);
  144.             
  145.             offset[0].x += 1.5;
  146.             offset[1].y += 1;
  147.             seed = Math.floor( Math.random() * 0xFFFFFF );
  148.         }
  149.     }
  150. }
  151. import flash.display.*;
  152. class Arrow extends Bitmap
  153. {
  154.     public var rot:int = 0;
  155.     public var vx:Number = 0;
  156.     public var vy:Number = 0;
  157.     public var ax:Number = 0;
  158.     public var ay:Number = 0;
  159.     function Arrow( x:Number, y:Number) {
  160.         this.x = x;
  161.         this.y = y;
  162.     }
  163. }
noswf
  1. // forked from clockmaker's BitmapDataで配列に格納すると高速化するよ
  2. // forked from clockmaker's 3D Flow Simulation with Field of Blur
  3. // forked from clockmaker's 3D Flow Simulation
  4. // forked from clockmaker's Interactive Liquid 10000
  5. // forked from clockmaker's Liquid110000 By Vector
  6. // forked from munegon's forked from: forked from: forked from: forked from: Liquid10000
  7. // forked from Saqoosha's forked from: forked from: forked from: Liquid10000
  8. // forked from nutsu's forked from: forked from: Liquid10000
  9. // forked from nutsu's forked from: Liquid10000
  10. // forked from zin0086's Liquid10000
  11. package 
  12. {
  13.     /**
  14.      * 矢印がいっぱいなんだけど、高速なデモ
  15.      * 画質はディフォルトの StageQuality.HIGH で
  16.      * 矢印 1000個
  17.      * @author Yasu
  18.      */
  19.     import flash.display.*;
  20.     import flash.geom.*;
  21.     import flash.events.*;
  22.     import flash.utils.*;
  23.     import flash.geom.*;
  24.     import net.hires.debug.Stats;
  25.     
  26.     [SWF(width="465", height="465", backgroundColor="0xFFFFFF")]
  27.     public class Main extends Sprite {
  28.         private const NUM_PARTICLE:uint = 1000;
  29.         private const ROT_STEPS:int = 120;
  30.         
  31.         private var forceMap:BitmapData = new BitmapData( 233233false, 0x000000 );
  32.         private var randomSeed:uint = Math.floor( Math.random() * 0xFFFF );
  33.         private var particleList:Vector.<Arrow> = new Vector.<Arrow>(NUM_PARTICLE, true);
  34.         private var rect:Rectangle = new Rectangle( 00465465 );
  35.         private var seed:Number = Math.floor( Math.random() * 0xFFFF );
  36.         private var offset:Array = [new Point(), new Point()];
  37.         private var timer:Timer;
  38.         private var world:Sprite = new Sprite();
  39.         private var rotArr:Vector.<BitmapData> = new Vector.<BitmapData>(ROT_STEPS, true);
  40.         public function Main() {
  41.             
  42.             stage.align = StageAlign.TOP_LEFT;
  43.             stage.scaleMode = StageScaleMode.NO_SCALE;
  44.             stage.frameRate = 60;
  45.             
  46.             addChild(world);
  47.             
  48.             // フォースマップの初期化をおこないます
  49.             resetFunc();
  50.             
  51.             // ループ処理
  52.             addEventListener( Event.ENTER_FRAME, loop );
  53.             
  54.             // 時間差でフォースマップと色変化の具合を変更しています
  55.             var timer:Timer = new Timer(1000)
  56.             timer.addEventListener(TimerEvent.TIMER, resetFunc);
  57.             timer.start();
  58.             
  59.             // 矢印をプレレンダリング
  60.             var dummy:Sprite = new Sprite();
  61.             dummy.graphics.beginFill(0xFFFFFF, 1);
  62.             dummy.graphics.lineStyle(1, 0x0, 1);
  63.             dummy.graphics.moveTo(24);
  64.             dummy.graphics.lineTo(84);
  65.             dummy.graphics.lineTo(80);
  66.             dummy.graphics.lineTo(207);
  67.             dummy.graphics.lineTo(814);
  68.             dummy.graphics.lineTo(810);
  69.             dummy.graphics.lineTo(210);
  70.             dummy.graphics.lineTo(24);
  71.             
  72.             var matrix:Matrix;
  73.             var i:int = ROT_STEPS;
  74.             while (i--)
  75.             {
  76.                 matrix = new Matrix();
  77.                 matrix.translate( -11, -11);
  78.                 matrix.rotate( ( 360 / ROT_STEPS * i )* Math.PI / 180);
  79.                 matrix.translate( 1111);
  80.                 rotArr[i] = new BitmapData(2222true, 0x0);
  81.                 rotArr[i].draw(dummy, matrix);
  82.             }
  83.             
  84.             // パーティクルを生成します
  85.             for (i = 0; i < NUM_PARTICLE; i++) {
  86.                 var px:Number = Math.random() * 465;
  87.                 var py:Number = Math.random() * 465;
  88.                 particleList[i] = new Arrow(px, py);
  89.                 world.addChild(particleList[i]);
  90.             }
  91.             
  92.             // デバッグ用のスタッツを表示しています
  93.             addChild(new Stats);
  94.         }
  95.         
  96.         private function loop( e:Event ):void {
  97.             
  98.             var len:uint = particleList.length;
  99.             var col:Number;
  100.             
  101.             for (var i:uint = 0; i < len; i++) {
  102.                 
  103.                 var arrow:Arrow = particleList[i];
  104.                 
  105.                 var oldX:Number = arrow.x;
  106.                 var oldY:Number = arrow.y;
  107.                 
  108.                 col = forceMap.getPixel( arrow.x >> 1, arrow.y >> 1);
  109.                 arrow.ax += ( (col      & 0xff) - 0x80 ) * .0005;
  110.                 arrow.ay += ( (col >> 8 & 0xff) - 0x80 ) * .0005;
  111.                 arrow.vx += arrow.ax;
  112.                 arrow.vy += arrow.ay;
  113.                 arrow.x += arrow.vx;
  114.                 arrow.y += arrow.vy;
  115.                 
  116.                 var _posX:Number = arrow.x;
  117.                 var _posY:Number = arrow.y;
  118.                 
  119.                 var rot:Number = - Math.atan2((_posX - oldX), (_posY - oldY)) * 180 / Math.PI + 90;
  120.                 var angle:int = rot / 360 * ROT_STEPS | 0;
  121.                 // Math.absの高速化ね
  122.                 angle = (angle ^ (angle >> 31)) - (angle >> 31);
  123.                 arrow.rot += (angle - arrow.rot) * 0.2;
  124.                 arrow.bitmapData = rotArr[arrow.rot];
  125.                     
  126.                 arrow.ax *= .96;
  127.                 arrow.ay *= .96;
  128.                 arrow.vx *= .92;
  129.                 arrow.vy *= .92;
  130.                 
  131.                 // あと配置座標を整数化しておきます
  132.                 arrow.x = arrow.x | 0;
  133.                 arrow.y = arrow.y | 0;
  134.                 
  135.                 ( _posX > 465 ) ? arrow.x = 0 :
  136.                     ( _posX < 0 ) ? arrow.x = 465 : 0;
  137.                 ( _posY > 465 ) ? arrow.y = 0 :
  138.                     ( _posY < 0 ) ? arrow.y = 465 : 0;
  139.             }
  140.         }
  141.         
  142.         private function resetFunc(e:Event = null):void{
  143.             forceMap.perlinNoise(1171173, seed, falsetrue6false, offset);
  144.             
  145.             offset[0].x += 1.5;
  146.             offset[1].y += 1;
  147.             seed = Math.floor( Math.random() * 0xFFFFFF );
  148.         }
  149.     }
  150. }
  151. import flash.display.*;
  152. class Arrow extends Bitmap
  153. {
  154.     public var rot:int = 0;
  155.     public var vx:Number = 0;
  156.     public var vy:Number = 0;
  157.     public var ax:Number = 0;
  158.     public var ay:Number = 0;
  159.     function Arrow( x:Number, y:Number) {
  160.         this.x = x;
  161.         this.y = y;
  162.     }
  163. }
noswf
  1. // forked from clockmaker's BitmapDataで配列に格納すると高速化するよ
  2. // forked from clockmaker's 3D Flow Simulation with Field of Blur
  3. // forked from clockmaker's 3D Flow Simulation
  4. // forked from clockmaker's Interactive Liquid 10000
  5. // forked from clockmaker's Liquid110000 By Vector
  6. // forked from munegon's forked from: forked from: forked from: forked from: Liquid10000
  7. // forked from Saqoosha's forked from: forked from: forked from: Liquid10000
  8. // forked from nutsu's forked from: forked from: Liquid10000
  9. // forked from nutsu's forked from: Liquid10000
  10. // forked from zin0086's Liquid10000
  11. package 
  12. {
  13.     /**
  14.      * 矢印がいっぱいなんだけど、高速なデモ
  15.      * 画質はディフォルトの StageQuality.HIGH で
  16.      * 矢印 1000個
  17.      * @author Yasu
  18.      */
  19.     import flash.display.*;
  20.     import flash.geom.*;
  21.     import flash.events.*;
  22.     import flash.utils.*;
  23.     import flash.geom.*;
  24.     import net.hires.debug.Stats;
  25.     
  26.     [SWF(width="465", height="465", backgroundColor="0xFFFFFF")]
  27.     public class Main extends Sprite {
  28.         private const NUM_PARTICLE:uint = 1000;
  29.         private const ROT_STEPS:int = 120;
  30.         
  31.         private var forceMap:BitmapData = new BitmapData( 233233false, 0x000000 );
  32.         private var randomSeed:uint = Math.floor( Math.random() * 0xFFFF );
  33.         private var particleList:Vector.<Arrow> = new Vector.<Arrow>(NUM_PARTICLE, true);
  34.         private var rect:Rectangle = new Rectangle( 00465465 );
  35.         private var seed:Number = Math.floor( Math.random() * 0xFFFF );
  36.         private var offset:Array = [new Point(), new Point()];
  37.         private var timer:Timer;
  38.         private var world:Sprite = new Sprite();
  39.         private var rotArr:Vector.<BitmapData> = new Vector.<BitmapData>(ROT_STEPS, true);
  40.         public function Main() {
  41.             
  42.             stage.align = StageAlign.TOP_LEFT;
  43.             stage.scaleMode = StageScaleMode.NO_SCALE;
  44.             stage.frameRate = 60;
  45.             
  46.             addChild(world);
  47.             
  48.             // フォースマップの初期化をおこないます
  49.             resetFunc();
  50.             
  51.             // ループ処理
  52.             addEventListener( Event.ENTER_FRAME, loop );
  53.             
  54.             // 時間差でフォースマップと色変化の具合を変更しています
  55.             var timer:Timer = new Timer(1000)
  56.             timer.addEventListener(TimerEvent.TIMER, resetFunc);
  57.             timer.start();
  58.             
  59.             // 矢印をプレレンダリング
  60.             var dummy:Sprite = new Sprite();
  61.             dummy.graphics.beginFill(0xFFFFFF, 1);
  62.             dummy.graphics.lineStyle(1, 0x0, 1);
  63.             dummy.graphics.moveTo(24);
  64.             dummy.graphics.lineTo(84);
  65.             dummy.graphics.lineTo(80);
  66.             dummy.graphics.lineTo(207);
  67.             dummy.graphics.lineTo(814);
  68.             dummy.graphics.lineTo(810);
  69.             dummy.graphics.lineTo(210);
  70.             dummy.graphics.lineTo(24);
  71.             
  72.             var matrix:Matrix;
  73.             var i:int = ROT_STEPS;
  74.             while (i--)
  75.             {
  76.                 matrix = new Matrix();
  77.                 matrix.translate( -11, -11);
  78.                 matrix.rotate( ( 360 / ROT_STEPS * i )* Math.PI / 180);
  79.                 matrix.translate( 1111);
  80.                 rotArr[i] = new BitmapData(2222true, 0x0);
  81.                 rotArr[i].draw(dummy, matrix);
  82.             }
  83.             
  84.             // パーティクルを生成します
  85.             for (i = 0; i < NUM_PARTICLE; i++) {
  86.                 var px:Number = Math.random() * 465;
  87.                 var py:Number = Math.random() * 465;
  88.                 particleList[i] = new Arrow(px, py);
  89.                 world.addChild(particleList[i]);
  90.             }
  91.             
  92.             // デバッグ用のスタッツを表示しています
  93.             addChild(new Stats);
  94.         }
  95.         
  96.         private function loop( e:Event ):void {
  97.             
  98.             var len:uint = particleList.length;
  99.             var col:Number;
  100.             
  101.             for (var i:uint = 0; i < len; i++) {
  102.                 
  103.                 var arrow:Arrow = particleList[i];
  104.                 
  105.                 var oldX:Number = arrow.x;
  106.                 var oldY:Number = arrow.y;
  107.                 
  108.                 col = forceMap.getPixel( arrow.x >> 1, arrow.y >> 1);
  109.                 arrow.ax += ( (col      & 0xff) - 0x80 ) * .0005;
  110.                 arrow.ay += ( (col >> 8 & 0xff) - 0x80 ) * .0005;
  111.                 arrow.vx += arrow.ax;
  112.                 arrow.vy += arrow.ay;
  113.                 arrow.x += arrow.vx;
  114.                 arrow.y += arrow.vy;
  115.                 
  116.                 var _posX:Number = arrow.x;
  117.                 var _posY:Number = arrow.y;
  118.                 
  119.                 var rot:Number = - Math.atan2((_posX - oldX), (_posY - oldY)) * 180 / Math.PI + 90;
  120.                 var angle:int = rot / 360 * ROT_STEPS | 0;
  121.                 // Math.absの高速化ね
  122.                 angle = (angle ^ (angle >> 31)) - (angle >> 31);
  123.                 arrow.rot += (angle - arrow.rot) * 0.2;
  124.                 arrow.bitmapData = rotArr[arrow.rot];
  125.                     
  126.                 arrow.ax *= .96;
  127.                 arrow.ay *= .96;
  128.                 arrow.vx *= .92;
  129.                 arrow.vy *= .92;
  130.                 
  131.                 // あと配置座標を整数化しておきます
  132.                 arrow.x = arrow.x | 0;
  133.                 arrow.y = arrow.y | 0;
  134.                 
  135.                 ( _posX > 465 ) ? arrow.x = 0 :
  136.                     ( _posX < 0 ) ? arrow.x = 465 : 0;
  137.                 ( _posY > 465 ) ? arrow.y = 0 :
  138.                     ( _posY < 0 ) ? arrow.y = 465 : 0;
  139.             }
  140.         }
  141.         
  142.         private function resetFunc(e:Event = null):void{
  143.             forceMap.perlinNoise(1171173, seed, falsetrue6false, offset);
  144.             
  145.             offset[0].x += 1.5;
  146.             offset[1].y += 1;
  147.             seed = Math.floor( Math.random() * 0xFFFFFF );
  148.         }
  149.     }
  150. }
  151. import flash.display.*;
  152. class Arrow extends Bitmap
  153. {
  154.     public var rot:int = 0;
  155.     public var vx:Number = 0;
  156.     public var vy:Number = 0;
  157.     public var ax:Number = 0;
  158.     public var ay:Number = 0;
  159.     function Arrow( x:Number, y:Number) {
  160.         this.x = x;
  161.         this.y = y;
  162.     }
  163. }
noswf

BitmapDataで配列に格納すると高速化するよ forked from: BitmapDataで配列に格納すると高速化するよ [diff(5)]

  1. // forked from clockmaker's BitmapDataで配列に格納すると高速化するよ
  2. // forked from clockmaker's 3D Flow Simulation with Field of Blur
  3. // forked from clockmaker's 3D Flow Simulation
  4. // forked from clockmaker's Interactive Liquid 10000
  5. // forked from clockmaker's Liquid110000 By Vector
  6. // forked from munegon's forked from: forked from: forked from: forked from: Liquid10000
  7. // forked from Saqoosha's forked from: forked from: forked from: Liquid10000
  8. // forked from nutsu's forked from: forked from: Liquid10000
  9. // forked from nutsu's forked from: Liquid10000
  10. // forked from zin0086's Liquid10000
  11. package 
  12. {
  13.     /**
  14.      * 矢印がいっぱいなんだけど、高速なデモ
  15.      * 画質はディフォルトの StageQuality.HIGH で
  16.      * 矢印 1000個
  17.      * @author Yasu
  18.      */
  19.     import flash.display.*;
  20.     import flash.geom.*;
  21.     import flash.events.*;
  22.     import flash.utils.*;
  23.     import flash.geom.*;
  24.     import net.hires.debug.Stats;
  25.     
  26.     [SWF(width="465", height="465", backgroundColor="0xFFFFFF")]
  27.     public class Main extends Sprite {
  28.         private const NUM_PARTICLE:uint = 1000;
  29.         private const ROT_STEPS:int = 120;
  30.         
  31.         private var forceMap:BitmapData = new BitmapData( 233233false, 0x000000 );
  32.         private var randomSeed:uint = Math.floor( Math.random() * 0xFFFF );
  33.         private var particleList:Vector.<Arrow> = new Vector.<Arrow>(NUM_PARTICLE, true);
  34.         private var rect:Rectangle = new Rectangle( 00465465 );
  35.         private var seed:Number = Math.floor( Math.random() * 0xFFFF );
  36.         private var offset:Array = [new Point(), new Point()];
  37.         private var timer:Timer;
  38.         private var world:Sprite = new Sprite();
  39.         private var rotArr:Vector.<BitmapData> = new Vector.<BitmapData>(ROT_STEPS, true);
  40.         public function Main() {
  41.             
  42.             stage.align = StageAlign.TOP_LEFT;
  43.             stage.scaleMode = StageScaleMode.NO_SCALE;
  44.             stage.frameRate = 60;
  45.             
  46.             addChild(world);
  47.             
  48.             // フォースマップの初期化をおこないます
  49.             resetFunc();
  50.             
  51.             // ループ処理
  52.             addEventListener( Event.ENTER_FRAME, loop );
  53.             
  54.             // 時間差でフォースマップと色変化の具合を変更しています
  55.             var timer:Timer = new Timer(1000)
  56.             timer.addEventListener(TimerEvent.TIMER, resetFunc);
  57.             timer.start();
  58.             
  59.             // 矢印をプレレンダリング
  60.             var dummy:Sprite = new Sprite();
  61.             dummy.graphics.beginFill(0xFFFFFF, 1);
  62.             dummy.graphics.lineStyle(1, 0x0, 1);
  63.             dummy.graphics.moveTo(24);
  64.             dummy.graphics.lineTo(84);
  65.             dummy.graphics.lineTo(80);
  66.             dummy.graphics.lineTo(207);
  67.             dummy.graphics.lineTo(814);
  68.             dummy.graphics.lineTo(810);
  69.             dummy.graphics.lineTo(210);
  70.             dummy.graphics.lineTo(24);
  71.             
  72.             var matrix:Matrix;
  73.             var i:int = ROT_STEPS;
  74.             while (i--)
  75.             {
  76.                 matrix = new Matrix();
  77.                 matrix.translate( -9, -9);
  78.                 matrix.rotate( (180 / ROT_STEPS * i )* Math.PI / 90);
  79.                 matrix.translate( 99);
  80.                 rotArr[i] = new BitmapData(1818, 0x0, 0x0);
  81.                 rotArr[i].draw(dummy, matrix);
  82.             }
  83.             
  84.             // パーティクルを生成します
  85.             for (i = 0; i < NUM_PARTICLE; i++) {
  86.                 var px:Number = Math.random() * 465;
  87.                 var py:Number = Math.random() * 465;
  88.                 particleList[i] = new Arrow(px, py);
  89.                 world.addChild(particleList[i]);
  90.             }
  91.             
  92.             // デバッグ用のスタッツを表示しています
  93.             addChild(new Stats);
  94.         }
  95.         
  96.         private function loop( e:Event ):void {
  97.             
  98.             var len:uint = particleList.length;
  99.             var col:Number;
  100.             
  101.             for (var i:uint = 0; i < len; i++) {
  102.                 
  103.                 var arrow:Arrow = particleList[i];
  104.                 
  105.                 var oldX:Number = arrow.x;
  106.                 var oldY:Number = arrow.y;
  107.                 
  108.                 col = forceMap.getPixel( arrow.x >> 1, arrow.y >> 1);
  109.                 arrow.ax += ( (col      & 0xff) - 0x80 ) * .0005;
  110.                 arrow.ay += ( (col >> 8 & 0xff) - 0x80 ) * .0005;
  111.                 arrow.vx += arrow.ax;
  112.                 arrow.vy += arrow.ay;
  113.                 arrow.x += arrow.vx;
  114.                 arrow.y += arrow.vy;
  115.                 
  116.                 var _posX:Number = arrow.x;
  117.                 var _posY:Number = arrow.y;
  118.                 
  119.                 var rot:Number = - Math.atan2((_posX - oldX), (_posY - oldY)) * 180 / Math.PI + 90;
  120.                 var angle:int = rot / 360 * ROT_STEPS | 0;
  121.                 // Math.absの高速化ね
  122.                 angle = (angle ^ (angle >> 31)) - (angle >> 31);
  123.                 arrow.rot += (angle - arrow.rot) * 0.2;
  124.                 arrow.bitmapData = rotArr[arrow.rot];
  125.                     
  126.                 arrow.ax *= .96;
  127.                 arrow.ay *= .96;
  128.                 arrow.vx *= .92;
  129.                 arrow.vy *= .92;
  130.                 
  131.                 // あと配置座標を整数化しておきます
  132.                 arrow.x = arrow.x | 0;
  133.                 arrow.y = arrow.y | 0;
  134.                 
  135.                 ( _posX > 465 ) ? arrow.x = 0 :
  136.                     ( _posX < 0 ) ? arrow.x = 465 : 0;
  137.                 ( _posY > 465 ) ? arrow.y = 0 :
  138.                     ( _posY < 0 ) ? arrow.y = 465 : 0;
  139.             }
  140.         }
  141.         
  142.         private function resetFunc(e:Event = null):void{
  143.             forceMap.perlinNoise(1171173, seed, falsetrue6false, offset);
  144.             
  145.             offset[0].x += 1.5;
  146.             offset[1].y += 1;
  147.             seed = Math.floor( Math.random() * 0xFFFFFF );
  148.         }
  149.     }
  150. }
  151. import flash.display.*;
  152. class Arrow extends Bitmap
  153. {
  154.     public var rot:int = 0;
  155.     public var vx:Number = 0;
  156.     public var vy:Number = 0;
  157.     public var ax:Number = 0;
  158.     public var ay:Number = 0;
  159.     function Arrow( x:Number, y:Number) {
  160.         this.x = x;
  161.         this.y = y;
  162.     }
  163. }
noswf
Get Adobe Flash Player