我正在构建俄罗斯方块并尝试考虑如何旋转碎片。
他们在一个街区上旋转吗?或者他们应该变形......也就是交换位置?
我正在考虑这样做的方式是硬编码......就像(伪代码):
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次旋转)
其次)从那里......根据该片段将其设置为新的硬编码坐标
我必须为每件作品做到这一点......这似乎是错误的思考方式。
还有其他想法吗?
答案 0 :(得分:1)
如果您将片段存储为矩阵,则可以使用通用函数旋转矩阵。假设您要将[[1,1,1],[0,0,0],[0,0,0]]向左旋转90度 - > [[1,0,0],[1,0,0],[1,0,0]]。这有帮助吗?
答案 1 :(得分:1)
您有2个选项(取决于存储形状的方式):
在第一个版本中,您必须计算运行时间,找到形状的中心等。
在第二个版本中,您必须进行预先计算,并对形状进行硬编码。
我认为第二种方法更好,因为你有固定数量的片段和固定的阶段数。但这取决于你。
答案 2 :(得分:1)
每个PieceType对象可能有1-4个Orientation对象。然后,每个方向将定义实际块的位置(相对于某个枢轴)。例如
PieceType "L":
Orientation 1:
#
#
##
Orientation 2:
###
#
Orientation 3:
##
#
#
Orientation 4:
#
###
PieceType "I":
Orientation 1:
#
#
#
#
Orientation 2:
####
每个PieceType还可以保存关于每个可能的“方向改变”(即旋转)所需空间的信息。这是所有静态信息,因此在游戏过程中确实没有必要移动块。只需更改Piece的方向,让Orientation对象告诉您块位置。
答案 3 :(得分:1)
这个示例代码看起来像是一场噩梦。
另一种方法,那就是超级简单,就是将电路板视为固定数量的单元,然后将每个“旋转”视为计算每个部件位置应移动多少的一种方式,然后只是重新安装这些碎片,然后让它们自己绘制,所以从碎片的角度来看,它们只是被告知:'好吧,你现在在A5。'
如果你看一下你的第一个例子,新的位置只是它们目前偏离中心和所需旋转方向的函数。
关于这种方法的最好的事情是,你不是在做大量可怕的案例陈述,并使上帝目标代码完全不可持续。
答案 4 :(得分:0)
恕我直言,最简单的方法不是旋转或变换块,而是要记住每个状态下的块形状(正常,rotate_90_degrees,rotate_180_degrees,rotate_270_degrees)
答案 5 :(得分:0)
我建议您将一个片段定义为相对于单个旋转点的点。然后你可以(使用一个小矩阵代数)应用一个简单的旋转3次,以获得相对于中心点的其他布局。
旋转然后从显示的游戏中取消设置当前点,切换到下一个旋转,然后将新点重新应用到显示的游戏。