2015-11-15 23 views
0

所以,我在java swing中做了一個遊戲(個人選擇,不要把它變成X,最好是製作遊戲,謝謝),這是一個2D平臺遊戲。圍繞它轉動一個BufferedImage中心點

我想我的旋轉武器,使用此代碼

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

在你的代碼中,你明確地「壓縮」了圖像,指定一個固定的寬度和高度爲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)(你可以-width爲通過擴展你在drawImage中做過)到你的仿射變換(tx)。

您可能需要重新計算相對於旋轉圖像的新邊界的x/y位置,但這應該是微不足道的。 :-)

+0

感謝您的幫助!那也工作,但我需要縮放圖像。幸運的是,我更多地在互聯網上漫遊,並找到了一個很好的解決方案。 – SubarakiThePepsi

+0

'AffineTransformOp'在縮放方面也很不錯,所以你可以添加縮放並一次性完成所有操作。:-)在關於需要縮小的問題中沒有任何信息,並且你確實進行的縮放是原因代碼不起作用。 – haraldK

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