【发布时间】:2016-04-26 22:16:07
【问题描述】:
我正在写一个俄罗斯方块克隆,它几乎完成了,除了碰撞。例如,为了移动 Piece Z,我使用了一种方法:
void PieceZ::movePieceDown()
{
drawBlock (x1,y1++);
drawBlock (x2,y2++);
drawBlock (x3,y3++);
drawBlock (x4,y4++);
}
为了旋转 Piece,我使用了 setter(因为坐标是私有的)。对于旋转,我使用 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
然后它只是在第二阶段和第三阶段之间交替。
我的计算错了,但我不知道在哪里,我只需要一点提示。
【问题讨论】:
-
为了验证转换是否正确,旋转原点块本身。结果应该是块不动。在您的情况下,
newX仍然是x2,但newY变为y2 + 1,而不是剩余的y2。 -
另外,同一个表达式中不应存在不同的坐标。由于您正在旋转一块,因此所有影响
x坐标的值都必须是y类型,而所有影响y的值本质上必须是x。 -
你用作原点的块,
在你计算 之后更新,但在你计算 和 之前,所以不所有块都使用相同的原点坐标。您应该保存 的副本,这将在整个变换计算过程中保持一致。 -
@Dialectus 非常感谢您的建议,我会确保像那样验证我的表达!
-
@ChristopherOicles 这正是我的问题所在,这就是我在 y 坐标上加 1 的原因,否则这些块不会到位
标签: c++ objective-c tetris