もうちょっと仕様を考えてみる。
プレーヤーの操作であれ、勝手にであれ、パターンの移動はブロック一つ分。 であれば、ブロックとパターンとフィールドを、
として実現できる。 要するに、荒い電光掲示板だな。 実装するに簡単なのは、画素として正方形のセルを必要なだけ行と列に並べたテーブルか。
ああ、これだと、行と列をそのまま座標にできて便利だな。 行位置が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の正方形に入れて、これを回転するか。 でも、これはこれで、他のパターンの動きに違和感があるな。
各パターンを共通の処理で回転するのは諦めて、四角だけ回転しないことにするか。 たぶん、パターンをオブジェクトとして、これに回転のメソッドを持たせるようにすることになるだろう。 だったらそこをもう一歩進めて、各パターンを別のオブジェクトとして、それぞれ異なる回転のメソッドを持たせればいいのだ。 同じ回転処理を継承元のオブジェクトに持たせておいて、四角はこれをオーバーライド。 あ、いや、違うのは四角だけだから、四角だけ継承すればいいのか。
しかし、よくよく考えてみれば、他のパターンもプルプルした動きではあるんだよな。 パターンの中心と回転の中心が不一致で。 そんなところで四角だけ拘るのも無駄っぽいし、ここは多少の違和感には目をつぶろう。 なにしろ俺は目が細い。 開けてても瞑ってても大差ないのだ。
うん、なんかもう、今すぐにでも出来てしまいそうな気がしてきた。 続きはまた明日。