「AS3による数学・物理学表現[入門編]」のプログラムをASファイルのみで記述4
Case03 三角関数(sin, cos)を利用した回転するメニュー
これはインスタンスの生成が全部as側で記述されているので、ちょこちょこ変数名を変えたり、コメント付けたり、関数化を細かくしたぐらいなのですが。
動かしたらとっても楽しかったです。
Flash Math & Physics Design:ActionScript 3.0による数学・物理学表現[入門編]
- 作者: 古堅真彦
- 出版社/メーカー: ソフトバンククリエイティブ
- 発売日: 2008/12/25
- メディア: 大型本
- 購入: 18人 クリック: 319回
- この商品を含むブログ (35件) を見る
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; } } } }