【问题标题】:How to rotate a bufferedimage, then copy the bufferedImage into a pixel array如何旋转缓冲图像,然后将缓冲图像复制到像素数组中
【发布时间】:2013-02-25 04:02:51
【问题描述】:

我正在尝试旋转导弹炮塔的缓冲图像,使其看起来像是在跟踪目标。基本上,我可以使用 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);

这可行,但我想做的是变换(旋转)缓冲图像,然后将新旋转的像素数据复制到像素数组中,然后将其绘制到屏幕上,因为我相信这是大多数游戏绘制旋转图像的方式反对将 png 直接绘制到屏幕上。

但是我知道什么。 2D 游戏究竟是如何绘制旋转图像的?我做得对吗,还是有更好/更节省内存的方法?

【问题讨论】:

  • 如需尽快获得更好的帮助,请发帖SSCCE
  • 完成。该类称为 trigTester。 pastebin.com/Di1WbMjr 。你可以忽略所有的数学。那只是为了计算旋转弧度。您需要查看的唯一代码是 render()、tick() 和 constructor()。我不确定我是否把我的问题说清楚了。基本上我想知道是否可以直接对包含tower.png像素信息的像素数组进行旋转,然后将该像素数据复制到主屏幕像素数组上进行绘制,而不是直接将其绘制到屏幕上作为 png。
  • “你可以忽略所有的数学运算。” 我一般会忽略链接。如果代码是 SSCCE,请将其添加为 edit to the question
  • @GayLord:如果您希望陌生人努力理解您的问题并帮助您,这将非常有帮助,如果您努力使帮助您变得更容易,我们将不胜感激。我同意 Andrew 的建议,即您在此处创建 sscce 作为对您问题的编辑。

标签: java image awt java-2d affinetransform


【解决方案1】:

有很多方法可以解决 2D 游戏中的图像处理问题。不过,在优化之前,您应该先问问自己是否真的需要它。此外,内存优化通常以 CPU 性能为代价,反之亦然。

如果 CPU 时间是问题,一种常见的方法是保留已旋转到特定角度(预先计算)的图像数组。

如果内存是问题,请保留单个图像并在每次显示时计算旋转后的形式。一种更节省内存但更消耗 CPU 的方法是绘制矢量形状而不是图像。与转换时用于图像的平滑算法的插值相比,这也导致更好看的结果。 Java 支持 SVG,并且有几个不错的包可用(例如 http://xmlgraphics.apache.org/batik/)。

最后,Java 可以连接到图形库以执行渲染,从而提高性能。此类库(OpenGL 等)使用显卡的内存来存储图像以提高 CPU 使用率 (http://jogamp.org/jogl/www/)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-07-06
    • 1970-01-01
    • 2013-04-14
    • 2016-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多