【问题标题】:Rotate a BufferedImage around its center point围绕其中心点旋转 BufferedImage
【发布时间】:2015-11-15 20:41:20
【问题描述】:

所以,我正在用 java swing 做游戏(个人选择,不要把它变成 X 更好地做游戏,谢谢),一个 2d 平台游戏。

我正在尝试使用以下代码旋转我的武器:

BufferedImage weapon = invArmor.getWeapon().getItem().getTexture();

AffineTransform tx = new AffineTransform();

tx.setToRotation(Math.toRadians(weaponRotation), weapon.getWidth() / 2, weapon.getHeight() / 2);

AffineTransformOp op = new AffineTransformOp(tx, AffineTransformOp.TYPE_BILINEAR);
weapon = op.filter(weapon, null);

if (facingRight)
    g.drawImage(weapon, posX() + 10, posY() + 5, 24, 24, null);
else
    g.drawImage(weapon, posX() + 10, posY() + 5, -24, 24, null);

问题是这样的:

图像转身,就好像它被绑定到图像本身的大小一样!对角线被水平和垂直压缩,并产生弹性效果。不是我要找的...

我希望它围绕中心点旋转,所以没有被压缩!

【问题讨论】:

    标签: java rotation bufferedimage graphics2d


    【解决方案1】:

    创建一个空白画布图像以将图像绘制到其上。 我希望这段代码可以在未来帮助别人

    BufferedImage weapon = invArmor.getWeapon().getItem().getTexture();
    
    int size = 32 + 20;
    
    //create blank canvas that is bigger the the image drawn.
    BufferedImage canvas = new BufferedImage(size, size, BufferedImage.TYPE_INT_ARGB);
    //get grapchics from the canvas
    Graphics2D g2d = (Graphics2D) canvas.getGraphics();
    
    //rotate canvas internally
    g2d.rotate(Math.toRadians(weaponRotation), size / 2, size / 2);
    
    //draw image centered, extra/2
    g2d.drawImage(weapon, 10, 10, null);
    
    if (facingRight)
        g.drawImage(canvas, posX() + 5, posY() - 15, size, size, null);
    else
        g.drawImage(canvas, posX() + 19, posY() - 15, -size, size, null);
    

    【讨论】:

      【解决方案2】:

      在您的代码中,您通过将固定宽度和高度指定为drawImage(img, x, y, height, width, observer) 来明确“压缩”图像。

      旋转本身可以正常工作。但请注意,旋转图像时,边界会增加,否则图像会被剪裁。

      所以,而不是:

      if (facingRight)
          g.drawImage(weapon, posX() + 10, posY() + 5, 24, 24, null);
      else
          g.drawImage(weapon, posX() + 10, posY() + 5, -24, 24, null);
      

      简单地做:

      g.drawImage(weapon, posX() + 10, posY() + 5, null);
      

      如果朝右,只需在旋转前向仿射变换 (tx) 添加翻转操作(您可以像在 drawImage 中那样按 -width 缩放)来翻转图像 (weapon)。

      您可能需要重新计算相对于旋转图像的新边界的 x/y 位置,但这应该是微不足道的。 :-)

      【讨论】:

      • 感谢您的帮助!这也有效,但我需要缩小图像。幸运的是,我在互联网上漫游了一些,找到了一个很好的解决方案。
      • AffineTransformOp 也非常擅长缩放,因此您可以添加缩放并一次性完成所有操作.. :-) 问题中没有关于需要缩小的信息,并且您所做的缩放确实是原始代码不起作用的原因。
      猜你喜欢
      • 1970-01-01
      • 2014-09-30
      • 1970-01-01
      • 1970-01-01
      • 2013-09-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多