2010 02 02

テトリスを作るの2

もうちょっと仕様を考えてみる。

ブロックとパターンとフィールド

プレーヤーの操作であれ、勝手にであれ、パターンの移動はブロック一つ分。 であれば、ブロックとパターンとフィールドを、

として実現できる。 要するに、荒い電光掲示板だな。 実装するに簡単なのは、画素として正方形のセルを必要なだけ行と列に並べたテーブルか。

ああ、これだと、行と列をそのまま座標にできて便利だな。 行位置がX座標で列位置がY座標。 原点は左上。

回転

とりあえず、回転するのは一方向でいいだろう。 回転角は90度。

さて、どうするかな。 原点周りの90度回転は、座標 ( x , y ) を ( -y , x ) と変換して得られる。 が、これはあくまでも原点周り。 フィールドの座標をそのまま使うと、パターンはいきなりフィールドの外に出てしまうんだよな。

あ、パターンの中に回転の中心があればいいのか。 パターンを、パターンローカルの座標と、フィールド内のオフセットとして管理すればいいのだな。 これだと、

回転
ローカル座標に対して、さっきの座標変換をする。
移動
オフセットを変更する。

と、結構簡単に処理できそうだし。 それぞれのパターンのローカル座標は、こんな感じ。 (0,0)を回転の中心として

0,-1 0,0 0,1 0,2
0,0 0,1
1,0 1,1
0,-1 0,0 0,1
1,-1
0,-1 0,0 0,1
1,1
0,0 0,1
1,-1 1,0
0,-1 0,0
1,0 1,1
0,-1 0,0 0,1
1,0

これだと、2番目の四角のパターンが、回転によってなんかプルプル動いてしまうのか。 本来のテトリスは、四角の奴は回転しても何も変化しなかったような。

パターンを画素4×4の正方形に入れて、これを回転するか。 でも、これはこれで、他のパターンの動きに違和感があるな。

各パターンを共通の処理で回転するのは諦めて、四角だけ回転しないことにするか。 たぶん、パターンをオブジェクトとして、これに回転のメソッドを持たせるようにすることになるだろう。 だったらそこをもう一歩進めて、各パターンを別のオブジェクトとして、それぞれ異なる回転のメソッドを持たせればいいのだ。 同じ回転処理を継承元のオブジェクトに持たせておいて、四角はこれをオーバーライド。 あ、いや、違うのは四角だけだから、四角だけ継承すればいいのか。

しかし、よくよく考えてみれば、他のパターンもプルプルした動きではあるんだよな。 パターンの中心と回転の中心が不一致で。 そんなところで四角だけ拘るのも無駄っぽいし、ここは多少の違和感には目をつぶろう。 なにしろ俺は目が細い。 開けてても瞑ってても大差ないのだ。

うん、なんかもう、今すぐにでも出来てしまいそうな気がしてきた。 続きはまた明日。