0

このプログラムでは、列車をアニメートし、列車がx座標に到達したら、各車両(長方形)を1つずつ回転させます。電車は5台の車で構成され、長方形は車を表します。電車がどこかに到着したら、線路の変更(下の線路から上の線路へ)をアニメートしたいと思います。なので、線路変更場所に到着したら、各車を回転させたいと思います。これを行うために次のコードを使用しましたが、すべての車を一度に回転させ、最初の車を45度(正しい)、2番目の車を90度、3番目の車を135度回転させます...など。

コード:

private void drawLineBTrain(Graphics g){

    Graphics2D gg = (Graphics2D) g;

    for(int i = 0; i < b.getSize(); i++){            
        if(rotate){
            gg.rotate(-Math.PI/4, b.getCar(i).getPosX(), b.getCar(i).getPosY());
        }
        gg.fillRect(b.getCar(i).getPosX(), b.getCar(i).getPosY(), 80, 24);
    }
}

public void moveLineBTrain(Train t, boolean goRight){

    if(goRight) {
        b = t;
        int x, y;
        for(int i = 0; i < b.getSize(); i++) {
            x = b.getCar(i).getPosX();
            b.getCar(i).setPosX(++x);
            if(x > ((getWidth() / 2) - 140) && x < ((getWidth() / 2) + 140)){
                y = 490 + (int)( (double) (-100 * x) / 280 );
                b.getCar(i).setPosY(y);
                rotate = true;
            }
        }
    } else {
        b = t;
        int x, y;
        for(int i = 0; i < b.getSize(); i++) {
            x = b.getCar(i).getPosX();
            b.getCar(i).setPosX(--x);
            if(x > ((getWidth() / 2) - 140) && x < ((getWidth() / 2) + 140)){
                y = 490 + (int)( (double) ( -100 * (1344 - x) / 280 ));
                b.getCar(i).setPosY(y);
            }
        }
    }
}
4

1 に答える 1

2

あなたの問題は、「キャンバス」の回転と「オブジェクト」の回転を間違えていることだと思います。あなたがしていることは:

  1. 「キャンバス」を45度回転させてから、最初の長方形を描画します。結果:45度回転した長方形。
  2. 「キャンバス」を45度回転させて(再び!)、その上に2番目の長方形を描画します。結果:45度回転した長方形と90度回転した2番目の長方形。

私の推測では(現在コードをテストすることはできません)、回転をforループの外に移動し、最後に変換行列への変更を元に戻して、drawメソッドへの後続の呼び出しが変換されないようにする必要があります(回転)。これを試して、うまくいくかどうか教えてください。うまくいかない場合は、もっと賢いことを考えます。

private void drawLineBTrain(Graphics g){

    Graphics2D gg = (Graphics2D) g;
    AffineTransform aT = gg.getTransform(); // We store the initial transformation matrix

    for(int i = 0; i < b.getSize(); i++){            

    if(rotate){
            gg.rotate(-Math.PI/4, b.getCar(i).getPosX(), b.getCar(i).getPosY());
    }

        gg.fillRect(b.getCar(i).getPosX(), b.getCar(i).getPosY(), 80, 24);
        gg.setTransform(aT); // We restore the transformation matrix
    }
}

これは、Sunから直接提供されたGraphics2D変換に関する優れたテキストです。彼らはそれをこのように言いました:

回転やスケーリングなどの追加の変換を実行するために、Graphics2Dコンテキストに他の変換を追加できます。これらの追加の変換は、レンダリング中に適用される変換のパイプラインの一部になります

つまり、rotate()メソッドを呼び出すと、Graphics2Dコンテキスト(「キャンバス」)が回転され、元に戻す(または初期変換行列を復元する)までその状態が維持されます。

于 2012-11-12T18:20:12.617 に答える