In case Flash no longer exists; a copy of this site is included in the Flashpoint archive's "ultimate" collection.

Dead Code Preservation :: Archived AS3 works from wonderfl.net

forked from: 線で円を描画する

線で円を描画する
http://d.hatena.ne.jp/ActionScript/20090414/as3_line_circle
画面をクリックすると、クリックした座標を中心にした円が線で描かれます。

こちらのコードを参考にさせていただきました。
http://moringo.moo.jp/wordpress/?p=67
// forked from dkgkAs's 線で円を描画する
/**
 * 線で円を描画する
 * http://d.hatena.ne.jp/ActionScript/20090414/as3_line_circle
 * 画面をクリックすると、クリックした座標を中心にした円が線で描かれます。
 * 
 * こちらのコードを参考にさせていただきました。
 * http://moringo.moo.jp/wordpress/?p=67
 */

package  
{
    import caurina.transitions.Tweener;
    import flash.display.Sprite;
    import flash.events.Event;
    import flash.events.MouseEvent;
    import flash.text.TextField;
    import flash.text.TextFieldAutoSize;
    import flash.text.TextFormat;
    
    [SWF(width = 465, height = 465, backgroundColor = 0x000000, frameRate = 30)]
    
    public class Circle extends Sprite 
    {
        private var _scx:Number = stage.stageWidth  * 0.5; // ステージ中央のX座標
        private var _scy:Number = stage.stageHeight * 0.5; // ステージ中央のY座標
        private var _txtfld:TextField;
        
        public function Circle():void 
        {
            setup();
        }
        
        private function setup():void
        {
            var txtfmt:TextFormat = new TextFormat("_ゴシック", 9, 0xFFFFFF);
            _txtfld = new TextField();
            _txtfld.defaultTextFormat = txtfmt;
            _txtfld.autoSize = TextFieldAutoSize.LEFT;
            _txtfld.text = "画面をクリックすると、クリックした座標を中心にした円が線で描かれます。";
            _txtfld.x = _scx - _txtfld.width  * 0.5;
            _txtfld.y = _scy - _txtfld.height * 0.5;
            _txtfld.selectable = false;
            _txtfld.name = "text";
            this.stage.addChildAt(_txtfld, 0);
            
            this.stage.addEventListener(MouseEvent.CLICK, function(event:MouseEvent):void
            {
                stage.removeEventListener(MouseEvent.CLICK, arguments.callee);
                Tweener.addTween(_txtfld, { alpha:0, time:3, delay:0, transition:"easeOutExpo", onComplete:function():void
                {
                    stage.removeChild(_txtfld);
                }});
            });
            
            this.stage.addEventListener("enterFrame", mouseClickHandler);
        }
        
        private function mouseClickHandler(event:*):void 
        {
            // 円のスプライト作成
            var sp:Sprite = new Sprite();
            this.stage.addChild(sp);
            draw(sp, mouseX, mouseY);
        }
        
        private function draw(sp:Sprite, cx:Number, cy:Number):void 
        {
            var radius:Number = 200 * Math.random() + 10; // 半径をランダム
            var angle:Number = -90 * Math.PI / 180; // 開始角度(をラジアンで)
            var max:Number = 2 * Math.PI + angle; // 終了角度(をラジアンで)
            var fx:Function = function(r:Number, t:Number, x:Number):Number { return r * Math.cos(t) + x };
            var fy:Function = function(r:Number, t:Number, y:Number):Number { return r * Math.sin(t) + y };
            
            sp.graphics.lineStyle(radius * 0.1, 0xFFFFFF * Math.random()); // 線の太さは半径に比例、色はランダム
            sp.graphics.moveTo(fx(radius, angle, cx), fy(radius, angle, cy)); // 線描画の開始点
            
            // 線を描画する無名関数
            sp.addEventListener(Event.ENTER_FRAME, function(event:Event):void
            {
                angle += 0.05; // 約2.9度ずつ回転 = 線を描画
                sp.graphics.lineTo(fx(radius, angle, cx), fy(radius, angle, cy));
                
                if (angle >= max)
                {
                    sp.removeEventListener(Event.ENTER_FRAME, arguments.callee);
                    Tweener.addTween(sp, { alpha:0, time:2, transition:"easeInExpo", onComplete:function():void
                    {
                        stage.removeChild(sp);
                    }});
                }
            });
        }
        
    }
    
}