10

我正在构建俄罗斯方块并试图思考我应该如何旋转碎片。

它们是在一个块上旋转吗?或者他们应该变形......也就是交换位置?

在此处输入图像描述

我正在考虑这样做的方式是硬编码......就像(伪代码):

if (rotateRight()) {

    if (Piece == "T") {
        if (Piece.getCurrRotation() == down (aka.. 180 degrees))
          move each Tile in Piece from the down rotation to the left rotation... each coordinate would be pre-specified for a given condition... aka lot's of hardcoding
     }
    if (Piece == "L") { etc...

     }
}
if (rotateLeft()) {
     perform same checks for the Left...
}

但这似乎是大量的代码,只是为了弄清楚

首先)当前件在哪个旋转(每件有4个可能的旋转)

其次)从那里...将其设置为基于该部分的新硬编码坐标

我必须为每一件作品都这样做......这似乎是错误的思考方式。

还有其他想法吗?

4

6 回答 6

1

如果您将片段存储为矩阵,则可以使用通用函数旋转矩阵。假设您要将 [[1, 1, 1], [0, 0, 0], [0, 0, 0]] 向左旋转 90 度 -> [[1,0,0], [1,0 ,0],[1,0,0]]。这有帮助吗?

于 2013-04-03T14:36:39.380 回答
1

您有 2 个选项(取决于您存储形状的方式):

  • 通过重新定位形状块来执行旋转运行时(将形状点保持在矩阵中,并围绕中心旋转)。
  • 为形状存储 4 个(或者对于旋转不变的形状,2 个甚至 1 个)相位,并且只增加/减少形状所在的相位。

在第一个版本中,您必须计算运行时间、找到形状的中心等。

在第二个版本中,您必须进行预先计算,并对形状进行硬编码。

我认为第二种方法更好,因为您有固定数量的零件和固定数量的阶段。但这取决于你。

于 2013-04-03T14:45:39.293 回答
1

对于每个 PieceType 对象,我可能会有 1-4 个 Orientation 对象。然后每个方向将定义实际块的位置(相对于某个枢轴)。例如

PieceType "L":

    Orientation 1:
    #
    #
    ##

    Orientation 2:
    ###
    #

    Orientation 3:
    ##
     #
     #

    Orientation 4:
      #
    ###

PieceType "I":

    Orientation 1:
    #
    #
    #
    #

    Orientation 2:
    ####

每个 PieceType 还可以保存有关每个可能的“方向变化”(即旋转)所需空间的信息。这都是静态信息,所以在游戏过程中真的不需要移动方块。只需改变棋子的方向,让方向对象告诉你块的位置。

于 2013-04-03T14:56:56.257 回答
1

该示例代码看起来像是一场噩梦。

另一种非常简单的方法是将棋盘视为固定数量的单元,然后将每次“旋转”视为计算每块位置应移动多少的一种方式,然后重新安装就像是这些碎片,然后让他们自己画,所以从碎片的角度来看,他们只是被告知:'好吧,你现在在 A5。

如果您查看第一个示例,则新位置只是它们当前与中心的偏移量和所需旋转方向的函数。

这种方法最好的一点是,您不会到处跑来跑去做大量可怕的案例陈述,并制作完全不可持续的上帝目标代码。

于 2013-04-03T18:56:31.503 回答
0

恕我直言,最简单的方法不是旋转或变换块,而是记住每个状态下的块形状(正常,旋转_90_度,旋转_180_度,旋转_270_度)

于 2013-04-03T14:37:17.760 回答
0

我建议您将一块定义为相对于单个旋转点的点。然后,您可以(使用一点矩阵代数)应用简单的旋转 3 次以获得相对于中心点的其他布局。

旋转然后从显示的游戏中取消设置当前点,切换到下一个旋转,然后将新点重新应用于显示的游戏。

于 2013-04-03T14:43:13.377 回答