没有数组的俄罗斯方块旋转

Tetris Rotation without arrays

本文关键字:方块 旋转 俄罗斯 数组      更新时间:2023-10-16

我正在写一个俄罗斯方块克隆,它几乎完成了,除了碰撞。例如,为了移动 Z 块,我使用一种方法:

void PieceZ::movePieceDown()
{ 
  drawBlock (x1,y1++);
  drawBlock (x2,y2++);
  drawBlock (x3,y3++);
  drawBlock (x4,y4++);
}

为了旋转棋子,我使用二传手(因为坐标是私有的)。对于旋转,我使用 90 度顺时针旋转矩阵。例如,如果我想移动 (x1,y1) 并且 (x2, y2) 是我的原点,以获得新块的 x 和 y:

newX = (y1-y2) + x2;
newY = (x2-x1) + y2 + 1;

这在某种程度上是有效的,它开始于:

0 0 0 0
0 1 1 0
0 0 1 1
0 0 0 0

然后按计划旋转到:

0 0 0 1
0 0 1 1
0 0 1 0
0 0 0 0

然后它旋转到 S 件:

0 0 0 0
0 0 1 1
0 1 1 0
0 0 0 0

然后它只是在第二阶段和第三阶段之间交替。

我的计算是错误的,但我无法弄清楚在哪里,我只需要一点提示。

好的,

这是它应该如何进行(有点):

  • 确定要旋转工件的位置(可以是上角或下角或中心),并将其称为origin
  • 计算新的 x newX = y - origin.y;
  • 计算新的 y newY = -x + origin.x;

这应该有效(我从维基百科和旋转矩阵中得到了这个想法:https://en.wikipedia.org/wiki/Transformation_matrix)