俄罗斯方块:转动件?

时间:2013-11-30 23:49:08

标签: java swing

所以我正在制作一个俄罗斯方块游戏,我遇到的一个问题就是轮换。我知道我可以硬编码,但这不是正确的方法。系统的工作方式是我有一个对象'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;
}

现在我需要旋转这个对象,我不知道如何在没有硬编码位置的情况下做到这一点。必须有一个算法。有人可以提供一些帮助吗?

1 个答案:

答案 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)旋转,因此您必须将块的坐标放在特殊的“块空间”中,然后将其转换到“场空间”,或者取消块的偏移量这样它每次迭代都以原点为中心。

我希望有所帮助,我很乐意在评论中回答具体问题。