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

Case01 「徐々に近づく」計算式を活用したインタラクティブな動き

/*
ActionScript3.0による数学・物理学表現[入門編]
pp.12-31 「徐々に近づく」計算式を活用したインタラクティブな動き

変更点

・変数名 koko→here
・flaファイルのドキュメント設定は[SWF(・・・)]で記述

わざわざTimerEventにする必要はあるのかな・・・?
ENTERFRAMEじゃダメ?
Timerの方がミリ秒単位で指定できるからいい、ってことなのかな。

*/
package
{
	import flash.display.Sprite;
	import flash.events.MouseEvent;
	import flash.events.TimerEvent;
	import flash.geom.Point;
	import flash.utils.Timer;
	
	[SWF(backgroundColor = "#000000", width = "1024", height = "640", frameRate="30")]
	public class math01yukkuri_1 extends Sprite
	{
		private var rollovered:Boolean = false;
		private var timer:Timer;
		
		//インスタンス
		private var ball:Sprite;
		private var wline:Sprite;
		private var obj:Array;
		
		public function math01yukkuri_1()
		{
			makeObject();
			
			this.ball.addEventListener(MouseEvent.ROLL_OVER, onROver);
			this.ball.addEventListener(MouseEvent.ROLL_OUT, onROut);
			
			timer = new Timer(33);
			timer.addEventListener(TimerEvent.TIMER, loop);
			timer.start();
		}
		
		public function makeObject():void{
			//インスタンスの生成
			
			//白いボール
			ball = new Sprite();
			ball.graphics.beginFill(0xffffff,1);
			ball.graphics.drawCircle(0,0,20);
			ball.graphics.endFill();
			
			ball.x = 100;
			ball.y = stage.stageHeight/2;
			this.addChild(ball);
			
			//白い直線
			wline = new Sprite();
			wline.graphics.lineStyle(1,0xffffff,1);
			wline.graphics.moveTo(0,stage.stageHeight/2);
			wline.graphics.lineTo(stage.stageWidth,stage.stageHeight/2);
			this.addChild(wline);
			
			//10個のボール
			obj = new Array();
			for(var i:int = 0; i<10 ; i++){
				var sp:Sprite = new Sprite();
				sp.graphics.beginFill(0xffffff * Math.random(), 1);
				sp.graphics.drawCircle(0,0,20);
				sp.graphics.endFill();
				
				sp.x = this.stage.stageWidth/2;
				sp.y = this.stage.stageHeight/2;
				
				obj.push(sp);
				this.addChild(sp);
			}
		}
		
		public function onROver(e:MouseEvent):void{rollovered = true;}
		public function onROut(e:MouseEvent):void{ rollovered = false;}
		
		public function loop(e:TimerEvent):void{
			
			for(var i:Number = 0 ; i<obj.length ; i++){
				var here:Point = new Point();
				
				if(rollovered){
					if(i == 0){
						here.x = this.ball.x + 80;
						here.y = this.ball.y;
					}else{
						here.x = obj[i-1].x + 80;
						here.y = obj[i-1].y;
					}
				}
				else{
					if(i == 0){
						here.x = this.stage.stageWidth + 140;
						here.y = this.stage.stageHeight/2 - 140;
					}else{
						here.x = obj[i-1].x;
						here.y = obj[i-1].y;
					}
				}
				
				//ここで徐々に動かしてる
				//8で割る部分の値が大きいほど遅く、小さいほど早く動く
				obj[i].x += (here.x - obj[i].x)/8;
				obj[i].y += (here.y - obj[i].y)/8;
			}
		}
	}
}