所以,我正在用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图片,网站不支持,因此提供直接链接)
图像转过身,好像它被绑定到图像本身的大小!对角线是水平和垂直压缩的,它具有弹性效果。不是我想要的......
我希望它围绕它的中心点旋转,所以没有任何东西被压缩!
答案 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);