// forked from a24's Line slicer // 切った後、割れるようにした package { import flash.display.Sprite; import flash.geom.Point; import flash.events.MouseEvent; import flash.text.TextField; [ SWF( width = "465" , height = "465" , backgroundColor = "0x000000" , frameRate = "60" ) ] public class Main extends Sprite { private var _point:Point; private var _sliceObj:LineSliceObject; private var _line:Sprite = new Sprite(); public function Main() { Wonderfl.capture_delay( 5 ); var _tf:TextField = new TextField(); _tf.x = _tf.y = 6; _tf.autoSize = "left"; _tf.textColor = 0xFFFFFF; _tf.text = "Please drag the Stage."; addChild( _tf ); var _pointArray:Array = [ new Point( 0 , 0 ), new Point( 265 , 0 ), new Point( 265 , 265 ), new Point( 0 , 265 ) ]; var _container:Sprite = new Sprite(); _sliceObj = new LineSliceObject( stage , _pointArray , 0x3399FF ); _sliceObj.x = _sliceObj.y = 100; _container.addChild( _sliceObj ); addChild( _container ); addChild( _line ); stage.addEventListener( MouseEvent.MOUSE_DOWN , mouseDownHandler ); } private function mouseDownHandler( e:MouseEvent ):void { _point = new Point( stage.mouseX , stage.mouseY ); stage.removeEventListener( MouseEvent.MOUSE_DOWN , mouseDownHandler ); stage.addEventListener( MouseEvent.MOUSE_UP , mouseUpHandler ); stage.addEventListener( MouseEvent.MOUSE_MOVE , mouseMoveHandler ); } private function mouseUpHandler( e:MouseEvent ):void { _line.graphics.clear(); stage.addEventListener( MouseEvent.MOUSE_DOWN , mouseDownHandler ); stage.removeEventListener( MouseEvent.MOUSE_UP , mouseUpHandler ); stage.removeEventListener( MouseEvent.MOUSE_MOVE , mouseMoveHandler ); } private function mouseMoveHandler( e:MouseEvent ):void { _line.graphics.clear(); _line.graphics.lineStyle( 2.0 , 0x00FF00 , 1.0); _line.graphics.moveTo( _point.x , _point.y ); _line.graphics.lineTo( mouseX , mouseY ); _line.graphics.endFill(); } } } import flash.display.Sprite; import flash.display.Stage; import flash.geom.Point; import flash.events.MouseEvent; import caurina.transitions.Tweener; class LineSliceObject extends Sprite { private var _stage:Stage; private var _pointArray:Array; private var _color:uint; private var _point1:Point; private var _point2:Point; private var _length:int; public function LineSliceObject( _stage:Stage , _pointArray:Array , _color:uint ) { this._stage = _stage; this._pointArray = _pointArray; this._color = _color; drawRectFromPoint( this , _pointArray , _color ); _stage.addEventListener( MouseEvent.MOUSE_DOWN , mouseDownHandler ); } /* * ------------------------------------------------------------ * マウスイベントハンドラ * ------------------------------------------------------------ */ private function mouseDownHandler( e:MouseEvent ):void { _point1 = new Point( _stage.mouseX , _stage.mouseY ); _stage.removeEventListener( MouseEvent.MOUSE_DOWN , mouseDownHandler ); _stage.addEventListener( MouseEvent.MOUSE_UP , mouseUpHandler ); } private function mouseUpHandler( e:MouseEvent ):void { _point2 = new Point( _stage.mouseX , _stage.mouseY ); slice( _point1 , _point2 ); _stage.removeEventListener( MouseEvent.MOUSE_UP , mouseUpHandler ); } /* * ------------------------------------------------------------ * Graphic描画 * ------------------------------------------------------------ */ private function drawRectFromPoint( _target:* , _pointArray:Array , _color:uint ):void { _target.graphics.beginFill( _color , 1.0 ); _target.graphics.moveTo( _pointArray[ 0 ].x , _pointArray[ 0 ].y ); _length = _pointArray.length; for ( var i:int = 1; i < _length; i ++ ) { var _point:Point = _pointArray[ i ]; _target.graphics.lineTo( _point.x , _point.y ); } _target.graphics.endFill(); } /* * ------------------------------------------------------------ * スライス * ------------------------------------------------------------ */ public function slice( _point1:Point , _point2:Point ):void { var _pt1:Point = globalToLocal( _point1 ); var _pt2:Point = globalToLocal( _point2 ); var _newPointArray:Array = [ new Array() , new Array() ]; var _numCloss:int = 0; for ( var i:int = 0; i < _length ; i ++ ) { var _pt3:Point = _pointArray[ i ]; var _pt4:Point = ( _pointArray[ i + 1 ] ) ? _pointArray[ i + 1 ] : _pointArray[ 0 ]; var _clossPt:Point = crossPoint( _pt1 , _pt2 , _pt3 , _pt4 ); _newPointArray[ 0 ].push( _pt3 ); if ( _clossPt ) { _newPointArray[ 0 ].push( _clossPt ); _newPointArray[ 1 ].push( _clossPt ); _newPointArray.reverse(); _numCloss ++; } } if ( _numCloss == 2 ) { var _newObj1:LineSliceObject = new LineSliceObject( _stage , _newPointArray[ 0 ] , _color ); var _newObj2:LineSliceObject = new LineSliceObject( _stage , _newPointArray[ 1 ] , Math.random() * 0xFFFF00 ); _newObj1.x = _newObj2.x = this.x; _newObj1.y = _newObj2.y = this.y; parent.addChild( _newObj1 ); parent.addChild( _newObj2 ); parent.removeChild( this ); var _vector:Point = _pt2.subtract( _pt1 ); var _angle:Number = Math.atan2( _vector.y , _vector.x ); var _force:int = 6; var _fx:Number = Math.abs( Math.sin( _angle ) ); var _fy:Number = Math.abs( Math.cos( _angle ) ); var _fx1:Number = ( _newPointArray[0][0].x < _newPointArray[1][0].x ) ? -_fx : _fx; var _fx2:Number = ( _newPointArray[1][0].x < _newPointArray[0][0].x ) ? -_fx : _fx; var _fy1:Number = ( _newPointArray[0][0].y < _newPointArray[1][0].y ) ? -_fy : _fy; var _fy2:Number = ( _newPointArray[1][0].y < _newPointArray[0][0].y ) ? -_fy : _fy; Tweener.addTween( _newObj1 , { x : _newObj1.x + _fx1 * _force , y : _newObj1.y + _fy1 * _force , time : 1 } ); Tweener.addTween( _newObj2 , { x : _newObj2.x + _fx2 * _force , y : _newObj2.y + _fy2 * _force , time : 1 } ); } else _stage.addEventListener( MouseEvent.MOUSE_DOWN , mouseDownHandler ); } /* * ------------------------------------------------------------ * 交点を割り出す * ------------------------------------------------------------ */ private function crossPoint( _pt1:Point , _pt2:Point , _pt3:Point , _pt4:Point ):Point { var _vector1:Point = _pt2.subtract( _pt1 ); var _vector2:Point = _pt4.subtract( _pt3 ); if ( cross( _vector1, _vector2 ) == 0.0) return null; var _s:Number = cross( _vector2 , _pt3.subtract( _pt1) ) / cross( _vector2 , _vector1 ); var _t:Number = cross( _vector1, _pt1.subtract( _pt3 ) ) / cross( _vector1, _vector2 ); if ( isCross( _s ) && isCross( _t ) ) { _vector1.x *= _s; _vector1.y *= _s; return _pt1.add( _vector1 ); } else return null; } private function cross( _vector1:Point , _vector2:Point ):Number { return ( _vector1.x * _vector2.y - _vector1.y * _vector2.x ); } public static function isCross( _n:Number ):Boolean { return ( ( 0 <= _n ) && ( _n <= 1) ); } } Line slicer(割れるよ)