图像旋转动画
也许一个简单的答案的问题。我正在尝试制作一艘船(小行星风格)。现在我只使用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;
}
尝试使用仿射变换:
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
不幸的是,这与使用'Graphics2d.rotate()'相同,只是它会产生额外的垃圾。 'Graphics2D'有一个内置的'AffineTransform'。如果在同一个渲染器中需要多个,则只需分配自己的内容。 – Gene 2012-06-21 17:28:51
你可以尝试用Graphics.setRenderingHint(播放),并设置一个更高的质量,但除此之外,没有什么可以做,使工作“正确”。
如果Graphics2D提供的质量不能满足您的要求,请使用图形程序创建“飞船”的旋转图像,然后根据船的正面选择正确的预旋转图像。这样质量就不再取决于图形API,而只取决于你的图形程序(以及你为旋转图像做了多少努力)。你必须决定角度的粒度(预先渲染图像的数量),理智的数字通常在16到64之间。
我同意Graphics2D.setRenderingHint()
上的建议。尝试KEY_INTERPOLATION
与VALUE_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
错误。
您正在绘制到存储您的造船图像的BufferedImage的图形上下文。
如果您绘制显示游戏的UI组件的图形上下文或某个其他缓冲区的上下文,那么您应该使用rotate方法。
可以使用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);
}
偶然地这样的JavaFX教程小行星游戏可以为您提供基于Java版本的洞察力。 [** LINK **](http://carlfx.wordpress.com/2012/03/29/javafx-2-gametutorial-part-1/)。 – arttronics 2012-06-19 11:49:11