「AS3による数学・物理学表現[入門編]」のプログラムをASファイルのみで記述3
Case02 回転するルーレット
見るに耐えないプログラムだ・・・
正直挫折です。Case03以降もこんなきついインスタンスだと泣きたくなります
Flash Math & Physics Design:ActionScript 3.0による数学・物理学表現[入門編]
- 作者: 古堅真彦
- 出版社/メーカー: ソフトバンククリエイティブ
- 発売日: 2008/12/25
- メディア: 大型本
- 購入: 18人 クリック: 319回
- この商品を含むブログ (35件) を見る
/* 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(); } } } }