2012-03-15 221 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)