第17回【テトリス制作.5】


まずは動画を見てくださいね!
スペースキーでテトロミノを回転させます!
回転といっても、4x4の2次元配列を90度回転するだけなので、数学の知識もいりません!

回転する関数を作る

// テトロの回転
function rotate()
{
	let ntetro = [];
	
	for(let y=0; y<TETRO_SIZE ; y++ )
	{
		ntetro[y]=[];
		for(let x=0; x<TETRO_SIZE ; x++ )
		{
			ntetro[y][x] = tetro[TETRO_SIZE-x-1][y];
		}
	}
	
	return ntetro;
}
新しい4x4の配列ntetroに90度時計回りに回転したtetroをコピーしています。
解説は動画で詳しくしてますが、どうしてこれで90度回転するのかよく考えてください。
新しく作ったntetroはreturnで返す様にします。


キーボードで回転させる

スペースを押した時の処理に追加する。
		....
		case 32:// スペース
			tetro = rotate();
			break;
		....

ただ、このままだと回転できない場所でも回転してしまう(壁に埋まったりする)ため、回転する前に回転できるかどうかチェックする必要があります。

		....
		case 32:// スペース
			let ntetro = rotate();
			if( checkMove( 0, 0, ntetro) ) tetro = ntetro;
			break;
		....
回転後の新しいテトロntetroで、checkMove関数を利用して回転できるかチェックすることにする。
// ブロックの衝突判定
function checkMove( mx,my ,ntetro)
{
	if( ntetro == undefined ) ntetro = tetro;
	
	for(let y=0; y<TETRO_SIZE ; y++ )
	{
		for(let x=0; x<TETRO_SIZE ; x++ )
		{
			if(  ntetro[y][x]  )
			{
				let nx = tetro_x + mx + x;
				let ny = tetro_y + my + y;
				
				if( ny < 0 ||
					nx < 0 ||
					ny >= FIELD_ROW ||
					nx >= FIELD_COL ||
					field[ny][nx] )
				{
					return false;
				}
			}
		}
	}
	
	return true;
}
ntetroで判断するようにします。
ntetroが入っていない(undefined)時は現在のtetroでチェックするようにします。
これで完璧です!!
本物のテトリスは、回転する時に動けるルールがあるみたいですけどね...

続く...




akichon/あきちょん
Youtubeでプログラミング講座やってるゲーム好きの(元?)プログラマ...
>>open profile...
■Twitter始めました
https://twitter.com/ak1chon
■Youtubeチャンネルはこちら
akichon(Youtube)