我正在制作一个游戏,其中一些物体会旋转以面对它们射击的目标。在射击之间有一个延迟,我希望物体保持面向其所在位置,直到再次射击。我知道如何加载图像,并且知道如何使用AffineTransform旋转它们。但是,这样做需要每次绘制对象时重新计算旋转。
因此,我的问题是如何旋转图像并将结果保存到新图像中以进行显示?
因此,我的问题是如何旋转图像并将结果保存到新图像中以进行显示?
private BufferedImage rotate(BufferedImage image, double _theta, int _thetaInDegrees) {
AffineTransform xform = new AffineTransform();
if (image.getWidth() > image.getHeight()) {
xform.setToTranslation(0.5 * image.getWidth(), 0.5 * image.getWidth());
xform.rotate(_theta);
int diff = image.getWidth() - image.getHeight();
switch (_thetaInDegrees) {
case 90:
xform.translate(-0.5 * image.getWidth(), -0.5 * image.getWidth() + diff);
break;
case 180:
xform.translate(-0.5 * image.getWidth(), -0.5 * image.getWidth() + diff);
break;
default:
xform.translate(-0.5 * image.getWidth(), -0.5 * image.getWidth());
break;
}
} else if (image.getHeight() > image.getWidth()) {
xform.setToTranslation(0.5 * image.getHeight(), 0.5 * image.getHeight());
xform.rotate(_theta);
int diff = image.getHeight() - image.getWidth();
switch (_thetaInDegrees) {
case 180:
xform.translate(-0.5 * image.getHeight() + diff, -0.5 * image.getHeight());
break;
case 270:
xform.translate(-0.5 * image.getHeight() + diff, -0.5 * image.getHeight());
break;
default:
xform.translate(-0.5 * image.getHeight(), -0.5 * image.getHeight());
break;
}
} else {
xform.setToTranslation(0.5 * image.getWidth(), 0.5 * image.getHeight());
xform.rotate(_theta);
xform.translate(-0.5 * image.getHeight(), -0.5 * image.getWidth());
}
AffineTransformOp op = new AffineTransformOp(xform, AffineTransformOp.TYPE_BILINEAR);
return op.filter(image, null);
}
BufferedImage.getGraphics()
获取一个 Graphics 对象。将旋转后的图像绘制到这个缓冲图像上,并将图像根据其旋转角度保存在数组或映射中(这样在需要时就可以轻松查找它)。BufferedImage source = new BufferedImage(50, 10, BufferedImage.TYPE_4BYTE_ABGR);
BufferedImage target = new BufferedImage(50, 10, BufferedImage.TYPE_4BYTE_ABGR);
Graphics2D tg = target.createGraphics();
AffineTransform at = new AffineTransform();
at.rotate(2);
tg.drawImage(source, at, null);
NUM_ROTATIONS
,并创建一个BufferedImage[NUM_ROTATIONS]
数组来存储精灵,并通过i * 360.0 / NUM_ROTATIONS
旋转每个精灵。这样你就可以轻松地尝试不同的旋转效果了。 - aioobe