− 立方体 −  下部のソースコードは、とりあえずMTASCだけでできることを示すためのものです。自由に改良して楽しんでください。

  
//****************************************************************************************
// ファイル名:Cube.as
// MTASCでコンパイルして swf ファイルを作るための ActionScript によるコード
// コンパイルは mtasc -version 8 -swf Cube.swf -main Cube.as -header 500:400:30
// All rights reserved. Copyright (C) 2007 YokahiYokatoki
//****************************************************************************************
class Cube
{
	static function main()
	{
		var cube:Cube=new Cube(_root);
	}

	function Cube()
	{
		var n=2; // 2×2×2
		var x0=230; // マージン
		var y0=200;
		var D=56; // キューブの一辺の長さ
		var dd=D/12;
		var As=3*D; // 画面の原点からの距離
		var R=34*D; // 視点の位置
		var mv=0;

		var bx=new Array(); // 実座標
		var by=new Array();
		var bz=new Array();
		var sx=new Array(); // 描画用座標
		var sy=new Array();
		for(var i=0; i< n; i++) // キューブ
		{
			bx[i]=new Array();
			by[i]=new Array();
			bz[i]=new Array();
			sx[i]=new Array();
			sy[i]=new Array();
			for(var j=0; j< n; j++)
			{
				bx[i][j]=new Array();
				by[i][j]=new Array();
				bz[i][j]=new Array();
				sx[i][j]=new Array();
				sy[i][j]=new Array();
				for(var k=0; k< n; k++)
				{
					bx[i][j][k]=new Array();
					by[i][j][k]=new Array();
					bz[i][j][k]=new Array();
					sx[i][j][k]=new Array();
					sy[i][j][k]=new Array();
					for(var p=0; p<3; p++) // 3つの面(3,4,5面は見えないので除く)
					{
						bx[i][j][k][p]=new Array();
						by[i][j][k][p]=new Array();
						bz[i][j][k][p]=new Array();
						sx[i][j][k][p]=new Array();
						sy[i][j][k][p]=new Array();
						for(var q=0; q<4; q++) // 4つのコーナー
						{
							bx[i][j][k][p][q]=new Array();
							by[i][j][k][p][q]=new Array();
							bz[i][j][k][p][q]=new Array();
							sx[i][j][k][p][q]=new Array();
							sy[i][j][k][p][q]=new Array();
						}
					}
				}
			}
		}

		var fcr=new Array(); // 面の色(初期状態)
		for(var i=0; i< n; i++)
		{
			fcr[i]=new Array();
			for(var j=0; j< n; j++)
			{
				fcr[i][j]=new Array();
				for(var k=0; k< n; k++)
				{
					fcr[i][j][k]=new Array();
					if(i==0){fcr[i][j][k][0]=0x222222; fcr[i][j][k][3]=0xFFFF00;}
					else if(i==1){fcr[i][j][k][0]=0x00AA22; fcr[i][j][k][3]=0x222222;}
					if(j==0){fcr[i][j][k][1]=0x222222; fcr[i][j][k][4]=0xAA0022;}
					else if(j==1){fcr[i][j][k][1]=0xFF6600; fcr[i][j][k][4]=0x222222;}
					if(k==0){fcr[i][j][k][2]=0x222222; fcr[i][j][k][5]=0x002288;}
					else if(k==1){fcr[i][j][k][2]=0xDDDDDD; fcr[i][j][k][5]=0x222222;}
				}
			}
		}

		var flag=0; // 回転方向
		var phi=-50; // 視点の方向
		var theta=35;
		var time=0;
		var waiting=setInterval(function()
		{
			if(flag==0){time++;} else {time--;}
			if(time>70 || time<-30){flag=1-flag;}
			var csP=Math.cos(Math.PI/180*phi+0.01*time);
			var siP=Math.sin(Math.PI/180*phi+0.01*time);
			var csT=Math.cos(Math.PI/180*theta+0.005*time);
			var siT=Math.sin(Math.PI/180*theta+0.005*time);

			// 各点の実座標の作成-------------------------------------------------------
			var c0=new Array();
			var c1=new Array();
			var c2=new Array();
			c0[0]=D+dd; c0[1]=D+dd; c0[2]=D+dd; c0[3]=D+dd;
			c1[0]=-D; c1[1]=D; c1[2]=D; c1[3]=-D;
			c2[0]=-D; c2[1]=-D; c2[2]=D; c2[3]=D;

			var ex=new Array();
			var ey=new Array();
			var ez=new Array();
			for(var p=0; p<6; p++)
			{
				ex[p]=new Array();
				ey[p]=new Array();
				ez[p]=new Array();
			}
			for(var q=0; q<4; q++)
			{
				ex[0][q]=c0[q]; ey[0][q]=c1[q]; ez[0][q]=c2[q];
				ex[1][q]=c2[q]; ey[1][q]=c0[q]; ez[1][q]=c1[q];
				ex[2][q]=c1[q]; ey[2][q]=c2[q]; ez[2][q]=c0[q];
				ex[3][q]=-c0[q]; ey[3][q]=c1[q]; ez[3][q]=c2[q];
				ex[4][q]=c2[q]; ey[4][q]=-c0[q]; ez[4][q]=c1[q];
				ex[5][q]=c1[q]; ey[5][q]=c2[q]; ez[5][q]=-c0[q];
			}

			// 各点と、描画座標の作成---------------------------------------------------------
			for(var i=0; i< n; i++)
			{
				for(var j=0; j< n; j++)
				{
					for(var k=0; k< n; k++)
					{
						if(i==n-1 || j==n-1 || k==n-1)// 見えるものだけ描画
						{
							for(var p=0; p<3; p++) // 3つの面(3,4,5面は見えないので除く)
							{
								for(var q=0; q<4; q++) // 4つの頂点
								{
									bx[i][j][k][p][q][0]=ex[p][q]+(D+dd)*(2*i-1);
									by[i][j][k][p][q][0]=ey[p][q]+(D+dd)*(2*j-1);
									bz[i][j][k][p][q][0]=ez[p][q]+(D+dd)*(2*k-1);
									var Px=bx[i][j][k][p][q][0];
									var Py=by[i][j][k][p][q][0];
									var Pz=bz[i][j][k][p][q][0];
									var x1=Px*csP-Py*siP;// 描画座標に変換===========
									var y1=Px*siP+Py*csP;
									var z1=Pz;
									var z2=z1*csT-x1*siT;
									var x2=z1*siT+x1*csT;
									var y2=y1;
									sx[i][j][k][p][q][0]=x0+(R-As)/(R-x2)*y2;
									sy[i][j][k][p][q][0]=y0-(R-As)/(R-x2)*z2;
									//===============================================
								}
							}
						}
					}
				}
			}

			var fig0=_root.createEmptyMovieClip("fig0", 99);

			fig0.lineStyle(0, 0x000000, 0); // 全体の影
			fig0.beginFill(0x000000, 10);
			fig0.moveTo(-1000,400);fig0.lineTo(sx[0][1][1][2][3][mv], sy[0][1][1][2][3][mv]);
			fig0.lineTo(sx[1][1][0][0][1][mv], sy[1][1][0][0][1][mv]);
			fig0.lineTo(-1000,400);fig0.endFill();
			fig0.beginFill(0x000000, 20);
			fig0.moveTo(-1000,450);fig0.lineTo(sx[0][1][1][2][3][mv], sy[0][1][1][2][3][mv]);
			fig0.lineTo(sx[1][1][0][0][1][mv], sy[1][1][0][0][1][mv]);
			fig0.lineTo(-1000,450);fig0.endFill();

			for(var i=0; i< n; i++) // キューブ
			{
				for(var j=0; j< n; j++)
				{
					for(var k=0; k< n; k++)
					{
						if(i==n-1 || j==n-1 || k==n-1)// 見えるものだけ描画
						{
							var cl=0x333333;
							var fx=new Array();
							var fy=new Array();
							var sx0, sy0,sx1, sy1;
							for(var p=0; p<3; p++)
							{
								fx[p]=new Array();
								fy[p]=new Array();
								for(var q=0; q<4; q++)
								{
									fx[p][q]=sx[i][j][k][p][q][0];
									fy[p][q]=sy[i][j][k][p][q][0];
								}
							}
							for(var h=0; h<3; h++) // 縦辺(光沢)、左上辺(光沢)
							{
								if(h==0){cl=0x333333;} else if(h==1){cl=0x555555;} else {cl=0x444444;}
								fig0.lineStyle(3, cl, 100);
								sx0=fx[0][2]+(fx[1][2]-fx[0][2])/3*h+2;
								sy0=fy[0][2]+(fy[1][2]-fy[0][2])/3*h;
								sx1=fx[0][1]+(fx[1][3]-fx[0][1])/3*h+2;
								sy1=fy[0][1]+(fy[1][3]-fy[0][1])/3*h;
								fig0.moveTo(sx0, sy0);fig0.lineTo(sx1, sy1);fig0.lineTo(sx0, sy0);fig0.endFill();
								sx0=fx[2][1]+(fx[0][3]-fx[2][1])/3*h;
								sy0=fy[2][1]+(fy[0][3]-fy[2][1])/3*h+2;
								sx1=fx[2][2]+(fx[0][2]-fx[2][2])/3*h;
								sy1=fy[2][2]+(fy[0][2]-fy[2][2])/3*h+2;
								fig0.moveTo(sx0, sy0);fig0.lineTo(sx1, sy1);fig0.lineTo(sx0, sy0);fig0.endFill();
							}
							for(var h=1; h<6; h++) // 右上辺(光沢)
							{
								if(h<1){cl=0x666666;} else if(h<2){cl=0x888888;} else if(h<3){cl=0xaaaaaa;}
								else if(h<4){cl=0x666666;} else {cl=0x444444;}
								fig0.lineStyle(2, cl, 100);
								sx0=fx[2][2]+(fx[1][2]-fx[2][2])/5*h;
								sy0=fy[2][2]+(fy[1][2]-fy[2][2])/5*h;
								sx1=fx[2][3]+(fx[1][1]-fx[2][3])/5*h;
								sy1=fy[2][3]+(fy[1][1]-fy[2][3])/5*h;
								fig0.moveTo(sx0, sy0);fig0.lineTo(sx1, sy1);fig0.lineTo(sx0, sy0);fig0.endFill();
							}
							fig0.lineStyle(0, 0x666666, 50); // 角
							fig0.beginFill(0x555555, 80);
							fig0.moveTo(fx[0][2], fy[0][2]);fig0.lineTo(fx[1][2], fy[1][2]);
							fig0.lineTo(fx[2][2], fy[2][2]);fig0.lineTo(fx[0][2], fy[0][2]);fig0.endFill();
							
							for(var p=0; p<3; p++) // 3つの面(3,4,5面は見えない)
							{
								fig0.lineStyle(0, 0x444444, 100);
								fig0.beginFill(0x444444, 100); 
								fig0.moveTo(fx[p][0], fy[p][0]); for(var q=1; q<4; q++){fig0.lineTo(fx[p][q], fy[p][q]);}
								fig0.lineTo(fx[p][0], fy[p][0]);fig0.endFill();

								fig0.beginFill(fcr[i][j][k][p], 100); // 角に丸みをつけた色面
								fig0.moveTo(fx[p][0]+0.04*(fx[p][1]-fx[p][0]), fy[p][0]+0.04*(fy[p][1]-fy[p][0]));
								fig0.lineTo(fx[p][1]+0.04*(fx[p][0]-fx[p][1]), fy[p][1]+0.04*(fy[p][0]-fy[p][1]));
								fig0.lineTo(fx[p][1]+0.04*(fx[p][2]-fx[p][1]), fy[p][1]+0.04*(fy[p][2]-fy[p][1]));
								fig0.lineTo(fx[p][2]+0.04*(fx[p][1]-fx[p][2]), fy[p][2]+0.04*(fy[p][1]-fy[p][2]));
								fig0.lineTo(fx[p][2]+0.04*(fx[p][3]-fx[p][2]), fy[p][2]+0.04*(fy[p][3]-fy[p][2]));
								fig0.lineTo(fx[p][3]+0.04*(fx[p][2]-fx[p][3]), fy[p][3]+0.04*(fy[p][2]-fy[p][3]));
								fig0.lineTo(fx[p][3]+0.04*(fx[p][0]-fx[p][3]), fy[p][3]+0.04*(fy[p][0]-fy[p][3]));
								fig0.lineTo(fx[p][0]+0.04*(fx[p][3]-fx[p][0]), fy[p][0]+0.04*(fy[p][3]-fy[p][0]));
								fig0.lineTo(fx[p][0]+0.04*(fx[p][1]-fx[p][0]), fy[p][0]+0.04*(fy[p][1]-fy[p][0]));
								fig0.endFill();
							}
						}
					}
				}
			}
		}, 10)	// この数値の単位は、ミリ秒(1/1000秒)
	}
}

Copyright(C) 2007 YokahiYokatoki