在这个程序中,我想要为火车设置动画,当火车到达某个x坐标时,我想逐个列车每个火车车厢(矩形)。火车包括五辆汽车,一个矩形代表一辆汽车。当火车到达某个位置时,我想为轨道变化设置动画(下行轨道到上轨道)。因此,当它到达轨道更换位置时,我想要旋转每辆车。我使用以下代码执行此操作,但它会立即旋转所有汽车,第一辆汽车45度(正确)和第二辆汽车90和第三辆汽车135 ......等。
CODE:
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);
}
}
}
}
答案 0 :(得分:2)
我猜你的问题是你错了旋转“画布”,旋转“对象”。你在做什么:
我的猜测是(我现在无法测试代码)您必须将旋转移出for循环并撤消对末尾变换矩阵的更改,以便后续调用{{1方法未被转换(旋转)。试试这个并告诉我们它是否有效,如果没有,我会想到更聪明的东西:
draw
这是good text about Graphics2D Transformations,直接来自Sun.他们这样说:
执行其他转换,例如旋转或缩放, 您可以将其他变换添加到Graphics2D上下文。这些 其他变换成为变换管道的一部分 在渲染过程中应用
这意味着如果你调用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
}
}
方法,Graphics2D上下文(“画布”)将被旋转并保持这种,直到你将其旋转回来(或恢复初始转换矩阵。)