2012-03-15 194 views
3

也許一個簡單的答案的問題。我正在嘗試製作一艘船(小行星風格)。現在我只使用Graphics2D旋轉方法。但是,現在只是模糊了我的形象。怎樣才能解決這個問題並使其正常工作? (。中的getImage方法被調用每次屏幕刷新時間,旋轉方法被調用每一個離開的用戶按下或時間正確BI i是在先前閱讀的BufferedImage)圖像旋轉動畫

public void rotate(double rot) { 
    g = bi1.getGraphics(); 
    Graphics2D g2d=(Graphics2D)g; 
    g2d.rotate(rot, 15, 15); 
    g2d.drawImage(bi1, 0, 0, null);  
} 

public BufferedImage getImage() { 
    return bi1; 
} 
+0

偶然地這樣的JavaFX教程小行星遊戲可以爲您提供基於Java版本的洞察力。 [** LINK **](http://carlfx.wordpress.com/2012/03/29/javafx-2-gametutorial-part-1/)。 – arttronics 2012-06-19 11:49:11

回答

2

嘗試使用仿射變換:

  public void paint(Graphics g) { 
     // clear off screen bitmap 
      super.paint(g); 
      // cast graphics to graphics 2D 
      Graphics2D g2 = (Graphics2D) g; 
      AffineTransform tfm = new AffineTransform(); 
      tfm.rotate(0,0,0); 
      g2.setTransform(tfm); 
      g2.drawImage(backImage, 0, 0, this); 
      tfm.rotate(Math.toRadians(player.angle+90), player.x+32, player.y+32); 
      g2.setTransform(tfm); 
      g2.drawImage(tank, player.x, player.y, this);       
  } 

http://docs.oracle.com/javase/1.4.2/docs/api/java/awt/geom/AffineTransform.html

+0

不幸的是,這與使用'Graphics2d.rotate()'相同,只是它會產生額外的垃圾。 'Graphics2D'有一個內置的'AffineTransform'。如果在同一個渲染器中需要多個,則只需分配自己的內容。 – Gene 2012-06-21 17:28:51

2

你可以嘗試用Graphics.setRenderingHint(播放),並設置一個更高的質量,但除此之外,沒有什麼可以做,使工作「正確」。

如果Graphics2D提供的質量不能滿足您的要求,請使用圖形程序創建「飛船」的旋轉圖像,然後根據船的正面選擇正確的預旋轉圖像。這樣質量就不再取決於圖形API,而只取決於你的圖形程序(以及你爲旋轉圖像做了多少努力)。你必須決定角度的粒度(預先渲染圖像的數量),理智的數字通常在16到64之間。

1

我同意Graphics2D.setRenderingHint()上的建議。嘗試KEY_INTERPOLATIONVALUE_INTERPOLATION_BILINEAR

此外,請嘗試將源圖像放大到比實際想要繪製的大4倍,然後除了旋轉之外還使用Graphics2D.scale(1/multiple)

原因:沒有縮放,像素的對角線是邊緣的1.4倍以上,所以當旋轉接近奇數45度倍數時,圖像中的14+像素僅參照10在原始圖像中。這增加了結果的粗糙。

另一種方法是使用爲BufferedImage源和目標:

tx = new AffineTransform(); 
    tx.rotate(theta, xCenter, yCenter) 
    op = new AffineTransformOp(tx, AffineTransformOp.TYPE_BILINEAR); 
    BufferedImage destImg = op.filter(srcImg, null); 

最後,切換到OpenGL(例如,用JOGL或LWGL),提供了各種過抗混疊和控制得多的。另一方面,它爲硬件不兼容打開了一扇門,因爲許多圖形驅動程序都有IMD出現OpenGL錯誤。

0

您正在繪製到存儲您的造船圖像的BufferedImage的圖形上下文。

如果您繪製顯示遊戲的UI組件的圖形上下文或某個其他緩衝區的上下文,那麼您應該使用rotate方法。

0

可以使用getRotateInstance(double theta)

public void paint(Graphics g) { 
    ... 
    Graphics2D g2d = (Graphics2D)bi1.getGraphics(); 
    AffineTransform af = new AffineTransform(
     AffineTransform.getRotateInstance(theta, x, y)); 
    g2d.setTransform(af); 
    g2d.drawImage(bi1, af, this); 
} 

docs: AffineTransform (getRotateInstance)