テトリスでブロックを回転させる方法


17

高さ20行、幅10列のゲームボードグリッドがあり、原点(0,0)は左上隅にあります。4つのブロックで構成されるテトリミノを使用しています。左上隅の原点を基準とした各ブロックのx、y位置があります。また、ピボットの位置、つまり左上隅の原点を基準にした回転の中心点もあります。

各ブロックはゲームボードの四角に整数位置を持っているため、ピボットはブロック間に小数位置を持ちます(例:(10.5,10.5)

私の質問は次のとおりです。ピボットを中心に各ブロックを回転させるのにどの数式を使用できますか?

私はすでに既存の同様の質問と回答を見てきましたが、仕事に就くことができる答えを見つけることができませんでした。

ヘルプをいただければ幸いです。


ゲーム開発者に属します。

そして、ここにある場合は、いくつかのデータ構造を表示します

直角の倍数だけ回転している場合、これはかなり基本的なものです。いくつかの図を描くだけで、整数解を見つけることができるはずです。
ケレックSB

3
私は実際に回転を計算することを気にせず、単純に4つの回転バージョンすべてを配列に入れます。
fredoverflow

1
@FredOverflowが言ったこともお勧めします。あなたが見れば私の質問(あなたに似ている)、私は私の実装のための単一のブロックを保存する方法を参照してください。
bummzack

回答:


22

標準のテトリス回転ロジックは、スーパー回転システムと呼ばれます。SRSは、高レベルのテトリスプレイに適しており、壁のキックとTスピンのさまざまなバリエーションを可能にします。

すべてのテトロミノは境界のある正方形の内部に存在し、遮られない限りこの正方形の中心の周りを回転します。幅3のテトロミノ(J、L、S、T、Z)は、境界の正方形の上部の2行に配置され、(J、L、およびTの場合)平らな側を下にします。私は一番上の中央の行に配置されます。

すべてのテトロミノは、プレイフィールドの上部にある通常は隠された2つの行に出現します。これらは、これらの行の中央に配置され、左に丸められます。テトロミノが着陸すると、ロック遅延が期限切れになるまでロックされません。Tetris CompanyによってInfinityと呼ばれるロック遅延動作は、tetrominoが移動または回転するたびにロック遅延をリセットします。通常、ハードドロップはupにマッピングされ、ロック遅延はありません。

回転境界ボックス内のテトロミノ。

アリカのテトリスで使用されたARSと呼ばれる別の一般的なバリアントがあります:グランドマスターゲーム。


7

原点を中心に回転する一般的な式は

xNew = x * cos(a) - y * sin(a)
yNew = x * sin(a) + y * cos(a)

90度になると

xNew = -y
yNew = x

そのため、まずピボットポイントを基準にしてレンガの中心座標を取得します。

x = xBrickCenter - xPivot
y = yBrickCenter - yPivot

次に、ピボットポイントを中心に回転させます。

x1 = -y = yPivot - yBrickCenter
y1 = x = xBrickCenter - xPivot

次に、回転したポイントにピボット座標を追加します。

newXBrickCenter = xPivot + x1 = xPivot + yPivot - yBrickCenter
newYBrickCenter = yPivot + y1 = yPivot - xPivot + xBrickCenter

ただし、90度の倍数だけ回転する必要がある場合は、実際に回転する代わりに、各方向に4セットのブリック位置を保存し、それらを切り替えることができます。


0

すべての正方形のリング(a-h-hを2ポジション、A-through-Pを4ポジションなど)をピボットブロックの周りに回転させることができます。

ABCDE MNOPA
PabcF LghaB
Oh.dG-> Kf.bC
NgfeH JedcD
MLKJI IHGFE

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.