4

私は独自のテトリス クローンを設計しようとしていますが、形状の回転で少し問題が発生しました。10 x 20 のゲーム グリッドを表す 2 次元配列と、初期化時に形状が落下し始めるグリッド上の座標を含む個々の形状オブジェクトがあります。たとえば、ユーザーがシェイプを下に移動すると、各座標の y 値が減少し、この変更がグリッドに反映されます。

私が理解できないように見えるのは、この実装を使用して形状の回転を処理する効率的な方法です。指定されたピボットの周りのこれらの座標のマトリックスを使用する方法はありますか?

どんな提案でも大歓迎です、

ありがとうございました。

4

5 に答える 5

6

従来のローテーション マトリックスが機能する場合は、使用するローテーション システムによって異なります。例としてSRSを使用します。

原点を中心とした反時計回りの回転行列は次のとおりです。

[0 -1]
[1  0]

ここで、初期位置にある I ブロックを表す座標 [(0, 1), (1, 1), (2, 1), (3, 1)] のリストがあるとします。

 0123
0....
1####
2....
3....

デカルト座標系は使用していませんが、左上から始まる通常の画面座標を使用していることに注意してください。ブロックを適切に回転させるには、まず y 軸の反転を考慮する必要があります。回転行列は次のようになります。

[ 0 1]  ->  x_new = y_old
[-1 0]  ->  y_new = -x_old

次に、ピボット ポイントを中心に回転するには、回転する前に、ピボット ポイントが原点になるように座標をシフトし (以下で呼び出されsbます)、回転後にそれらを元に戻す必要があります (以下で呼び出されsaます)。

x_new = sa_x + (y_old - sb_x)
y_new = sa_y - (x_old - sb_y)

通常は になりますsb = saが、テトリス ブロックの場合、ピボット ポイントは 2 つのセルの間のグリッド (I ブロックと O ブロックの場合) にあることもあれば、セルの中心にあることもあります (他のすべてのブロックの場合)。

判明したのは

sa_x = 0
sb_x = 0
sa_y = 1
sb_y = me - 2

ここmeで、 は回転するブロックの最大範囲 (つまり、2、3、または 4) で、すべてのブロックで機能します。要約すると、次のようになります。

x_new = y_old
y_new = 1 - (x_old - (me - 2))

時計回りの回転も同様ですが、すべてのブロックの向きの座標をキャッシュすると、必要な方向は 1 方向だけになります。

他の回転システムでは、シフト変数の他の値が機能する可能性がありますが、ブロックの現在の方向に応じて、ピースを再度シフトする必要がある場合があります ( SRS 回転をI ブロックのDTET 回転と比較して、私の意味を確認してください) .

于 2010-01-03T22:04:12.850 に答える
5

「アフィン変換」で検索してみてください。しかし、あなたの場合、離散角度でのオブジェクトの正確に4つの可能な回転があります.70.3°の回転はなく、0、90°、180°、270°です。では、なぜ事前計算しないのでしょうか?

于 2009-09-22T00:49:31.177 に答える
1

これは古典的な線形代数です。回転行列を探していますが、すべての角度が直角であるため、サインとコサインを事前に計算できます。

ウィキペディア: 回転行列

ポイントの周りでそれを行うには、最初に中心値を減算し(その参照ポイントを中心原点にします)、次にマトリックスを適用し、元の中心位置を追加する必要があります.

于 2009-09-22T01:33:40.437 に答える
0

私はあなたが今までにこれを終えたと仮定します. 私はプログラマーではありませんが、Uni でこれを行ったことを覚えています。各ピースに 4 つの異なるオブジェクト (回転が異なる) がありました。たとえば、「L」字形にはピース 1、2、3、4 があります。アクティブ ピースが 3 で時計回りに回転した場合、ピース 4 をロードし、再び時計回りに回転してピース 1 をロードします。

于 2010-02-05T00:48:59.253 に答える