4

新しいピース (4 つのタイルで構成される) ごとに新しいランダムな色を設定しようとしています。ボードに完全な部分を描画するために、Board クラスにペイント コンポーネントがあります。

public void paintComponent(Graphics g) {
    g.setColor(Color.black);
    g.fillRect(0, 0, getWidth(), getHeight());
    for(int row = 0; row < grid.length; row++) {
        for(int col = 0; col < grid[row].length; col++) {
            if(grid[row][col] != null) {
                //if there is a non-null space, that is a Tetris piece.. fill it red
                    g.setColor(color);
                    g.fillRect(row * tilesize, col * tilesize, tilesize, tilesize);
                    g.setColor(Color.WHITE);
                    g.drawString("(" + row + ", " + col + ")", row * tilesize, col * tilesize+10);
                }           
            }
        }
    }

g.setColor()グローバル変数が与えられていることがわかりますcolor

Board コンストラクターでの定義:

color = setColor();

setColor():

public Color setColor() {

    Random rand = new Random();

    float r = rand.nextFloat();
    float g = rand.nextFloat();
    float b = rand.nextFloat();
    Color randomColor = new Color(r, g, b);

    return randomColor;
}

衝突が発生すると、新しいピースが生成され、colorグローバル変数が新しいランダムな色で上書きされます...

public void collisionCheck() {
    if (newPiece.isCollision()){
        newPiece = new Piece(this, randomPiece());
        color = setColor();
    }       
}

これにより、次の結果が得られます。

すべての形状が同じ色に設定されています...私が望むものではありません ここに画像の説明を入力

次に、新しいピースが生成されると、それらすべての色が変わります...再び、私が望むものではありません. ここに画像の説明を入力

問題が何であるかはわかっています...グローバルカラー変数を上書きすべきではないということです...しかし、ボードクラスから色を割り当てずに...代わりにタイルクラスから色を取得すると、そのような:

g.setColor(grid[row][col].getColor());

public void paintComponent(Graphics g) {
        g.setColor(Color.black);
        g.fillRect(0, 0, getWidth(), getHeight());
        for(int row = 0; row < grid.length; row++) {
            for(int col = 0; col < grid[row].length; col++) {
                if(grid[row][col] != null) {
                    //if there is a non-null space, that is a Tetris piece.. fill it red
                        g.setColor(grid[row][col].getColor());
                        g.fillRect(row * tilesize, col * tilesize, tilesize, tilesize);
                        g.setColor(Color.WHITE);
                        g.drawString("(" + row + ", " + col + ")", row * tilesize, col * tilesize+10);
                    }           
                }
            }
        }

次に、タイルが再描画されるたびに、個々のタイルに新しい色が生成されます...

ここに画像の説明を入力

私の目標は、1 つのピース (4 つのタイルで構成される) にランダムな色を与えることです...その後、新しいピースが生成されると、その最初のピースはその色を保持します...そして新しいピースはその色を保持します...

何かご意見は?

ありがとう!

4

1 に答える 1

4

私はそれを行う方法を見つけました... Board クラスでは、randomColor()newPiece を作成するときにパラメーターとして渡します。

public Color randomColor() {

    Random rand = new Random();

    float r = rand.nextFloat();
    float g = rand.nextFloat();
    float b = rand.nextFloat();
    Color randomColor = new Color(r, g, b);

    return randomColor;
}

newPiece = new Piece(this, randomPiece(), randomColor());. 

Piece クラスでは、タイルをループして、tile[i].setColor(color);各タイルの色を設定します。

for (int i = 0; i < tile.length; i++) {
    tile[i].setColor(color);
}

私が追加したタイルColor getColor()ではsetColor(color);

public Color getColor() {
    return setColor(color);
}

public Color setColor(Color myColor) {  
    color = myColor;
    return color;
}

次に、Board クラスのペイント コンポーネントで使用します。g.setColor(grid[row][col].getColor());

ただし、これは間違いなく最もエレガントなソリューションではありません。jimmt が説明したように、それをより良く行う方法を学び、「ゲーム ループ」でテトリスを行うのは素晴らしいことです。

ここに画像の説明を入力

于 2013-04-30T16:39:07.603 に答える