【问题标题】:Tetris Rotation without arrays没有数组的俄罗斯方块旋转
【发布时间】: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


【解决方案1】:

好的,这就是它应该如何进行的(有点):

  • 确定要旋转的位置(这可能是上角或下角或中心)并将其命名为origin
  • 计算新的 x newX = y - origin.y;
  • 计算新的 y newY = -x + origin.x;

这应该可行(我从维基百科和旋转矩阵中得到这个想法:https://en.wikipedia.org/wiki/Transformation_matrix

【讨论】:

  • 非常感谢您的宝贵时间!很明显,数学表达式是正确的,但它们对我不起作用。正如 ChristopherOicles 提到的,这可能是因为我的原始值总是在变化,因为我正在实现它。但修复它根本不能修复它。我想我必须玩坐标才能弄清楚。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-22
  • 1970-01-01
  • 1970-01-01
  • 2013-03-07
  • 1970-01-01
  • 2016-11-30
  • 1970-01-01
相关资源
最近更新 更多