守望者--AIR技术交流

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

搜索
热搜: ANE FlasCC 炼金术
查看: 1260|回复: 1

[华丽特效] Fluid on the Video 特效

[复制链接]
  • TA的每日心情
    擦汗
    2018-4-10 15:18
  • 签到天数: 447 天

    [LV.9]以坛为家II

    1742

    主题

    2094

    帖子

    13万

    积分

    超级版主

    Rank: 18Rank: 18Rank: 18Rank: 18Rank: 18

    威望
    562
    贡献
    29
    金币
    52681
    钢镚
    1422

    开源英雄守望者

    发表于 2015-7-15 16:21:20 | 显示全部楼层 |阅读模式





    1. /**
    2. * Copyright alumican_net ( http://wonderfl.net/user/alumican_net )
    3. * MIT License ( http://www.opensource.org/licenses/mit-license.php )
    4. * Downloaded from: http://wonderfl.net/c/wM1h
    5. */

    6. /**
    7. * Fluid on the Video
    8. *
    9. * @author http://alumican.net
    10. *
    11. * 動画はこちらからお借りしています
    12. * http://www.nicovideo.jp/watch/sm3605606
    13. */
    14. package
    15. {
    16.     import flash.display.Bitmap;
    17.     import flash.display.BitmapData;
    18.     import flash.display.BlendMode;
    19.     import flash.display.Graphics;
    20.     import flash.display.Sprite;
    21.     import flash.events.Event;
    22.     import flash.events.MouseEvent;
    23.     import flash.events.NetStatusEvent;
    24.     import flash.filters.BlurFilter;
    25.     import flash.filters.ColorMatrixFilter;
    26.     import flash.filters.DisplacementMapFilter;
    27.     import flash.geom.Matrix;
    28.     import flash.geom.Point;
    29.     import flash.geom.Rectangle;
    30.     import flash.media.SoundTransform;
    31.     import flash.media.Video;
    32.     import flash.net.NetConnection;
    33.     import flash.net.NetStream;
    34.     import flash.text.TextField;
    35.     import flash.text.TextFieldAutoSize;
    36.     import flash.text.TextFormat;
    37.    
    38.    
    39. //    import net.hires.debug.Stats;
    40.     [SWF(width="465", height="465", backgroundColor="0x000000", frameRate="30")]
    41.     public class LiquidVideo extends Sprite
    42.     {
    43.         //CLASS CONSTANTS
    44.         private const MAP_WIDTH:Number        = 465;
    45.         private const MAP_HEIGHT:Number       = 465;
    46.         private const MAP_GRID_SIZE:Number    = 20;
    47.         private const MAP_FLOW_SIZE:Number    = 2;
    48.         private const MAP_INTENSITY:Number    = 0.25;
    49.         private const MAP_SCALE:Number        = 150;
    50.         private const MAP_USE_DECAY:Boolean   = true;
    51.         private const MAP_BLUR_INTENSITY:uint = 32;
    52.         private const MAP_BLUR_QUALITY:uint   = 2;
    53.         
    54.         private const ZERO_POINT:Point = new Point(0,0);
    55.         
    56.         //VARIABLES
    57.         private var _container:Sprite;
    58.         
    59.         private var _canvas:BitmapData;
    60.         private var _canvasTone:ColorMatrixFilter;
    61.         
    62.         private var _fluidMap:FluidMap;
    63.         private var _fluidBmp:Bitmap;
    64.         
    65.         private var _mapBmd:BitmapData;
    66.         private var _mapFilter:DisplacementMapFilter;
    67.         
    68.         private var _oldX:Number = 0;
    69.         private var _oldY:Number = 0;
    70.         private var _isMouseMove:Boolean = false;
    71.         
    72.         private var _ns:NetStream;
    73.         private var _nc:NetConnection;
    74.         private var _video:Video;
    75.         private var _videoMatrix:Matrix;
    76.         
    77.         private var _background:Sprite;
    78.         
    79. //        private var _stats:Stats;
    80.         private var _usage:TextField;
    81.         
    82.         /////////particle
    83.         private var _mirrorBmp:Bitmap = new Bitmap();
    84.         private var _mirrorBmd:BitmapData = new BitmapData(465,465,false,0);
    85.         private var _mirrorMtx:Matrix;
    86.         private var _transPoint:Point = new Point(465/2, 465/2);
    87.         
    88.         private var _particleLayer:Sprite = new Sprite();
    89.         
    90.         private var _particles:Array = [];
    91.         private var _emitter:Emitter;
    92.         // 1フレーム間に発生させる Particle 数
    93.         private const PARTICLE_NUM:uint = 1;
    94.         
    95.         private var _blustLayer:Sprite = new Sprite();
    96.         
    97.         private var _mixPoint:Sprite = new Sprite();
    98.         private var _mixcounter:int = 0;
    99.         
    100.         //CONSTRUCTOR
    101.         public function LiquidVideo():void
    102.         {
    103. //            Wonderfl.disable_capture();
    104.             addEventListener(Event.ADDED_TO_STAGE, _initialize);
    105.         }
    106.         
    107.         //METHODS
    108.         private function _initialize(e:Event):void
    109.         {
    110.             removeEventListener(Event.ADDED_TO_STAGE, _initialize);
    111.             addChild(_blustLayer);
    112.             
    113.             _background = new Sprite();
    114.             addChild(_background);
    115.             
    116.             _container = new Sprite();
    117.             addChild(_container);
    118.             
    119.             _canvas = new BitmapData(MAP_WIDTH, MAP_HEIGHT, false, 0xffffff);
    120.             _fluidMap = new FluidMap(MAP_WIDTH, MAP_HEIGHT, MAP_GRID_SIZE, MAP_FLOW_SIZE, MAP_INTENSITY, MAP_USE_DECAY, MAP_SCALE, MAP_BLUR_INTENSITY, MAP_BLUR_QUALITY);
    121.             
    122.             _container.addChild(new Bitmap(_canvas));
    123. //            _container.addChild(new Bitmap(_fluidMap._mapBmd));
    124.             
    125.             _mapFilter = _fluidMap.mapFilter;
    126.             
    127.             _canvasTone = new ColorMatrixFilter([
    128.                 1, 0, 0, 0, 5,
    129.                 0, 1, 0, 0, 5,
    130.                 0, 0, 1, 0, 5,
    131.                 0, 0, 0, 0, 0
    132.             ]);
    133.             
    134. //            _stats = new Stats( {
    135. //                bg:0xffffff,
    136. //                fps:0x333333,
    137. //                ms:0x333333,
    138. //                mem:0x333333,
    139. //                memmax:0x333333
    140. //            });
    141. //            _stats.blendMode = BlendMode.DARKEN;
    142. //            addChild(_stats);
    143.             
    144.             _usage = new TextField();
    145.             _usage.defaultTextFormat = new TextFormat("MS Gothic", 11, 0x0);
    146.             _usage.text = "Move mouse on movie";
    147.             _usage.autoSize = TextFieldAutoSize.RIGHT;
    148.             _usage.selectable = false;
    149.             _usage.blendMode = BlendMode.INVERT;
    150.             _usage.visible = false;
    151.             _container.addChild(_usage);
    152.             
    153.             stage.addEventListener(Event.RESIZE, _resizeHandler);
    154.             
    155.             _resizeHandler();
    156.             setup();
    157.             addEventListener(Event.ENTER_FRAME, _update);
    158. //            addChild(_blustLayer);
    159.         }

    160. //--------------------------------------------------------------------------------//
    161. //        パーティクル
    162. //--------------------------------------------------------------------------------//   
    163.         
    164.         private function setup():void
    165.         {
    166.                _mirrorBmp.bitmapData = _mirrorBmd;
    167.                _blustLayer.addChild(_mirrorBmp);
    168.            
    169.             _emitter = new Emitter();
    170.             _blustLayer.addChild(_particleLayer);
    171.             _particleLayer.addChild(_emitter);
    172.             
    173.             for (var i:uint = 0; i < 100; i++) {
    174.                 _particles.push(new Particle());
    175.             }

    176.             addEventListener(Event.ENTER_FRAME, draw);
    177.             stage.addEventListener(MouseEvent.MOUSE_MOVE, _mouseMoveHandler);
    178.             
    179.             stage.addEventListener(MouseEvent.MOUSE_DOWN, mouseDown);
    180.         }
    181.         
    182.         private function draw(event:Event):void
    183.         {
    184.             _emitter.update();

    185.             for each (var p:Particle in _particles) {
    186.                 if (!p.destroy) {
    187.                     if (p.y >= 10) {
    188. //                           p.vy *= -0.9;
    189. //                        p.vx *= -0.9
    190.                     }
    191.                     p.update();
    192.                 }
    193.             }
    194.             
    195.             //拡大反射
    196.             _mirrorMtx = new Matrix();
    197.             var ram:Number = 10+2*Math.random();
    198.             _mirrorMtx.translate(-_transPoint.x, -_transPoint.y);
    199.             _mirrorMtx.scale(ram,ram);
    200.             _mirrorMtx.translate(_transPoint.x, _transPoint.y);
    201.             _mirrorBmd.fillRect(_mirrorBmd.rect, 0x00000000);
    202.             _mirrorBmd.draw( _particleLayer, _mirrorMtx);
    203.             
    204.         }
    205.         
    206.         private function mouseDown(event:MouseEvent):void
    207.         {
    208.             addEventListener(Event.ENTER_FRAME, createParticle);
    209.             stage.addEventListener(MouseEvent.MOUSE_UP, mouseUp);
    210.             _transPoint.x = mouseX;
    211.             _transPoint.y = mouseY;
    212.             
    213.         }

    214.         private function mouseUp(event:MouseEvent):void
    215.         {
    216.             stage.removeEventListener(MouseEvent.MOUSE_UP, mouseUp);
    217.             removeEventListener(Event.ENTER_FRAME, createParticle);
    218.             Wonderfl.disable_capture();
    219.         }
    220.         
    221.         private function createParticle(event:Event):void
    222.         {
    223.             var count:uint = 0;
    224.             for each (var p:Particle in _particles) {
    225.                 // 停止している Particle を探す
    226.                 if (p.destroy) {
    227.                     p.x = _emitter.x;
    228.                     p.y = _emitter.y;
    229.                     p.init();
    230.                     _particleLayer.addChild(p);
    231.                     count++;
    232.                 }
    233.                 if (count > PARTICLE_NUM) break;
    234.             }
    235.         }

    236. //--------------------------------------------------------------------------------//
    237. //        流体
    238. //--------------------------------------------------------------------------------//        

    239.         private function _drawCanvas():void
    240.         {
    241.             _canvas.lock();
    242.             _canvas.applyFilter(_canvas, _canvas.rect, ZERO_POINT, _canvasTone);
    243.             _canvas.draw(_blustLayer);
    244.             _canvas.applyFilter(_canvas, _canvas.rect, ZERO_POINT, _mapFilter);
    245.             _canvas.unlock();
    246.         }
    247.         
    248.         private function _refillBackground():void
    249.         {
    250.             var sw:int = stage.stageWidth;
    251.             var sh:int = stage.stageHeight;
    252.             
    253.             var g:Graphics = _background.graphics;
    254.             g.clear();
    255.             g.beginFill(0xffffff);
    256.             g.moveTo(0 , 0 );
    257.             g.lineTo(sw, 0 );
    258.             g.lineTo(sw, sh);
    259.             g.lineTo(0 , sh);
    260.             g.lineTo(0 , 0 );
    261.             g.endFill();
    262.         }
    263.         
    264.         private function _update(e:Event):void
    265.         {
    266.             var speedX:Number = _mixPoint.x - _oldX;
    267.             var speedY:Number = _mixPoint.y - _oldY;
    268.                
    269.             _fluidMap.addOrientedForce(_mixPoint.x, _mixPoint.y, speedX, speedY);
    270.                
    271.             _mixPoint.x = 466/2 + 20 * Math.cos(_mixcounter * Math.PI/180)
    272.             _mixPoint.y = 466/2 + 10*Math.random() + 100 * Math.sin(_mixcounter * Math.PI/180)
    273.             
    274.             _fluidMap.updateMap();
    275.             
    276.             _drawCanvas();
    277.             
    278.             _oldX = _mixPoint.x;
    279.             _oldY = _mixPoint.y;
    280.             
    281.             _mixcounter+=1+20*Math.random();
    282.         }
    283.         
    284.         private function _mouseMoveHandler(e:MouseEvent):void
    285.         {
    286.             _isMouseMove = true;
    287.         }
    288.         
    289.         private function _resizeHandler(e:Event = null):void
    290.         {
    291.             _refillBackground();
    292.             
    293.             _container.x = uint((stage.stageWidth  - MAP_WIDTH ) / 2);
    294.             _container.y = uint((stage.stageHeight - MAP_HEIGHT) / 2);
    295.             
    296. //            _stats.x = 2;
    297. //            _stats.y = stage.stageHeight - 45;
    298.         }
    299.     }
    300. }

    301. //--------------------------------------------------------------------------------//
    302. //        パーティクル関連クラス
    303. //--------------------------------------------------------------------------------//

    304. import flash.display.Sprite;
    305. import flash.display.GradientType;

    306. class Emitter extends Sprite
    307. {
    308.     public var vx:Number = 0;
    309.     public var vy:Number = 0;

    310.     public function Emitter(){}

    311.     public function update():void
    312.     {
    313.         var dx:Number = root.mouseX - x;
    314.         var dy:Number = root.mouseY - y;
    315.         var d:Number = Math.sqrt(dx*dx+dy*dy) * 0.2;
    316.         var rad:Number = Math.atan2(dy, dx);

    317.         vx += Math.cos(rad)*d;
    318.         vy += Math.sin(rad)*d;

    319.         vx *= 0.7;
    320.         vy *= 0.7;

    321.         x += vx;
    322.         y += vy;
    323.     }
    324. }


    325. import flash.filters.BlurFilter;
    326. import flash.geom.Matrix;
    327. import flash.display.SpreadMethod;

    328. class Particle extends Sprite
    329. {
    330.     public var vx:Number;
    331.     public var vy:Number;
    332.     public var life:Number;
    333.     public var size:Number;

    334.     private var _count:uint;
    335.     private var _destroy:Boolean;
    336.    
    337.     /**
    338.      * ブラウン運動関連
    339.      */
    340.     private var friction:Number = 0.99;
    341.     private var vectx:Number = -0.4;
    342.     private var vecty:Number = -0.8;
    343.     private var xrandom:Number = 0.8;
    344.     private var yrandom:Number = 0.3;

    345.     public function Particle()
    346.     {
    347.         size = Math.random() * 30;
    348.         
    349.         //白版
    350. //        var red:uint = Math.floor(Math.random()*10+246);
    351. //        var blue:uint = Math.floor(Math.random()*10+240);
    352. //        var green:uint = Math.floor(Math.random()*10+246);
    353.         //七色版
    354.         var red:uint = Math.floor(Math.random()*100+126);
    355.         var blue:uint = Math.floor(Math.random()*100+124);
    356.         var green:uint = Math.floor(Math.random()*246+10);
    357.         
    358.         var color:Number = (red << 16) | (green << 8) | (blue);
    359.         
    360.         var fillType:String = GradientType.RADIAL;
    361.         var colors:Array = [color , 0x000000];
    362.         var alphas:Array = [100, 100];
    363.         var ratios:Array = [0x00, 0xFF];
    364.         var mat:Matrix = new Matrix();
    365.         mat.createGradientBox(size * 2, size * 2, 0, -size, -size);
    366.         var spreadMethod:String = SpreadMethod.PAD;

    367.         graphics.clear();
    368.         graphics.beginGradientFill(fillType, colors, alphas, ratios, mat, spreadMethod);
    369.         graphics.drawCircle(0, 0, size);
    370.         graphics.endFill();
    371.         
    372.         // 大量のオブジェクトを重ねるとおかしくなる
    373.         blendMode = "add";

    374.         _destroy = true;
    375.     }

    376.     public function init():void
    377.     {
    378.         vx = Math.random() * 20 - 10;
    379.         vy = Math.random() * 20 - 10;
    380.         life = Math.random() * 20 + 10;
    381.         _count = 0;
    382.         _destroy = false;
    383.     }

    384.    
    385.     public function update():void
    386.     {
    387.         vx += Math.random()*xrandom + vectx;
    388.         vy += Math.random()*yrandom + vecty;
    389.         vx *= friction;
    390.         vy *= friction;
    391.         
    392.         x += vx;
    393.         y += vy;

    394.         _count++;
    395.         
    396.         // 死亡フラグ
    397.         if (life < _count) {
    398.             _destroy = true;
    399.             parent.removeChild(this);
    400.         }
    401.     }

    402.     public function get destroy():Boolean
    403.     {
    404.         return _destroy;
    405.     }
    406. }

    407. //--------------------------------------------------------------------------------//
    408. //        流体関連クラス
    409. //--------------------------------------------------------------------------------//
    410. import flash.display.Bitmap;
    411. import flash.display.BitmapData;
    412. import flash.display.BitmapDataChannel;
    413. import flash.filters.BlurFilter;
    414. import flash.filters.DisplacementMapFilter;
    415. import flash.filters.DisplacementMapFilterMode;
    416. import flash.geom.Point;
    417. import flash.geom.Rectangle;

    418. internal class FluidMap
    419. {
    420.     //CLASS CONSTANTS
    421.     private static const ZERO_POINT:Point = new Point(0, 0);
    422.    
    423.     //VARIABLES
    424.     private var _cells:Array;
    425.     private var _cellCount:uint;
    426.    
    427.     private var _allCells:Array;
    428.     private var _allCellCount:uint;
    429.    
    430.     private var _width:uint;
    431.     private var _height:uint;
    432.    
    433.     private var _widthCount:uint;
    434.     private var _heightCount:uint;
    435.    
    436.     private var _gridSize:uint;
    437.     private var _flowSize:Number;
    438.     private var _intensity:Number;
    439.     private var _useDecay:Boolean;
    440.    
    441.     public var _mapBmd:BitmapData;
    442.     private var _mapFilter:DisplacementMapFilter;
    443.     private var _mapScale:Number;
    444.     private var _mapBlurIntensity:uint;
    445.     private var _mapBlurQuality:uint;
    446.     private var _blurFilter:BlurFilter;
    447.    
    448.     private var _calculator:FluidCalculator;
    449.    
    450.     private var _colorAdjust:Number;
    451.     private var _distMin2:Number;
    452.     private var _flowSize2:Number;
    453.    
    454.     public function get mapFilter():DisplacementMapFilter { return _mapFilter; }
    455.    
    456.     //CONSTRUCTOR
    457.     public function FluidMap(
    458.         width:uint,
    459.         height:uint,
    460.         gridSize:uint         = 10,
    461.         flowSize:Number       = 2,
    462.         intensity:Number      = 0.25,
    463.         useDecay:Boolean      = true,
    464.         mapScale:Number       = 100,
    465.         mapBlurIntensity:uint = 32,
    466.         mapBlurQuality:uint   = 2
    467.     ):void
    468.     {
    469.         _width            = width;
    470.         _height           = height;
    471.         _gridSize         = gridSize;
    472.         _flowSize         = flowSize;
    473.         _useDecay         = useDecay;
    474.         _intensity        = intensity;
    475.         _mapScale         = mapScale;
    476.         _mapBlurIntensity = mapBlurIntensity;
    477.         _mapBlurQuality   = mapBlurQuality;
    478.         
    479.         _widthCount  = uint( Math.ceil(width  / gridSize) );
    480.         _heightCount = uint( Math.ceil(height / gridSize) );
    481.         
    482.         _allCellCount = _widthCount * _heightCount;
    483.         _allCells = new Array(_allCellCount);
    484.         var p:uint = 0;
    485.         
    486.                 var i:uint;
    487.                 var j:uint;
    488.                 var data:FluidMapData;
    489.                
    490.         var cells2d:Array = new Array(_widthCount);
    491.         for (i = 0; i < _widthCount; ++i)
    492.         {
    493.             cells2d[i] = new Array(_heightCount);
    494.             for (j = 0; j < _heightCount; ++j)
    495.             {
    496.                 data = new FluidMapData(i, j);
    497.                 cells2d[i][j] = data;
    498.                 _allCells[p] = data;
    499.                
    500.                 ++p;
    501.             }
    502.         }
    503.         
    504.         _cells = new Array();
    505.         
    506.         var w:uint = _widthCount  - 1;
    507.         var h:uint = _heightCount - 1;
    508.         var pi:uint = 0;
    509.         var pj:uint = 0;
    510.         for (i = 1; i < w; ++i)
    511.         {
    512.             for (j = 1; j < h; ++j)
    513.             {
    514.                 data = cells2d[i][j] as FluidMapData;
    515.                
    516.                 data.n00 = cells2d[i - 1][j - 1] as FluidMapData;
    517.                 data.n10 = cells2d[i    ][j - 1] as FluidMapData;
    518.                 data.n20 = cells2d[i + 1][j - 1] as FluidMapData;
    519.                
    520.                 data.n01 = cells2d[i - 1][j    ] as FluidMapData;
    521.                 data.n21 = cells2d[i + 1][j    ] as FluidMapData;
    522.                
    523.                 data.n02 = cells2d[i - 1][j + 1] as FluidMapData;
    524.                 data.n12 = cells2d[i    ][j + 1] as FluidMapData;
    525.                 data.n22 = cells2d[i + 1][j + 1] as FluidMapData;
    526.                
    527.                 if (pi != 0)
    528.                 {
    529.                     data.prev = cells2d[pi][pj] as FluidMapData;
    530.                     data.prev.next = data;
    531.                 }
    532.                
    533.                 _cells.push(data);
    534.                
    535.                 pi = i;
    536.                 pj = j;
    537.             }
    538.         }
    539.         _cellCount = _cells.length;
    540.         
    541.         _mapBmd = new BitmapData(_width, _height, false, 0x008080);
    542.         
    543.         _mapFilter = new DisplacementMapFilter();
    544.         _mapFilter.mapBitmap  = _mapBmd;
    545.         _mapFilter.mapPoint   = ZERO_POINT;
    546.         _mapFilter.componentX = BitmapDataChannel.GREEN;
    547.         _mapFilter.componentY = BitmapDataChannel.BLUE;
    548.         _mapFilter.mode       = DisplacementMapFilterMode.CLAMP;
    549.         _mapFilter.scaleX     = _mapScale;
    550.         _mapFilter.scaleY     = _mapScale;
    551.         
    552.         _blurFilter = new BlurFilter(_mapBlurIntensity, _mapBlurIntensity, _mapBlurQuality);
    553.         
    554.         _colorAdjust = -128 * _intensity;
    555.         _distMin2    = 4 * _gridSize * _gridSize;
    556.         _flowSize2   = _flowSize * _flowSize;
    557.         
    558.         _calculator = new FluidCalculator();
    559.     }
    560.    
    561.     //METHODS
    562.     public function addOrientedForce(x:uint, y:uint, forceX:Number = 0, forceY:Number = 0):void
    563.     {
    564.         var s:uint = _gridSize;
    565.         var n:uint = _cellCount;
    566.         var cell:FluidMapData = _cells[0] as FluidMapData;
    567.         
    568.         for (var i:uint = 0; i < n; ++i)
    569.         {
    570.             _calcOrientedForce(cell, x / s, y / s, forceX, forceY);
    571.             cell = cell.next;
    572.         }
    573.     }
    574.    
    575.     public function updateMap():BitmapData
    576.     {
    577.         var s:uint            = _gridSize;
    578.         var n:uint            = _cellCount;
    579.         var cell:FluidMapData = _cells[0] as FluidMapData;
    580.         var map:BitmapData    = _mapBmd;
    581.         
    582.         _decay();
    583.         _updatePressure();
    584.         _updateVelocity();
    585.         
    586.         map.lock();
    587.         map.fillRect(map.rect, 0x008080);
    588.         for (var i:uint = 0; i < n; ++i)
    589.         {
    590.             map.fillRect(
    591.                 new Rectangle(cell.x * s, cell.y * s, s, s),
    592.                 _calcMapColor(cell)
    593.             );
    594.             cell = cell.next;
    595.         }
    596.         map.applyFilter(map, map.rect, ZERO_POINT, _blurFilter);
    597.         map.unlock();
    598.         
    599.         return map;
    600.     }
    601.    
    602.     private function _decay():void
    603.     {
    604.         if (_useDecay)
    605.         {   
    606.             var n:uint = _allCellCount;
    607.             var cell:FluidMapData = _allCells[0] as FluidMapData;
    608.             
    609.             for (var i:uint = 0; i < n; ++i)
    610.             {
    611.                 _calcDecay(_allCells[i]);
    612.                 //cell = cell.next;
    613.             }
    614.         }
    615.     }
    616.    
    617.     private function _updatePressure():void
    618.     {
    619.         var n:uint = _cellCount;
    620.         var cell:FluidMapData = _cells[0] as FluidMapData;
    621.         
    622.         for (var i:uint = 0; i < n; ++i)
    623.         {
    624.             _calcPressure(cell);
    625.             cell = cell.next;
    626.         }
    627.     }
    628.    
    629.     private function _updateVelocity():void
    630.     {
    631.         var n:uint = _cellCount;
    632.         var cell:FluidMapData = _cells[0] as FluidMapData;
    633.         
    634.         for (var i:uint = 0; i < n; ++i)
    635.         {
    636.             _calcVelocity(cell);
    637.             cell = cell.next;
    638.         }
    639.     }
    640.    
    641.     private function _calcDecay(data:FluidMapData):void
    642.     {
    643.         var r:Number = data.colorX;
    644.         var b:Number = data.colorY;
    645.         
    646.         if (r != 128) data.colorX += (r < 128) ? 1 : -1;
    647.         if (b != 128) data.colorY += (b < 128) ? 1 : -1;
    648.     }
    649.    
    650.     private function _calcPressure(data:FluidMapData):void
    651.     {
    652.         data.pressure += _calculator.calcPressure(data);
    653.         data.pressure *= 0.7;
    654.     }
    655.    
    656.     private function _calcVelocity(data:FluidMapData):void
    657.     {
    658.         data.vx += _calculator.calcVelocityX(data);
    659.         data.vy += _calculator.calcVelocityY(data);
    660.         data.vx *= 0.7;
    661.         data.vy *= 0.7;
    662.     }
    663.    
    664.     private function _calcOrientedForce(data:FluidMapData, x:uint, y:uint, forceX:Number = 0, forceY:Number = 0):void
    665.     {
    666.         var dx:int       = data.x - x;
    667.         var dy:int       = data.y - y;
    668.         var dist2:Number = dx * dx + dy * dy;
    669.         
    670.         if (dist2 < _flowSize2)
    671.         {
    672.             var f:Number = (dist2 < _distMin2) ? 1.0 : (_flowSize / Math.sqrt(dist2));
    673.             
    674. //            data.vx += forceX * f;
    675. //            data.vy += forceY * f;
    676.             data.vx += 20*dx * f;
    677.             data.vy += 20*dy * f;
    678.         }
    679.     }
    680.    
    681.     private function _calcMapColor(data:FluidMapData):uint
    682.     {
    683.         var vx:Number = data.vx;
    684.         var vy:Number = data.vy;
    685.         var g:int  = data.colorX;
    686.         var b:int  = data.colorY;
    687.         
    688.         g = Math.round( _colorAdjust * vx + g );
    689.         b = Math.round( _colorAdjust * vy + b );
    690.         
    691.         g = (g < 0) ? 0 : (g > 255) ? 255 : g;
    692.         b = (b < 0) ? 0 : (b > 255) ? 255 : b;
    693.         
    694.         data.colorX = g;
    695.         data.colorY = b;
    696.         
    697.         return data.color = g << 8 | b;
    698.     }
    699. }

    700. internal class FluidCalculator
    701. {
    702.     //CONSTRUCTOR
    703.     public function FluidCalculator():void
    704.     {
    705.     }
    706.    
    707.     //METHODS
    708.     public function calcVelocityX(data:FluidMapData):Number
    709.     {
    710.         return (  data.n00.pressure * 0.5
    711.                 + data.n01.pressure
    712.                 + data.n02.pressure * 0.5
    713.                
    714.                 - data.n20.pressure * 0.5
    715.                 - data.n21.pressure
    716.                 - data.n22.pressure * 0.5
    717.                
    718.                 ) * 0.25;
    719.     }
    720.    
    721.     public function calcVelocityY(data:FluidMapData):Number
    722.     {
    723.         return (  data.n00.pressure * 0.5
    724.                 + data.n10.pressure
    725.                 + data.n20.pressure * 0.5
    726.                
    727.                 - data.n02.pressure * 0.5
    728.                 - data.n12.pressure
    729.                 - data.n22.pressure * 0.5
    730.                
    731.                 ) * 0.25;
    732.     }
    733.    
    734.     public function calcPressure(data:FluidMapData):Number
    735.     {
    736.         return (  data.n00.vx * 0.5
    737.                 + data.n01.vx
    738.                 + data.n02.vx * 0.5
    739.                 - data.n20.vx * 0.5
    740.                 - data.n21.vx
    741.                 - data.n22.vx * 0.5
    742.                
    743.                 + data.n00.vy * 0.5
    744.                 + data.n10.vy
    745.                 + data.n20.vy * 0.5
    746.                 - data.n02.vy * 0.5
    747.                 - data.n12.vy
    748.                 - data.n22.vy * 0.5
    749.                
    750.                 ) * 0.20;
    751.     }
    752. }

    753. internal class FluidMapData
    754. {
    755.     //VARIABLES
    756.     public function get x():uint { return _x; }
    757.     public function set x(value:uint):void { _x = value; }
    758.     private var _x:uint;
    759.    
    760.     public function get y():uint { return _y; }
    761.     public function set y(value:uint):void { _y = value; }
    762.     private var _y:uint;
    763.    
    764.     public function get vx():Number { return _vx; }
    765.     public function set vx(value:Number):void { _vx = value; }
    766.     private var _vx:Number;
    767.    
    768.     public function get vy():Number { return _vy; }
    769.     public function set vy(value:Number):void { _vy = value; }
    770.     private var _vy:Number;
    771.    
    772.     public function get pressure():Number { return _pressure; }
    773.     public function set pressure(value:Number):void { _pressure = value; }
    774.     private var _pressure:Number;
    775.    
    776.     public function get color():uint { return _color; }
    777.     public function set color(value:uint):void { _color = value; }
    778.     private var _color:uint;
    779.    
    780.     public function get colorX():uint { return _colorX; }
    781.     public function set colorX(value:uint):void { _colorX = value; }
    782.     private var _colorX:uint;
    783.    
    784.     public function get colorY():uint { return _colorY; }
    785.     public function set colorY(value:uint):void { _colorY = value; }
    786.     private var _colorY:uint;
    787.    
    788.     public function get next():FluidMapData { return _next; }
    789.     public function set next(value:FluidMapData):void { _next = value; }
    790.     private var _next:FluidMapData;
    791.    
    792.     public function get prev():FluidMapData { return _prev; }
    793.     public function set prev(value:FluidMapData):void { _prev = value; }
    794.     private var _prev:FluidMapData;
    795.    
    796.     private var _n00:FluidMapData;
    797.     private var _n01:FluidMapData;
    798.     private var _n02:FluidMapData;
    799.     private var _n10:FluidMapData;
    800.     private var _n12:FluidMapData;
    801.     private var _n20:FluidMapData;
    802.     private var _n21:FluidMapData;
    803.     private var _n22:FluidMapData;
    804.    
    805.     public function get n00():FluidMapData { return _n00; }
    806.     public function get n01():FluidMapData { return _n01; }
    807.     public function get n02():FluidMapData { return _n02; }
    808.     public function get n10():FluidMapData { return _n10; }
    809.     public function get n12():FluidMapData { return _n12; }
    810.     public function get n20():FluidMapData { return _n20; }
    811.     public function get n21():FluidMapData { return _n21; }
    812.     public function get n22():FluidMapData { return _n22; }
    813.    
    814.     public function set n00(value:FluidMapData):void { _n00 = value; }
    815.     public function set n01(value:FluidMapData):void { _n01 = value; }
    816.     public function set n02(value:FluidMapData):void { _n02 = value; }
    817.     public function set n10(value:FluidMapData):void { _n10 = value; }
    818.     public function set n12(value:FluidMapData):void { _n12 = value; }
    819.     public function set n20(value:FluidMapData):void { _n20 = value; }
    820.     public function set n21(value:FluidMapData):void { _n21 = value; }
    821.     public function set n22(value:FluidMapData):void { _n22 = value; }
    822.    
    823.     //CONSTRUCTOR
    824.     public function FluidMapData(x:uint, y:uint):void
    825.     {
    826.         _x        = x;
    827.         _y        = y;
    828.         _vx       = 0;
    829.         _vy       = 0;
    830.         _pressure = 0;
    831.         _color    = 0x008080;
    832.         _colorX   = 128;
    833.         _colorY   = 128;
    834.     }
    835. }
    复制代码





    本文来自:http://wonderfl.net/c/sFXf

    本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有帐号?立即注册

    x
    守望者AIR技术交流社区(www.airmyth.com)
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2019-2-24 01:34
  • 签到天数: 3 天

    [LV.2]偶尔看看I

    0

    主题

    38

    帖子

    868

    积分

    上士

    Rank: 5Rank: 5

    威望
    20
    贡献
    0
    金币
    14
    钢镚
    0
    发表于 2019-2-24 02:24:22 | 显示全部楼层
    感谢分享!~
    守望者AIR技术交流社区(www.airmyth.com)
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    
    关闭

    站长推荐上一条 /4 下一条

    QQ|手机版|Archiver|网站地图|小黑屋|守望者 ( 京ICP备14061876号

    GMT+8, 2024-4-16 15:51 , Processed in 0.049608 second(s), 31 queries .

    守望者AIR

    守望者AIR技术交流社区

    本站成立于 2014年12月31日

    快速回复 返回顶部 返回列表