围绕中心点旋转BufferedImage

时间:2015-11-15 20:41:21

标签: rotation bufferedimage

所以,我正在用Java摇摆一个游戏(个人选择,不要把它变成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);

问题是:http://i.imgur.com/FWXsc5Z.gifv

(gif图片,网站不支持,因此提供直接链接)

图像转过身,好像它被绑定到图像本身的大小!对角线是水平和垂直压缩的,它具有弹性效果。不是我想要的......

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

2 个答案:

答案 0 :(得分:0)

在您的代码中,您通过指定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);

如果朝右,只需通过添加翻转操作(您可以像weapon中那样按比例缩放)来翻转图像(drawImage)到您的仿射变换(tx )在轮换之前。

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

答案 1 :(得分:0)

创建一个空白画布图像以将图像绘制到应有的工作状态。 我希望这段代码可以帮助未来的人

        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);