如果使用传统的旋转矩阵取决于您想要使用的
旋转系统。我将以
SRS为例。
逆时针绕原点旋转的旋转矩阵为:
[0 -1]
[1 0]
现在,假设你有一个坐标列表[(0,1)、(1,1)、(2,1)、(3,1)],代表I型方块的初始位置:
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
,但对于俄罗斯方块中的方块,枢轴点有时位于两个单元格之间的网格上(对于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))
顺时针旋转类似,但如果您为所有块方向缓存坐标,则只需要一个方向。
对于其他旋转系统,可能需要其他移位变量的值,但根据块的当前方向,您可能需要再次移动该块(将SRS rotation与DTET rotation的I块进行比较,以了解我的意思)。