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

線で円を描画する

線で円を描画する
* http://d.hatena.ne.jp/ActionScript/20090414/as3_line_circle
* 画面をクリックすると、クリックした座標を中心にした円が線で描かれます。
* 
* こちらのコードを参考にさせていただきました。
* http://moringo.moo.jp/wordpress/?p=67
/**
 * 線で円を描画する
 * 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(MouseEvent.CLICK, mouseClickHandler);
		}
		
		private function mouseClickHandler(event:MouseEvent):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);
					}});
				}
			});
		}
		
	}
	
}