我正在尝试旋转导弹炮塔的bufferedImage,以使其看起来像是在跟踪目标。基本上,我可以使用AffineTransform / affinetransform轻松实现
简而言之,我当前的代码是:
public BufferedImage tower = null;
try
{
tower = ImageIO.read(SpriteSheet.class.getResource("/spriteSheet/testTower.png"));
}
catch(IOException e)
{
AffineTransform tx = AffineTransform.getRotateInstance(rotationRequired, locationX, locationY);
AffineTransformOp = op = new AffineTransformOp(tx, AffineTransformOp.TYPE_BILINEAR);
//then I draw it using
g.drawImage(op.filter(tower, null), towerLocationX, towerLocationY, null);
这可行,但是我想做的是变换(旋转)bufferedImage,然后将新旋转的像素数据复制到像素数组中,然后将其绘制到屏幕上,因为我相信这是大多数游戏绘制旋转图像而不是绘制图像的方式png直接显示在屏幕上。
但是我知道什么。 2D游戏如何精确绘制旋转图像?我做对了吗,还是有一种更好/更省内存的方式来做到这一点?
最佳答案
有很多方法可以解决2D游戏中的图像操纵问题。不过,在进行优化之前,您应该先问问自己是否真的需要它。此外,内存优化通常以牺牲CPU性能为代价,反之亦然。
如果出现CPU时间问题,一种常用的方法是保持已旋转到特定角度(预先计算)的图像阵列。
如果存在内存问题,请保留一张图像,并在每次显示时计算旋转后的表格。内存效率更高但占用CPU更大的方法是绘制矢量形状而不是图像。与变换后用于图像的平滑算法的插值相比,这还导致更好的外观效果。 Java支持SVG,并且有几个不错的软件包(例如http://xmlgraphics.apache.org/batik/)。
最后,可以将Java连接到图形库以执行渲染,从而提高性能。这样的库(OpenGL等)使用图形卡的内存来存储图像,以提高CPU使用率(http://jogamp.org/jogl/www/)。