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

Case02 回転するルーレット

見るに耐えないプログラムだ・・・
正直挫折です。Case03以降もこんなきついインスタンスだと泣きたくなります

/*
ActionScript3.0による数学・物理学表現[入門編]
pp.32-43

いろいろひどいです

ルーレット部分について
・描写が超絶長い
・文字をきれいに表示できなくて、力技でやった
・回転させたいがためにSprite→Bitmap→Sprite→Spriteという意味不明なことになっています


結局点滅は断念しました
というか何をどう点滅させればいいのかよくわからない
*/

package
{
	import flash.display.Bitmap;
	import flash.display.BitmapData;
	import flash.display.BlendMode;
	import flash.display.Graphics;
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.events.MouseEvent;
	import flash.events.TimerEvent;
	import flash.geom.Matrix;
	import flash.text.TextField;
	import flash.text.TextFormat;
	import flash.utils.Timer;
	
	[SWF(backgroundColor = "#009933", width = "1024", height = "640", frameRate="30")]
	public class math02roulette_1 extends Sprite
	{
		private var roulette:Sprite;
		private var startBt:Sprite;
		private var rt:Sprite;
		private var rt2:Sprite;
		private var bmpd:BitmapData;
		private var g:Graphics;
		
		private var toAngle:Number = 0;
		private var curAngle:Number = 0;
		private var preAngle:Number = 0;
		private var timer:Timer;
		
		public function math02roulette_1()
		{
			
			makeObject();
			startBt.buttonMode = true;
			startBt.useHandCursor = true;
			
			startBt.addEventListener(MouseEvent.CLICK, onMouseClick);
			
			timer = new Timer(33);
			timer.addEventListener(TimerEvent.TIMER, loop);
			timer.start();
			
		}
		
		public function makeObject():void{
			//ボタン
			var btbmp:BitmapData = new BitmapData(100,100, true, 0x000000);
			var bttxt:TextField = new TextField();
			bttxt.defaultTextFormat  new TextFormat(null, 10, 0x000000, true);
			bttxt.text = "PUSH";
			
			var spbt:Sprite = new Sprite();
			spbt.graphics.beginFill(0xffffff);
			spbt.graphics.drawCircle(50,50,50);
			spbt.graphics.endFill();
			
			btbmp.draw(spbt);
			btbmp.draw(bttxt, new Matrix(1,0,0,1,30,40));
			startBt = new Sprite();
			
			startBt.addChild(new Bitmap(btbmp));
			
			startBt.x = 600;
			startBt.y = 200;
			
			addChild(startBt);
			
			//以下全部ルーレット
			roulette = new Sprite();
			
			//BitmapData宣言
			bmpd = new BitmapData(500,500,true,0x000000);
			//addChild(new Bitmap(bmpd));
			g = roulette.graphics;
			
			
			g.lineStyle(3,0x696969);
			
			//外側の円
			g.beginFill(0xffffff,1);
			g.drawCircle(bmpd.width/2, bmpd.height/2, 220);
			g.endFill();
			
			for(var i:int = 0; i<12 ; i++){
				g.moveTo(bmpd.width/2, bmpd.height/2);
				g.lineTo(bmpd.width/2 + 220*Math.cos(i*30/180*Math.PI), bmpd.height/2 + 220*Math.sin(i*30/180*Math.PI));
			}
			
			//扇形
			for(i = 0 ; i<12 ; i++){
				if(i%2==0) g.beginFill(0xffffff, 1);
				else      g.beginFill(0xc0c0c0, 1);
				drawFun(bmpd.width/2, bmpd.height/2, 200, i*30, (i+1)*30);
				g.endFill();
			}
			
			//真ん中の円
			g.beginFill(0xffffff, 1);
			g.drawCircle(bmpd.width/2,bmpd.height/2,100);
			g.endFill();
			
			bmpd.draw(roulette, null);
			g.clear();
			
			for(i = 1 ; i<=12 ; i++){
				var bmpd2:BitmapData = new BitmapData(50,50, true, 0x000000);
				var text:TextField = new TextField();
				text.defaultTextFormat = new TextFormat(null, 40, 0x000000, true);
				text.text=String(i);
			
				bmpd2.draw(text);
			
				var mtx:Matrix = new Matrix();
				var k:int = i*30-108;
				
				mtx.rotate((i*30-15)/180*Math.PI);
				mtx.translate(bmpd.width/2 - 10, bmpd.height/2);
				mtx.translate(170*Math.cos(k/180*Math.PI), 170*Math.sin(k/180*Math.PI));
			
			
				bmpd.draw(bmpd2, mtx);
			}
			rt2 = new Sprite();
			rt2.addChild(new Bitmap(bmpd));
			rt2.x = -rt2.width/2;
			rt2.y = -rt2.height/2;
			
			rt = new Sprite();
			rt.addChild(rt2);
			rt.x = rt2.width/2;
			rt.y = rt2.height/2;
			addChild(rt);
			
		}
		
		//扇形描写用
		private function drawFun(cx:Number, cy:Number, size:Number, startAngle:int, endAngle:int):void{
			g.moveTo(cx, cy);
			
			for(var i:int = startAngle ; i<= endAngle ; i++){
				g.lineTo( cx + size*Math.cos(i/360*2*Math.PI), cy + size*Math.sin(i/360*2*Math.PI));
			}
			g.lineTo(cx,cy);
		}
		public function onMouseClick(e:MouseEvent):void{
			toAngle += 720+Math.floor(Math.random()*12)*30;
		}
		
		public function loop(e:TimerEvent):void{
			preAngle = curAngle;
			curAngle += (toAngle - curAngle)/30;
			rt.rotation = curAngle;
			
			if(toAngle-curAngle < 1){
				if(toAngle - preAngle >= 1){
					//lightstart();
					curAngle = toAngle;
				}
			}
			else{
				//lightstop();
			}
		}
	
	
	}
}