PerlinForce.as
上传用户:shuntian
上传日期:2021-04-12
资源大小:5k
文件大小:7k
源码类别:

FlashMX/Flex源码

开发平台:

Flash/ActionScript

  1. package
  2. {
  3.         import flash.display.*;
  4.         import flash.events.*;
  5.         import flash.geom.*;
  6.         import flash.text.TextField;
  7.         import flash.utils.*;
  8.         
  9.         public class PerlinForce extends Sprite
  10.         {
  11.                 private const origin: Point = new Point();
  12.                 
  13.                 private const w: int = 256;
  14.                 private const h: int = 256;
  15.                 
  16.                 private const x1: Matrix = new Matrix( 1, 0, 0, 1, 0, 0 );
  17.                 private const x2: Matrix = new Matrix( 2, 0, 0, 2, 0, 0 );
  18.                 
  19.                 //-- fps
  20.                 private var fpsText:TextField;
  21.                 private var fr: int;
  22.                 private var ms: int;
  23.                 
  24.                 private var force_s: BitmapData;
  25.                 private var force_b: BitmapData;
  26.                 
  27.                 private var forceOffsets: Array;
  28.                 private var points: Array;
  29.                 
  30.                 private var buffer: BitmapData;
  31.                 private var output: BitmapData;
  32.                 private var damp: ColorTransform;
  33.                 private var fxm: Matrix;
  34.                 
  35.                 public function PerlinForce()
  36.                 {
  37.                         init();
  38.                         
  39.                         fpsText = new TextField();
  40.                         fpsText.autoSize = 'left';
  41.                         fpsText.textColor = 0xefefef;
  42.                         addChild( fpsText );
  43.                         ms = getTimer();
  44.                         fr = 0;
  45.                 }
  46.                 
  47.                 private function init(): void
  48.                 {
  49.                         output = new BitmapData( w, h, false, 0 );
  50.                         buffer = new BitmapData( w, h, false, 0 );
  51.                         
  52.                         var scl: Number = .25;
  53.                         
  54.                         fxm = new Matrix();
  55.                          fxm.a = ( w + scl ) / w;
  56.                         fxm.d = ( h + scl ) / h;
  57.                         fxm.tx = -scl / 1;
  58.                         damp = new ColorTransform( 1, 1, 1, 1, -4, -4, -4, 0 );
  59.                         
  60.                         force_s = new BitmapData( 128, 128, false, 0 );
  61.                         force_b = new BitmapData( w, h, false, 0 );
  62.                         
  63.                         addChild( new Bitmap( output ) );
  64.                         
  65.                         points = new Array();
  66.                         
  67.                         var point: Object;
  68.                         var i: Number = 6000;
  69.                         while( --i > -1 )
  70.                         {
  71.                                 point = { sx: w / 4 + Math.random() * w / 2, sy: h / 4 + Math.random() * h / 2, vx: 0, vy: 0 };
  72.                         
  73.                                 points.push( point );
  74.                                  }
  75.                 
  76.                         forceOffsets = [ new Point() ];
  77.                 
  78.                         stage.addEventListener( 'enterFrame', run );
  79.                 }
  80.                 
  81.                 private function run( event: Event ): void
  82.                 {
  83.                         forceOffsets[0].x++;
  84.                         forceOffsets[0].y++;
  85.                         
  86.                         force_s.perlinNoise( 100, 100, 1, 0, true, true, 6, false, forceOffsets );
  87.                         force_b.draw( force_s, x2, null, null, null, true );
  88.                         
  89.                         //-- move points with respect to force
  90.                         var point: Object;
  91.                         
  92.                         var sx: Number;
  93.                         var sy: Number;
  94.                         var vx: Number;
  95.                          var vy: Number;
  96.                         
  97.                         var c: int;
  98.                         var i: Number = points.length;
  99.                         while( --i > -1 )
  100.                         {
  101.                                 point = points[i];
  102.                         
  103.                                 sx = point.sx;
  104.                                 sy = point.sy;
  105.                                 vx = point.vx;
  106.                                 vy = point.vy;
  107.                         
  108.                                 c = force_b.getPixel( sx | 0, sy | 0 );
  109.                                 
  110.                                 vx += ( ( ( c >> 8 ) & 0xff ) - 0x80 ) / 256;
  111.                                 vy += ( ( c & 0xff ) - 0x70 ) / 256;
  112.                                 vx *= .97;
  113.                                 vy *= .97;
  114.                                 
  115.                                 sx += vx;
  116.                                 sy += vy;
  117.                         
  118.                                 if( sx < 0 )
  119.                                 {
  120.                                         sx = 0;
  121.                                         vx *= -( Math.random() + 1 );
  122.                                 }
  123.                                 if( sx > w )
  124.                                 {
  125.                                         sx = w;
  126.                                         vx *= -( Math.random() + 1 );
  127.                                 }
  128.                                 if( sy < 0 )
  129.                                 {
  130.                                         sy = 0;
  131.                                         vy *= -( Math.random() + 1 );
  132.                                 }
  133.                                 if( sy > h )
  134.                                 {
  135.                                         sy = h;
  136.                                         vy *= -( Math.random() + 1 );
  137.                                 }
  138.                                 
  139.                                 point.sx = sx;
  140.                                  point.sy = sy;
  141.                                 point.vx = vx;
  142.                                 point.vy = vy;
  143.                                 
  144.                                 buffer.setPixel( sx | 0, sy | 0, 0x66ffff );
  145.                         }
  146.                         
  147.                         buffer.draw( buffer, fxm, damp, null, null, true );
  148.                         
  149.                         output.copyPixels( buffer, buffer.rect, origin );
  150.                         
  151.                         //– fps
  152.                         fr++;
  153.                         if( ms + 1000 < getTimer() )
  154.                         {
  155.                                 fpsText.text = fr.toString();
  156.                                 fr = 0;
  157.                                 ms = getTimer();
  158.                         }
  159.                 }
  160.         }
  161. }