所以我正在制作一个俄罗斯方块游戏,我遇到的一个问题就是轮换。我知道我可以硬编码,但这不是正确的方法。系统的工作方式是我有一个对象'Tile'的二维数组'Tile'对象有x,y coords,boolean isActive和color。布尔isActive基本上告诉计算机实际使用哪些瓷砖(因为俄罗斯方块形状不是完美的四边形)。
以下是我在系统中制作形状的方法:
public static Tile[][] shapeJ() {
Tile[][] tile = new Tile[3][2];
for (int x = 0; x < 3; x++) {
for (int y = 0; y < 2; y++) {
tile[x][y] = new Tile(false, Color.blue);
}
}
tile[0][0].setActive(true);
tile[0][0].setX(0);
tile[0][0].setY(0);
tile[1][0].setActive(true);
tile[1][0].setX(50);
tile[1][0].setY(0);
tile[2][0].setActive(true);
tile[2][0].setX(100);
tile[2][0].setY(0);
tile[2][1].setActive(true);
tile[2][1].setX(100);
tile[2][1].setY(50);
return tile;
}
现在我需要旋转这个对象,我不知道如何在没有硬编码位置的情况下做到这一点。必须有一个算法。有人可以提供一些帮助吗?
答案 0 :(得分:3)
我在写一个俄罗斯方块克隆时使用的一个好方法是使用旋转矩阵:
http://en.wikipedia.org/wiki/Rotation_matrix
因此旋转后的点(x,y)的坐标(x',y')为:
x'= x * cos(theta) - y * sin(theta);
y'= x * sin(theta)+ y * cos(theta);
其中theta是旋转角度(对于我所知道的java函数,+ -90度或+ -PI / 2弧度) 在这种情况下,块围绕原点(0,0)旋转,因此您必须将块的坐标放在特殊的“块空间”中,然后将其转换到“场空间”,或者取消块的偏移量这样它每次迭代都以原点为中心。
我希望有所帮助,我很乐意在评论中回答具体问题。