守望者--AIR技术交流

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

搜索
热搜: ANE FlasCC 炼金术
查看: 718|回复: 0

[华丽特效] 切割图片特效

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

    [LV.9]以坛为家II

    1742

    主题

    2094

    帖子

    13万

    积分

    超级版主

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

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

    开源英雄守望者

    发表于 2015-7-15 15:47:52 | 显示全部楼层 |阅读模式





    1. // forked from miyaoka's Slicer implements GlowLine
    2. // 小さい面積のは対象にしないようにしたりBetweenAS3いれたりして高速化
    3. /*
    4. * GlowLine from
    5. * http://wonderfl.kayac.com/code/704630050881c4429dca8c7f27296b6e2fa3fa4f
    6. *
    7. * マウス押しっぱなしで切りまくるようにした
    8. */
    9. // forked from a24's Line slicer(割れるよ)
    10. // forked from a24's Line slicer
    11. // 切った後、割れるようにした
    12. package  
    13. {
    14.     import flash.display.Sprite;
    15.         import flash.display.DisplayObject;
    16.     import flash.geom.Point;
    17.     import flash.events.MouseEvent;
    18.     import flash.text.TextField;
    19.     import flash.text.TextFormat;
    20.     import flash.text.TextFormatAlign;
    21.     import flash.text.TextFieldAutoSize;
    22.     import flash.events.Event;
    23.     import net.hires.debug.Stats;
    24.    
    25.     [ SWF( width = "465" , height = "465" , backgroundColor = "0x000000" , frameRate = "60" ) ]

    26.     public class Slicer2 extends Sprite
    27.     {
    28.         private    var _container:Sprite = new Sprite();
    29.         private var isPress:Boolean;
    30.         private var counterTfd:TextField = new TextField;
    31.         
    32.         public function Slicer2()
    33.         {
    34.             graphics.beginFill(0);
    35.             graphics.drawRect(0, 0, stage.stageWidth, stage.stageHeight);
    36.             
    37. //            Wonderfl.capture_delay( 5 );
    38.             
    39.             var _pointArray:Array = [
    40.                 new Point( 0 , 0 ),
    41.                 new Point( 265 , 0 ),
    42.                 new Point( 265 , 265 ),
    43.                 new Point( 0 , 265 )
    44.             ];
    45.             
    46.             addChild( _container );
    47.             
    48.             //text
    49.             var tft:TextFormat = new TextFormat();
    50.             tft.align = TextFormatAlign.RIGHT;
    51.             tft.bold = true;
    52.             tft.font = "Verdana";
    53.             tft.color = 0xFFFFFF;
    54.             tft.letterSpacing = 5;
    55.             tft.size = 48;
    56.             
    57.             counterTfd.defaultTextFormat = tft;
    58.             counterTfd.autoSize = TextFieldAutoSize.RIGHT;
    59.             counterTfd.mouseEnabled = false;
    60.             counterTfd.x = stage.stageWidth -20;
    61.             counterTfd.y = stage.stageHeight - 60;
    62.             addChild(counterTfd);
    63.             
    64.             //stats
    65.             addChild(new Stats());
    66.             
    67.             
    68.             //evts
    69.             stage.addEventListener( MouseEvent.MOUSE_DOWN, function ():void
    70.             {
    71.                 isPress = true;
    72.                 while (_container.numChildren) _container.removeChildAt(0);
    73.                
    74.                 var _sliceObj:LineSliceObject = new LineSliceObject( stage , _pointArray ,
    75.                 (Math.random() * 0x99 + 0x66) << 16 |
    76.                 (Math.random() * 0x99 + 0x66) << 8 |
    77.                 (Math.random() * 0x99 + 0x66)
    78.                 );
    79.                 _sliceObj.x = _sliceObj.y = 100;
    80.                 _container.addChild( _sliceObj );
    81.             });
    82.             stage.addEventListener( MouseEvent.MOUSE_UP, function ():void
    83.             {
    84.                 isPress = false;
    85.             });
    86.             addEventListener(Event.ENTER_FRAME, function ():void
    87.             {
    88.                 if (!isPress) return;

    89.                 var t1:Number = Math.random() * Math.PI * 2;
    90.                 var t2:Number = t1 + Math.random() * (Math.PI * 2 / 3) + Math.PI * 1 / 3;
    91.                
    92.                 var Pt1:Point = Point.polar(300, t1).add(new Point(stage.stageWidth/2, stage.stageHeight / 2));
    93.                 var Pt2:Point = Point.polar(300, t2).add(new Point(stage.stageWidth/2, stage.stageHeight / 2));
    94.                
    95.                 var gl:GlowLine = new GlowLine(Pt1, Pt2);
    96.                 gl.addEventListener("completeLine", function ():void
    97.                 {
    98.                                         var lsos:Array = [];
    99.                     for (var i:int = 0; i < _container.numChildren; i++)
    100.                     {
    101.                                             var child:DisplayObject = _container.getChildAt(i);
    102.                                             if(child is LineSliceObject && LineSliceObject(child)._area >= 30){
    103.                                                 lsos.push(child);
    104.                                             }
    105.                                         }
    106.                                        
    107.                                         for each(var lso:LineSliceObject in lsos){
    108.                                             lso.slice(Pt1, Pt2);
    109.                     }
    110.                     
    111.                     removeChild(gl);
    112.                     counterTfd.text = _container.numChildren.toString();
    113.                     gl = null;
    114.                 });
    115.                
    116.                 addChild(gl);
    117.                
    118.                

    119.             });
    120.         }
    121.     }
    122. }



    123. import flash.display.DisplayObject;
    124. import flash.display.Sprite;
    125. import flash.display.Shape
    126. import flash.events.Event;
    127. import flash.display.Stage;
    128. import flash.geom.Point;
    129. import flash.geom.Rectangle;
    130. import flash.events.MouseEvent;

    131. import flash.filters.DropShadowFilter
    132. import flash.filters.GlowFilter;
    133. import flash.display.Graphics;

    134. import org.libspark.betweenas3.BetweenAS3;
    135. import org.libspark.betweenas3.easing.*;
    136. class GlowLine
    137. extends Shape
    138. {
    139. //    private var linearr:Array = [];
    140.     private var dotarr:Array = [];
    141.     public var startPt:Point;
    142.     public var endPt:Point;
    143.     public var t:Number = 0;
    144.     public function GlowLine(startPt:Point, endPt:Point) {
    145.         this.startPt = startPt;
    146.         this.endPt = endPt;
    147.    
    148.         //filters
    149.         filters = [
    150.             new GlowFilter(0xffffff, 1, 16, 8, 1, 3, true, false),
    151.             new GlowFilter(0xffff00, 1, 8, 8, 1, 3, false, false),
    152.             new DropShadowFilter(0, 90, 0xcc3300, 1, 64, 64, 5, 3, false, false, false)
    153.         ];
    154.         
    155.         //evts
    156.         addEventListener(Event.ENTER_FRAME, addPtHandler);
    157.         addEventListener(Event.ENTER_FRAME, drawLineHandler);
    158.         
    159.         //twn
    160.         BetweenAS3.tween(this, {t: 1.0},
    161.                         null,
    162.             Math.random() * 0.2 + 0.1,
    163.                         Cubic.easeIn
    164.         ).play();
    165.     }
    166.     private function addPtHandler(e:Event):void
    167.     {
    168.         dotarr.push({
    169.                 x : startPt.x + (endPt.x - startPt.x) * t,
    170.             y : startPt.y + (endPt.y - startPt.y) * t
    171.                 });

    172.         if(t == 1) removeEventListener(Event.ENTER_FRAME, addPtHandler);        
    173.     }
    174.     private function drawLineHandler(e:Event):void {
    175.         if (t == 1 ) {
    176.             dotarr.splice(0, 1);
    177.             
    178.             if (dotarr.length < 5)
    179.             {
    180.             removeEventListener(Event.ENTER_FRAME, drawLineHandler);
    181.             dispatchEvent(new Event("completeLine"));
    182.             return;
    183.             }
    184.         }
    185.         var _g:Graphics = graphics;

    186.         _g.clear();
    187.         _g.lineStyle(0, 0xff0000, 100, true, "none", "round", "round", 1);               
    188. //        var _prevPoint:Point = null;
    189.         var _dotLength:int = dotarr.length;
    190.         for (var i:int = 1; i < _dotLength; ++i) {        
    191.             var _prevObj:Object = dotarr[i - 1];                                    
    192.             var _currentObj:Object = dotarr[i];

    193.             _g.lineStyle(i / 1.5 * 2  , 0xffffff, 1, true, "none", "round", "round", 1);               
    194. //            var _point:Point = new Point(_prevObj.x + (_currentObj.x - _prevObj.x) / 2, _prevObj.y + (_currentObj.y - _prevObj.y) / 2);               
    195.             //if (_prevPoint) {
    196.                 //_g.moveTo(_prevPoint.x,_prevPoint.y);
    197.                 //_g.curveTo(_prevObj.x,_prevObj.y,_point.x,_point.y);
    198.             //} else {
    199.                 _g.moveTo(_prevObj.x,_prevObj.y);
    200.                 _g.lineTo(_currentObj.x,_currentObj.y);
    201. //                _g.lineTo(_point.x,_point.y);
    202.             //}
    203. //            _prevPoint = _point;
    204.         }
    205.         if (_currentObj) {
    206.             _g.lineTo(_currentObj.x, _currentObj.y);
    207.         }
    208.         
    209.     }   
    210. }
    211. class LineSliceObject extends Sprite
    212. {
    213.     private var _stage:Stage;
    214.     private var _pointArray:Array;
    215.     private var _color:uint;
    216.     private var _point1:Point;
    217.     private var _point2:Point;
    218.     private var _length:int;
    219.         public var _area:Number;
    220.    
    221.     public function LineSliceObject( _stage:Stage , _pointArray:Array , _color:uint )
    222.     {
    223.         this._stage = _stage;
    224.         this._pointArray = _pointArray;
    225.         this._color = _color;
    226. //                this._area = areaFast(_pointArray);
    227.         drawRectFromPoint( this , _pointArray , _color );
    228.                 this._area = areaFast(this);
    229.     }

    230.    
    231.     /*
    232.      * ------------------------------------------------------------
    233.      * Graphic描画
    234.      * ------------------------------------------------------------
    235.     */
    236.     private function drawRectFromPoint( _target:* , _pointArray:Array , _color:uint ):void
    237.     {
    238.         _target.graphics.beginFill( _color , 1.0 );
    239.         _target.graphics.moveTo( _pointArray[ 0 ].x , _pointArray[ 0 ].y );
    240.         _length = _pointArray.length;
    241.         for ( var i:int = 1; i < _length; i ++ )
    242.         {
    243.             var _point:Point = _pointArray[ i ];
    244.             _target.graphics.lineTo( _point.x , _point.y );
    245.         }
    246.         _target.graphics.endFill();
    247.     }

    248.         private static function areaFast(_target:DisplayObject) : Number
    249.         {
    250.             var r:Rectangle = _target.getRect(_target);
    251.             return _target.width * _target.height;
    252.         }
    253.    
    254.     /*
    255.      * ------------------------------------------------------------
    256.      * スライス
    257.      * ------------------------------------------------------------
    258.     */
    259.     public function slice( _point1:Point , _point2:Point ):void
    260.     {
    261.         var _pt1:Point = globalToLocal( _point1 );
    262.         var _pt2:Point = globalToLocal( _point2 );
    263.         var _newPointArray:Array = [[], []];
    264.         var _numCross:int = 0;
    265.         
    266.         for ( var i:int = 0; i < _length ; i ++ )
    267.         {
    268.             var _pt3:Point = _pointArray[ i ];
    269.             var _pt4:Point = ( _pointArray[ i + 1 ] ) ? _pointArray[ i + 1 ] : _pointArray[ 0 ];
    270.             var _crossPt:Point = crossPoint( _pt1 , _pt2 , _pt3 , _pt4 );
    271.             
    272.             _newPointArray[ 0 ].push( _pt3 );
    273.             if ( _crossPt )
    274.             {
    275.                 _newPointArray[ 0 ].push( _crossPt );
    276.                 _newPointArray[ 1 ].push( _crossPt );
    277.                 _newPointArray.reverse();
    278.                 _numCross ++;
    279.             }
    280.         }
    281.         if ( _numCross == 2 )
    282.         {
    283.             var _newObj1:LineSliceObject = new LineSliceObject( _stage , _newPointArray[ 0 ] , _color );
    284.             var _newObj2:LineSliceObject = new LineSliceObject( _stage , _newPointArray[ 1 ] , Math.random() * 0xFFFF00 );
    285.             _newObj1.x = _newObj2.x = this.x;
    286.             _newObj1.y = _newObj2.y = this.y;
    287.             parent.addChild( _newObj1 );
    288.             parent.addChild( _newObj2 );
    289.             parent.removeChild( this );

    290.             var _vector:Point = _pt2.subtract( _pt1 );
    291.             var _force:int = 6 * Math.random() * 20;
    292.                         var _d:Number = Math.sqrt(_vector.x * _vector.x + _vector.y * _vector.y);
    293.                         var _fx:Number = (_vector.x >= 0 ? _vector.x : -_vector.x) / _d;
    294.                         var _fy:Number = (_vector.y >= 0 ? _vector.y : -_vector.y) / _d;
    295.             var _fx1:Number = ( _newPointArray[0][0].x < _newPointArray[1][0].x ) ? -_fx : _fx;
    296.             var _fx2:Number = ( _newPointArray[1][0].x < _newPointArray[0][0].x ) ? -_fx : _fx;
    297.             var _fy1:Number = ( _newPointArray[0][0].y < _newPointArray[1][0].y ) ? -_fy : _fy;
    298.             var _fy2:Number = ( _newPointArray[1][0].y < _newPointArray[0][0].y ) ? -_fy : _fy;
    299.             
    300.             BetweenAS3.tween( _newObj1 , { x : _newObj1.x + _fx1 * _force , y : _newObj1.y + _fy1 * _force} , null, Math.random()*4+2, Expo.easeOut ).play();
    301.             BetweenAS3.tween( _newObj2 , { x : _newObj2.x + _fx2 * _force , y : _newObj2.y + _fy2 * _force} , null, Math.random()*4+2, Expo.easeOut ).play();
    302.         }
    303. //        else _stage.addEventListener( MouseEvent.MOUSE_DOWN , mouseDownHandler );
    304.     }
    305.    
    306.     /*
    307.      * ------------------------------------------------------------
    308.      * 交点を割り出す
    309.      * ------------------------------------------------------------
    310.     */
    311.     private function crossPoint( _pt1:Point , _pt2:Point , _pt3:Point , _pt4:Point ):Point
    312.     {   
    313.         var _vector1:Point = _pt2.subtract( _pt1 );
    314.         var _vector2:Point = _pt4.subtract( _pt3 );
    315.         
    316.                 var c21:Number = cross(_vector2, _vector1);
    317.         if ( c21 == 0.0) return null;
    318.         
    319.         var _s:Number = cross( _vector2 , _pt3.subtract( _pt1) ) / c21;

    320.         if ( isCross( _s ))
    321.         {
    322.                     var _t:Number = cross( _vector1, _pt1.subtract( _pt3 ) ) / cross( _vector1, _vector2 );
    323.                         if(isCross(_t)){
    324.                     _vector1.x *= _s;
    325.                 _vector1.y *= _s;
    326.                 return _pt1.add( _vector1 );
    327.                         }
    328.         }
    329.         return null;
    330.     }
    331.         
    332.     private function cross( _vector1:Point , _vector2:Point ):Number
    333.     {
    334.         return ( _vector1.x * _vector2.y - _vector1.y * _vector2.x );
    335.     }
    336.    
    337.     public static function isCross( _n:Number ):Boolean
    338.     {
    339.         return ( ( 0 <= _n ) && ( _n <= 1) );
    340.     }
    341. }
    复制代码





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

    本帖子中包含更多资源

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

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

    使用道具 举报

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

    本版积分规则

    
    关闭

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

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

    GMT+8, 2019-10-19 16:00 , Processed in 0.048979 second(s), 48 queries .

    守望者AIR

    守望者AIR技术交流社区

    本站成立于 2014年12月31日

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