forked from: 6面体

by umhr
無粋にいろいろ突っ込んでみた。
♥0 | Line 69 | Modified 2009-11-20 02:36:22 | MIT License
play

ActionScript3 source code

/**
 * Copyright umhr ( http://wonderfl.net/user/umhr )
 * MIT License ( http://www.opensource.org/licenses/mit-license.php )
 * Downloaded from: http://wonderfl.net/c/uMSX
 */

// forked from msdfjp's 6面体
//無粋にいろいろ突っ込んでみた。
package {
	import flash.display.Sprite;
	import flash.events.KeyboardEvent;
	import flash.events.Event;
	
	//クラス名は大文字から始めるのがセオリー
	//MovieClipはタイムライン的動作が必要な時にのみ使う。
	//こういうのなら、Spriteで十分
	public class Box3D extends Sprite {
		public function Box3D():void {

			var a_mc:Sprite = new Sprite();
			//配列内で管理するなら、これいらないよ
//			var fill_a_mc:Sprite = new Sprite();
//			var fill_b_mc:Sprite = new Sprite();
//			var fill_c_mc:Sprite = new Sprite();
//			var fill_d_mc:Sprite = new Sprite();
//			var fill_e_mc:Sprite = new Sprite();
//			var fill_f_mc:Sprite = new Sprite();
			var mc_array:Array = [new Sprite(),new Sprite(),new Sprite(),new Sprite(),new Sprite(),new Sprite()];

			mc_array[0].graphics.beginFill(0x012345);
			mc_array[1].graphics.beginFill(0x123456);
			mc_array[2].graphics.beginFill(0x456723);
			mc_array[3].graphics.beginFill(0x567834);
			mc_array[4].graphics.beginFill(0x894567);
			mc_array[5].graphics.beginFill(0x9a5678);
			
			var j:int;
			for (j=0; j<6; j++) {
				//こっちにまとめちゃえば?
				mc_array[j].graphics.drawRect(-50, -50, 100, 100);
				mc_array[j].graphics.endFill();
				a_mc.addChild(mc_array[j]);
			}
			this.addChild(a_mc);
			
			//this.stage.stageWidthにthisはいらないんじゃないかな(よくわかんないけど)
			a_mc.x = stage.stageWidth / 2;
			a_mc.y = stage.stageHeight / 2;

			mc_array[0].z = 50;
			mc_array[1].z = -50;
			mc_array[2].x = 50;
			mc_array[3].x = -50;
			mc_array[4].y = 50;
			mc_array[5].y = -50;

			mc_array[2].rotationY = 90;
			mc_array[3].rotationY = 90;
			mc_array[4].rotationX = 90;
			mc_array[5].rotationX = 90;


			a_mc.addEventListener(Event.ENTER_FRAME, doEnterFrame);

			stage.addEventListener(KeyboardEvent.KEY_DOWN, doKeyboardEvent);
			
			
		}
		private function doKeyboardEvent(e:KeyboardEvent):void {
			switch (e.keyCode) {
				case 39 :
				//this上に一つしか子供が無いので、
				//これでもいける
					this.getChildAt(0).x+=10;
					break;
				case 37 :
					this.getChildAt(0).x-=10;
					break;
				case 40 :
					this.getChildAt(0).z-=10;
					break;
				case 38 :
					this.getChildAt(0).z+=10;
					break;
			}
		}
		private function doEnterFrame(e:Event):void {
			//a_mcはイベントを設置している場所なので、
			//e.targetでもアクセスできる。
			//this.getChildAt(0)でもいいけど。
			
			e.target.rotationX += 0.5;
			e.target.rotationY+=1;
			e.target.rotationZ+=1.5;

			//arrayの初期化は[]のほうがいいらしい;
			var zCheck:Array = [];
			var i:int;
			
			for (i=0; i<6; i++) {
				//mc_array[i]はe.target(a_mc)の6人の子供なので、
				//getChildAtでアクセスできる。
				var posZ:Number=e.target.getChildAt(i).transform.getRelativeMatrix3D(root).position.z;
				zCheck[i]={z:posZ,mc:e.target.getChildAt(i)};
			}
			
			zCheck.sortOn("z", Array.NUMERIC | Array.DESCENDING);
//これなくてもよくない?(よくわかんないけど)
//				for (i=0; i<6; i++) {
//					a_mc.removeChild(mc_array[i]);
//				}

			for (i=0; i<6; i++) {
				e.target.addChild(zCheck[i].mc);
			}
		}
	}
}