如何在俄罗斯方块中旋转块


16

我有一个游戏板网格,该网格高20行,宽10列,其原点(0,0)位于左上角。我在玩四联体,由四个方块组成。我有每个块相对于左上角原点的x,y位置。我还具有枢轴的位置,即我希望围绕其旋转的点,该点相对于左上角的原点。

每个方块在游戏板正方形中具有整数位置,因此枢轴在方块之间具有小数位置,例如(10.5,10.5)

我的问题是:我可以使用哪个公式围绕枢轴旋转每个块?

我已经看过现有的类似问题和答案,但是找不到我可以工作的答案。

帮助将不胜感激。


属于游戏开发者。

如果它在这里...向我们展示一些数据结构

如果您仅旋转直角的倍数,那么这应该是相当基本的。只需绘制一些图表,您就应该能够找到整数解决方案。
Kerrek SB

3
我不会费心去实际计算旋转,只需将所有四个可能的旋转版本放入数组中即可。
fredoverflow 2011年

1
我还建议@FredOverflow说什么。如果您查看我的问题(与您的问题类似),则会看到我如何为实现存储一个块。
bummzack

Answers:


21

标准的俄罗斯方块旋转逻辑称为超级旋转系统。SRS适合于高水平的俄罗斯方块游戏,可以在壁球踢和T型旋转上进行多种变化。

除非被阻止,否则所有四聚体都存在于边界正方形内,并围绕该正方形的中心旋转。宽度3(J,L,S,T,Z)的四聚体放置在边界正方形的顶部两行中,并且(对于J,L和T)平坦的一面朝下。我被放在中间的第一行。

所有tetrominoes会在游戏场的顶部按2条通常隐藏的行生成。它们位于这些行的中心,向左舍入。一旦Tetromino着陆,它就不会锁定,直到锁定延迟到期为止。锁定延迟行为被Tetris Company称为Infinity,每当移动或旋转Tetromino时,就会重置锁定延迟。硬掉线通常映射为向上,没有锁定延迟。

旋转边界框中的Temino。

还有另一个称为ARS的常见变体,曾在Arika的《俄罗斯方块》中使用:The Grand Master游戏。


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度的倍数,则可以为每个方向存储四组积木位置,并在它们之间切换而不是实际旋转。



By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.