「AS3による数学・物理学表現[入門編]」のプログラムをASファイルのみで記述4

Case03 三角関数(sin, cos)を利用した回転するメニュー

これはインスタンスの生成が全部as側で記述されているので、ちょこちょこ変数名を変えたり、コメント付けたり、関数化を細かくしたぐらいなのですが。
動かしたらとっても楽しかったです。

package
{
	import flash.display.Loader;
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.events.MouseEvent;
	import flash.events.TimerEvent;
	import flash.geom.Point;
	import flash.net.URLRequest;
	import flash.utils.Timer;
	
	[SWF(backgroundColor = "#ffffff", width = "1024", height = "640", frameRate="30")]
	public class math03rotateMenu_1 extends Sprite
	{
		private var floorObj:Sprite;
		private var obj:Array;
		private var maskObj:Array;
		private var clickedNum:int = -1;
		private var angle:Number = 0;
		private var timer:Timer;
		private const radius:Number = 250;
		
		//コンストラクタ
		public function math03rotateMenu_1()
		{
			initImg();
			makeFloorObj();
			
			timer = new Timer(33);
			timer.addEventListener(TimerEvent.TIMER, loop);
			timer.start();
		}
		
		private function initImg():void{
			
			obj = new Array();
			maskObj = new Array();
			
			for(var i:int = 0; i<12 ; i++){
				//var sp:Sprite() = new Sprite();
				obj.push(new Sprite());
				var num:Number = obj.length-1;
				this.addChild(obj[num]);
				
				maskObj.push(new Sprite());
				obj[num].buttonMode = true;
				obj[num].useHandCursor = true;
				
				obj[num].name = String(num);
				obj[num].x = this.stage.stageWidth/2;
				obj[num].y = this.stage.stageHeight/2;
				obj[num].scaleX = 0;
				obj[num].scaleY = 0;
				obj[num].addEventListener(MouseEvent.CLICK, onClick);
				obj[num].mask = maskObj[num];
				obj[num].addChild(maskObj[num]);
				
				
				var imgLoader:Loader = new Loader();
				obj[num].addChild(imgLoader);
				// onClickに渡されるインスタンスが obj[num] になるようにする
				// (imgLoaderが渡されると困る)
				obj[num].mouseChildren = false;
				
                                // 画像の読み込み
				var urlReq:URLRequest = new URLRequest("./imgs/img"+num+".jpg");
				imgLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, onImageLoaded);
				imgLoader.load(urlReq);
			}
		}
		
		private function makeFloorObj():void{
			floorObj = new Sprite();
			floorObj.graphics.clear();
			floorObj.graphics.lineStyle(0,0,0);
			floorObj.graphics.beginFill(0xff0000);
			floorObj.graphics.drawRect(0,0, this.stage.stageWidth, this.stage.stageHeight);
			floorObj.graphics.endFill();
			
			floorObj.alpha = 0;
			
			floorObj.addEventListener(MouseEvent.CLICK, onFloorClick);
			this.addChildAt(floorObj, 0);
		}
		
		//それぞれの写真が読み込まれたとき
		private function onImageLoaded(e:Event):void{
			//写真の位置調整
			e.target.loader.x = -e.target.loader.width/2;
			e.target.loader.y = -e.target.loader.height/2;
			
			//写真番号の特定
			var num:int = int(e.target.loader.parent.name);
			
			//マスクの設定
			maskObj[num].graphics.clear();
			maskObj[num].graphics.lineStyle(0, 0, 0);
			maskObj[num].graphics.beginFill(0xff0000);
			maskObj[num].graphics.drawCircle(0, 0, Math.min(e.target.loader.width/2, e.target.loader.height/2));
			maskObj[num].graphics.endFill();
		}
		
		//それぞれの写真がクリックされたとき
		private function onClick(e:MouseEvent):void{
			if(clickedNum == int(e.target.name)){
				clickedNum = -1;
			}else{
				clickedNum = int(e.target.name);
			}
		}
		
		//写真以外の場所がクリックされたとき
		private function onFloorClick(e:MouseEvent):void{
			clickedNum = -1;
		}
		
		//常時実行
		private function loop(e:TimerEvent):void{
			angle += 0.002;
			
			for(var i:int = 0; i<obj.length ; i++){
				var pos:Point = new Point();
				var size:Number;
				
				if(clickedNum == i){
					pos.x = this.stage.stageWidth/2;
					pos.y = this.stage.stageHeight/2;
					size = 0.4;
				}else{
					pos.x = this.stage.stageWidth/2 + radius*Math.cos(angle + i/obj.length*Math.PI*2);
					pos.y = this.stage.stageHeight/2 + radius*Math.sin(angle + i/obj.length*Math.PI*2);
					size = 0.15;
				}
			
				// 徐々に目的の値に近づける
				obj[i].x += (pos.x - obj[i].x)/5;
				obj[i].y += (pos.y - obj[i].y)/5;
				obj[i].scaleX += (size - obj[i].scaleX)/5;
				obj[i].scaleY += (size - obj[i].scaleY)/5;
			}
		}
	}
}