0

私は Java を使用して Tetris ゲームを自分で作成することに取り組んでいます。コードを自分で分解して、どこまでできるかを確認したいので、既にコードが含まれているチュートリアルは使用していません。

これまでのところ、あまり良くありません。私はシェイプの創造に出くわしました。私の考えは次のいずれかです: 1. の引数として使用できるように、Area または Shape を拡張または実装する個別のクラスとして、各基本形状 (L、立方体、ボートなど) を用意し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 が描画されますが、それを移動する方法がわかりません。Area の一部は Rectangles である Brick オブジェクトであるためsetLocation、Area 内の各 Brick のメソッドにアクセスしようとすることができましたが、アクセス方法がわかりません。

したがって、Tetris Shape の Shape 実装が例外をスローしないようにする方法、つまり、必要なすべてのメソッドを実装し、実際に JPanel に表示する方法を理解するために助けが必要だと思います..そして、回転について心配します. または、Tetris Shape の Area 拡張を移動する方法を見つけます。

ありがとう、

4

1 に答える 1

1

シェイプをレンダリングするときは、インスタンスで または を使用Graphics#translateできますが、シェイプにラップする必要があるため、より多くの作業が必要になります。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できるようにする必要がありますが、 を返すと が大幅に使いやすくなります。AffineTransformAreaAreaShape#getPathIterator

また、複合変換 (回転、平行移動など) を生成しArea、変換を表す を生成できることも意味します...

于 2014-02-06T05:05:56.387 に答える