0

我正在使用 Java 自己编写俄罗斯方块游戏。我没有使用任何已经包含代码的教程,因为我想尝试自己分解它,看看我能走多远。

到目前为止,不太好。我偶然发现了 Shapes 上的创作。我的想法是: 1. 将每个基本形状(如 L、立方体、船)作为单独的类扩展或实现 Area 或 Shape,以便我可以将其用作g2.fill(LShape). 2. 每个类都有某种描述旋转位置的状态变量,但这是下一个挑战,找出旋转..

所以对于第 1 步,到目前为止,我已经编写了以下 LShape 类的草稿:

草案 a):

public class LShape implements Shape{
private Rectangle[][] poc;
private int rotationState;  

public LShape() {
    rotationState = 0;
    poc = new Rectangle[3][3];
    poc[0][0] = new Brick(INITIAL_X - BRICK, INITIAL_Y, BRICK); 
    poc[1][0] = new Brick(INITIAL_X - BRICK, INITIAL_Y + BRICK, BRICK);
    poc[2][0] = new Brick(INITIAL_X - BRICK, INITIAL_Y + 2 * BRICK, BRICK);
    poc[2][1] = new Brick(INITIAL_X, INITIAL_Y + 2 * BRICK, BRICK);
}      
}
//.....all the Shape's methods which I'm not overriding cause I don't know how

在我调用paint()方法的主类中: g2.fill(lShape); // where lShape is a LShape object; 问题是抛出了一个关于getPathIterator()

或草案 b):

public class LShape extends Area{

public LShape () {

    add(new Area(new Brick(INITIAL_X - BRICK, INITIAL_Y, BRICK)));
    exclusiveOr(new Area(new Brick(INITIAL_X - BRICK, INITIAL_Y + BRICK, BRICK)));
    exclusiveOr(new Area(new Brick(INITIAL_X - BRICK, INITIAL_Y + 2 * BRICK, BRICK)));
    exclusiveOr(new Area(new Brick(INITIAL_X, INITIAL_Y + 2 * BRICK, BRICK)));
}
}

在这种情况下,当我调用时,g2.fill(lShape)没有异常并且 Shape 被绘制,只是我不知道如何移动它。区域的一部分是矩形的 Brick 对象,所以我可以尝试访问setLocation区域中每个 Brick 的方法,但我不知道如何访问它。

所以我想我需要帮助来弄清楚如何使俄罗斯方块形状的形状实现不抛出异常,这意味着实现所有必需的方法并实际显示在 JPanel 上......然后我会担心旋转。或者弄清楚如何使俄罗斯方块形状的区域扩展移动。

谢谢,

4

1 回答 1

1

渲染形状时,您可以在实例上使用Graphics#translateor或使用,但这需要更多的工作,因为您需要包装回形状AffineTransformGraphics2DShape#getPathIterator(AffineTransform)

例如...

// Call me lazy, this preserves the state of the current Graphics
// context and makes it easy to "restore" it, simply by disposing
// of this copy...
Graphics2D g2d = (Graphics2D)g.create();
g2d.translate(x, y);
g2d.fill(shape);
// Restores the state of the `Graphics` object...
g2d.dispose();

如果您想继续使用Area,请查看Area#createTransformedArea哪个应该允许您使用 anAffineTransform来转换Area,但它会返回 an Area,使其更易于使用Shape#getPathIterator

这也意味着您可以生成复合转换(旋转、平移等)并生成一个Area表示转换的...

于 2014-02-06T05:05:56.387 回答