Java 旋转图片会导致循环g2d中的其他图片旋转。旋转

Java 旋转图片会导致循环g2d中的其他图片旋转。旋转,java,swing,rotation,graphics2d,java-2d,Java,Swing,Rotation,Graphics2d,Java 2d,我想做一个像坦克麻烦这样的游戏 问题是,当我试图旋转并绘制坦克图片时,所有其他坦克图片都会旋转 这是我的密码: // draw tanks ArrayList<Tank> tanks = new ArrayList<>(); tanks.addAll(TankTroubleMap.getAITanks()); tanks.addAll(TankTroubleMap.getUserTanks()); for (Tank tankToDraw : tanks) { g

我想做一个像坦克麻烦这样的游戏

问题是,当我试图旋转并绘制坦克图片时,所有其他坦克图片都会旋转

这是我的密码:

// draw tanks
ArrayList<Tank> tanks = new ArrayList<>();
tanks.addAll(TankTroubleMap.getAITanks());
tanks.addAll(TankTroubleMap.getUserTanks());
for (Tank tankToDraw : tanks) {
    g2d.rotate(-Math.toRadians(tankToDraw.getAngle())
            , tankToDraw.getCenterPointOfTank().getXCoordinate()
            , tankToDraw.getCenterPointOfTank().getYCoordinate());
    g2d.drawImage(tankToDraw.getTankImage()
            , (int) tankToDraw.getCenterPointOfTank().getXCoordinate() - Constants.TANK_SIZE / 2
            , (int) tankToDraw.getCenterPointOfTank().getYCoordinate() - Constants.TANK_SIZE / 2
            , Constants.TANK_SIZE, Constants.TANK_SIZE, null);
}
//绘制储罐
ArrayList坦克=新的ArrayList();
tanks.addAll(TankTroubleMap.getAITanks());
tanks.addAll(TankTroubleMap.getUserTanks());
用于(储罐TODRAW:储罐){
g2d.rotate(-Math.toRadians(tankToDraw.getAngle())
,tankToDraw.getCenterPointOfTank().getXCoordinate()
,tankToDraw.getCenterPointOfTank().getYCoordinate());
g2d.drawImage(tankToDraw.getTankImage()
,(int)tankToDraw.getCenterPointOfTank().getXCoordinate()-Constants.TANK_SIZE/2
,(int)tankToDraw.getCenterPointOfTank().getYCoordinate()-Constants.TANK_SIZE/2
,常数.TANK_SIZE,常数.TANK_SIZE,null);
}

绘制完要旋转的图像后,只需反向旋转图形即可。否则,相同的旋转将应用于通过应用旋转的点绘制的所有对象

因此,在你的情况下:

for(储罐ToDraw:储罐){
g2d.rotate(-Math.toRadians(tankToDraw.getAngle())
,tankToDraw.getCenterPointOfTank().getXCoordinate()
,tankToDraw.getCenterPointOfTank().getYCoordinate());
g2d.drawImage(tankToDraw.getTankImage()
,(int)tankToDraw.getCenterPointOfTank().getXCoordinate()-Constants.TANK_SIZE/2
,(int)tankToDraw.getCenterPointOfTank().getYCoordinate()-Constants.TANK_SIZE/2
,常数.TANK_SIZE,常数.TANK_SIZE,null);
g2d.rotate(Math.toRadians(tankToDraw.getAngle())
,tankToDraw.getCenterPointOfTank().getXCoordinate()
,tankToDraw.getCenterPointOfTank().getYCoordinate());
}

应用于图形的任何变换(在本例中为旋转)都将保留下来,以便将来在该图形实例上执行所有操作,包括进一步的变换。在使用图形时,您必须记住这一点。

绘制要旋转的图像后,只需反向旋转图形即可。否则,相同的旋转将应用于通过应用旋转的点绘制的所有对象

因此,在你的情况下:

for(储罐ToDraw:储罐){
g2d.rotate(-Math.toRadians(tankToDraw.getAngle())
,tankToDraw.getCenterPointOfTank().getXCoordinate()
,tankToDraw.getCenterPointOfTank().getYCoordinate());
g2d.drawImage(tankToDraw.getTankImage()
,(int)tankToDraw.getCenterPointOfTank().getXCoordinate()-Constants.TANK_SIZE/2
,(int)tankToDraw.getCenterPointOfTank().getYCoordinate()-Constants.TANK_SIZE/2
,常数.TANK_SIZE,常数.TANK_SIZE,null);
g2d.rotate(Math.toRadians(tankToDraw.getAngle())
,tankToDraw.getCenterPointOfTank().getXCoordinate()
,tankToDraw.getCenterPointOfTank().getYCoordinate());
}

应用于图形的任何变换(在本例中为旋转)都将保留下来,以便将来在该图形实例上执行所有操作,包括进一步的变换。您必须记住,在使用图形.< /p>而不是昂贵的逆时针旋转时,可能会引入舍入误差,也可以考虑,通过<代码> >(或)代码>创建子图形,该图形不影响原始图形,或者在旋转和<代码> SET转换之前使用<代码> GETTrimes()/<代码>。​(…)以在以后恢复旧值。如果转换是唯一更改的属性,我将使用后者。请注意,您可以在这里循环之前执行一次
getTransform()
。这是一个很好的建议!尽管应用自定义变换时应小心,因为它将覆盖以前对图形所做的所有变换,这可能会导致一些意外效果。创建图形实例的副本当然是更安全的方法​(…)应小心使用。将恢复旧转换的特定用例命名为预期用例。它不应该用于其他目的,而不是昂贵的逆时针旋转,可能引入舍入误差,也可以考虑,通过<代码> >()/代码>创建子图形,该图形不影响原始图形或在旋转和<代码> SET变换之前使用<代码> GETTrime[(或代码)>。​(…)以在以后恢复旧值。如果转换是唯一更改的属性,我将使用后者。请注意,您可以在这里循环之前执行一次
getTransform()
。这是一个很好的建议!尽管应用自定义变换时应小心,因为它将覆盖以前对图形所做的所有变换,这可能会导致一些意外效果。创建图形实例的副本当然是更安全的方法​(…)应小心使用。将恢复旧转换的特定用例命名为预期用例。不应将其用于其他目的。