影の位置を変化させる

by yun
♥0 | Line 60 | Modified 2010-09-27 10:28:21 | MIT License
play

ActionScript3 source code

/**
 * Copyright yun ( http://wonderfl.net/user/yun )
 * MIT License ( http://www.opensource.org/licenses/mit-license.php )
 * Downloaded from: http://wonderfl.net/c/gdKZ
 */

package {
    
    import flash.display.Sprite;
    import flash.events.MouseEvent;
    import flash.filters.DropShadowFilter;
    import caurina.transitions.Tweener;
    import caurina.transitions.properties.FilterShortcuts;
    
    [SWF(width=465, height=465, backgroundColor=0xffffff, frameRate=30)]
    
    public class Sample extends Sprite {
        
        public static const STD_POINT:Number = 150;
        public static const STD_DISTANCE:Number = 32;
        public static const STD_BLUR:Number = 32;
        
        private var light:Sprite;
        private var ball:Sprite;
        private var nowDeg:Number;
        
        public function Sample() {
            // FilterShortcutsを有効化
            FilterShortcuts.init();
            
            // lightを作成
            light = new Sprite();
            light.x = stage.stageWidth / 2;
            light.y = stage.stageHeight / 2;
            
            light.graphics.beginFill( 0xFFFF00 );
            light.graphics.drawCircle( 0, 0, 20 );
            light.graphics.endFill();
            
            addChild( light );
            
            // ballを作成
            ball = new Sprite();
            ball.x = light.x;
            ball.y = light.y;
            ball.filters = [new DropShadowFilter( 0, 0, 0, 0.5, 0, 0 )];
            
            nowDeg = Math.atan2( ball.y - stage.stageHeight / 2, ball.x - stage.stageWidth / 2 ) / Math.PI * 180;
            
            ball.graphics.beginFill( 0x000000 );
            ball.graphics.drawCircle( 0, 0, 20 );
            ball.graphics.endFill();

            addChild( ball );
            
            // stageのクリックイベントにリスナーを登録
            stage.addEventListener( MouseEvent.CLICK, clickHandler );
        }
        
        private function clickHandler( evt:MouseEvent ):void {
            var dx:Number = mouseX - light.x;
            var dy:Number = mouseY - light.y;
            var dp:Number = Math.sqrt( dx * dx + dy * dy ) / STD_POINT;
            var degrees:Number = Math.atan2( dy, dx ) / Math.PI * 180;
            var deg:Number = degrees - nowDeg;
            
            if ( deg > 180 || deg < -180 ) {
                if ( deg < -180 ) { deg = 360 + deg; }
                else if ( deg > 180 ) { deg = -( 360 - deg ); }
            }
            
            Tweener.addTween( ball, {
               x: mouseX,
               y: mouseY,
               _DropShadow_angle: nowDeg + deg,
               _DropShadow_distance: dp * STD_DISTANCE,
               _DropShadow_blurX: dp * STD_BLUR,
               _DropShadow_blurY: dp * STD_BLUR,
               time: 1,
               transition: "easeInOutCubic"
            } );
            
            nowDeg = nowDeg + deg;
            if ( nowDeg > 360 ) nowDeg -= 360;
            else if ( nowDeg < -360 ) nowDeg += 360;
        }
    }
}