Hungry? twistcube forked:0favorite:2lines:276license : MIT License modified : 2009-11-13 22:27:28 Embed Tweet package { import flash.display.* ; import flash.events.* ; import flash.net.* ; import flash.system.* ; import flash.ui.Mouse; [SWF(width="500", height="500", backgroundColor="0x76c725", frameRate="30")] public class Hungry extends Sprite { private static var _yoyo:Yoyo ; public function Hungry( ) { init( ) ; } public static function get yoyo( ):Yoyo { return _yoyo ; } private function init( ):void { stage.scaleMode = StageScaleMode.NO_SCALE ; stage.align = StageAlign.TOP_LEFT ; stage.quality = StageQuality.HIGH ; Mouse.hide( ) ; xCreateObject( ) ; } private function xCreateObject( ):void { var nSize:Number = 21 ; var nTimes:uint = 8 ; var nMargin:Number = 1 ; var nStartPos:Number = ( stage.stageWidth - ( (nSize*2 + nMargin) * nTimes ) ) / 2 ; _yoyo = new Yoyo( ) ; addChild( _yoyo ) ; for ( var i:uint = 0; i < nTimes; i++ ) { for ( var j:uint = 0; j < nTimes; j++ ) { var obj:CircleManager = new CircleManager( 0, nSize, 2 * Math.PI, 0, 0xcfff5f ) ; obj.x = (nSize*2 + nMargin) * i + nStartPos + nSize ; obj.y = (nSize*2 + nMargin) * j + nStartPos + nSize ; addChild( obj ) ; } } } } } import flash.display.* ; import flash.events.* ; import flash.geom.* ; import flash.filters.* ; class Yoyo extends Sprite { private const SPRING:Number = .1 ; private const FRICTION:Number = .95 ; private var _vect:Point ; private var _source:Sprite ; public function Yoyo( ) { addEventListener( Event.ADDED_TO_STAGE, init ) ; addEventListener( Event.REMOVED_FROM_STAGE, unload ) ; } private function init( event:Event ):void { removeEventListener( Event.ADDED_TO_STAGE, init ) ; _source = new Sprite( ) ; x = stage.stageWidth / 2 ; y = stage.stageHeight / 2 ; _source.graphics.beginFill( 0xe3ce29 ) ; _source.graphics.drawCircle( 0, 0, 10 ) ; _source.graphics.endFill( ) ; addChild( _source ) ; _vect = new Point( 100 * Math.random( ) - 50, 100 * Math.random( ) - 50 ) ; addEventListener( Event.ENTER_FRAME, onRender ) ; } private function unload( event:Event = null ):void { removeEventListener( Event.REMOVED_FROM_STAGE, unload ) ; removeEventListener( Event.ENTER_FRAME, onRender ) ; } private function onRender( event:Event ):void { _vect.x += ( stage.mouseX - x ) * SPRING ; _vect.y += ( stage.mouseY - y ) * SPRING ; _vect.x *= FRICTION ; _vect.y *= FRICTION ; x += _vect.x ; y += _vect.y ; } } import flash.display.* ; import flash.events.* ; class CircleManager extends Sprite { private var _hankei:uint ; private var _hutosa:uint ; private var _nagasa:Number ; private var _rotation:Number ; private var _color:Number ; private var _circle:CircleObj ; private var _rotationStep:Number ; private var _sleep:Number ; private var _packStep:Number ; public function CircleManager( __hankei:uint = 50, __hutosa:uint = 1, __nagasa:Number = 2 * Math.PI, __rotation:Number = 0, __color:Number = 0xFFFFFF ):void { _hankei = __hankei ; _hutosa = __hutosa ; _nagasa = __nagasa ; _rotation = __rotation ; _color = __color ; addEventListener( Event.ADDED_TO_STAGE, init ) ; addEventListener( Event.REMOVED_FROM_STAGE, unload ) ; } private function init( event:Event ):void { removeEventListener( Event.ADDED_TO_STAGE, init ) ; // -- _circle = new CircleObj( _hankei, _hutosa, _nagasa, 0, _color ) ; addChild( _circle ) ; alpha = .7 ; _rotationStep = .05 + .2 * Math.random( ) ; _sleep = 1 ; _packStep = 2 * Math.PI * Math.random( ) ; addEventListener( Event.ENTER_FRAME, onRender ) ; } private function unload( event:Event = null ):void { removeEventListener( Event.REMOVED_FROM_STAGE, unload ) ; removeEventListener( Event.ENTER_FRAME, onRender ) ; removeChild( _circle ) ; _circle = null ; } private function onRender( event:Event ):void { var nDiffX:Number = Hungry.yoyo.x - x ; var nDiffY:Number = Hungry.yoyo.y - y ; var nTarget:Number = Math.atan2( nDiffY, nDiffX ) / Math.PI * 180 ; var nDiffR:Number = nTarget - rotation ; while ( nDiffR > 180 ) { nDiffR -= 360 ; } while ( nDiffR < -180 ) { nDiffR += 360 ; } rotation += nDiffR * _rotationStep ; var nDistance:Number = xGetDistance( Hungry.yoyo.x, Hungry.yoyo.y, x, y ) ; var nSleep:Number = 0 ; if ( nDistance > 150 ) { _sleep += ( 1 - _sleep ) * .4 ; } else { nSleep = 1 ; _sleep += ( .7 - _sleep ) * .4 ; } var kaihei:Number = 2 * Math.PI * .3 * Math.sin( _packStep ) * 0.5 + 0.5 ; _packStep += .3 ; _circle.xChangeNagasa( 2 * Math.PI * _sleep + kaihei * nSleep ) ; } private function xGetDistance( p1_x:Number, p1_y:Number, p2_x:Number, p2_y:Number ):Number { var x:Number = Math.pow( ( p1_x - p2_x ), 2 ) ; var y:Number = Math.pow( ( p1_y - p2_y ), 2 ) ; return Math.sqrt( x + y ) ; } } import flash.display.* ; import flash.events.* ; class CircleObj extends Sprite { private var _hankei:uint ; private var _hutosa:uint ; private var _nagasa:Number ; private var _rotation:Number ; private var _color:Number ; private var _mask:Sprite ; private var _main:Sprite ; public function CircleObj( __hankei:uint = 50, __hutosa:uint = 1, __nagasa:Number = 2*Math.PI, __rotation:Number = 0, __color:Number = 0 ):void { _hankei = __hankei ; _hutosa = __hutosa ; _nagasa = __nagasa ; _rotation = __rotation ; _color = __color ; addEventListener( Event.ADDED_TO_STAGE, init ) ; addEventListener( Event.REMOVED_FROM_STAGE, unload ) ; } private function init( event:Event ):void { removeEventListener( Event.ADDED_TO_STAGE, init ) ; // -- _mask = new Sprite( ) ; _main = new Sprite( ) ; addChild( _main ) ; addChild( _mask ) ; _main.mask = _mask ; xDrawMask( ) ; xDrawCircle( ) ; rotation = (2*Math.PI-_nagasa) / Math.PI * 180 / 2 ; } private function unload( event:Event = null ):void { removeEventListener( Event.REMOVED_FROM_STAGE, unload ) ; removeChild( _main ) ; removeChild( _mask ) ; _main = null ; _mask = null ; } private function xDrawMask( ):void { var nHankei:Number = ( _hankei + _hutosa ) * 1.41422 ; // http://www.twist-cube.com/wonderfl/ring_sample.png var nTheta:Number ; var nX:Number ; var nY:Number ; _mask.graphics.clear( ) ; _mask.graphics.beginFill( 0xFFFFFF ) ; // right bottom nTheta = Math.min( _nagasa, Math.PI / 2 ) ; nX = nHankei * Math.cos( nTheta ) ; nY = nHankei * Math.sin( nTheta ) ; _mask.graphics.moveTo( 0, 0 ) ; _mask.graphics.lineTo( nHankei, 0 ) ; _mask.graphics.lineTo( nX, nY ) ; _mask.graphics.lineTo( 0, 0 ) ; _main.graphics.endFill( ) ; // left bottom if ( _nagasa > Math.PI / 2 ) { nTheta = Math.min( (_nagasa - Math.PI / 2), Math.PI / 2 ) + Math.PI / 2 ; nX = nHankei * Math.cos( nTheta ) ; nY = nHankei * Math.sin( nTheta ) ; _mask.graphics.moveTo( 0, 0 ) ; _mask.graphics.lineTo( 0, nHankei ) ; _mask.graphics.lineTo( nX, nY ) ; _mask.graphics.lineTo( 0, 0 ) ; _main.graphics.endFill( ) ; } // left top if ( _nagasa > Math.PI ) { nTheta = Math.min( (_nagasa - Math.PI), Math.PI / 2 ) + Math.PI ; nX = nHankei * Math.cos( nTheta ) ; nY = nHankei * Math.sin( nTheta ) ; _mask.graphics.moveTo( 0, 0 ) ; _mask.graphics.lineTo( -nHankei, 0 ) ; _mask.graphics.lineTo( nX, nY ) ; _mask.graphics.lineTo( 0, 0 ) ; _main.graphics.endFill( ) ; } // right top if ( _nagasa > Math.PI + Math.PI/2 ) { nTheta = Math.min( (_nagasa - (Math.PI + Math.PI/2)), Math.PI / 2 ) + Math.PI + Math.PI/2 ; nX = nHankei * Math.cos( nTheta ) ; nY = nHankei * Math.sin( nTheta ) ; _mask.graphics.moveTo( 0, 0 ) ; _mask.graphics.lineTo( 0, -nHankei ) ; _mask.graphics.lineTo( nX, nY ) ; _mask.graphics.lineTo( 0, 0 ) ; _main.graphics.endFill( ) ; } } private function xDrawCircle( ):void { _main.graphics.clear( ) ; _main.graphics.beginFill( _color ); _main.graphics.drawCircle( 0, 0, _hankei + _hutosa ) ; _main.graphics.drawCircle( 0, 0, _hankei ) ; _main.graphics.endFill( ) ; } public function xChangeNagasa( __nagasa:Number ):void { _nagasa = __nagasa ; xDrawMask( ) ; xDrawCircle( ) ; rotation = (2*Math.PI-_nagasa) / Math.PI * 180 / 2 ; } } Code Fullscreen Preview Fullscreen ngtn sw_lucchini unload removeEventListener addEventListener Math.PI Event.REMOVED_FROM_STAGE lineTo rotation Event.ADDED_TO_STAGE endFill removeChild Math.min moveTo addChild Mouse.hide mask Math.pow Math.cos drawCircle StageQuality.HIGH Event