我正在用Java制作游戏,但旋转图像时遇到问题。
当我使用graphics2D旋转图像时,图像的X和Y在屏幕上发生变化。当我得到图像的X和Y时,该值与旋转前的值相同。然而,在屏幕上,它显示在另一个位置。
任何知道可以将图像恢复到原始位置的方法或公式的人?
答案 0 :(得分:0)
您需要将旋转点设置到图像的中间(或者您正在旋转的任何对象)。
例如,如果要旋转的图像是20x20px,则旋转点应为(X_POS + 10,Y_POS + 10);
X_POS和Y_POS是屏幕上图像左上角的坐标。
答案 1 :(得分:0)
通常在绘制图像时指定一个顶部/左侧坐标来绘制图像。但是,当您旋转非矩形图像时,图像的大小会发生变化,因此x / y位置会发生变化。
因此,您需要考虑围绕其中心点旋转图像。因此,对于每次旋转,您需要重新计算相对于中心的x / y位置。
在下面的示例中,图像将围绕点(300,300)旋转:
import java.awt.*;
import java.awt.geom.AffineTransform;
import java.awt.image.BufferedImage;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.*;
import javax.swing.event.*;
public class Rotation3 extends JPanel
{
private Icon icon;
private RotatedIcon rotated;
private int degrees;
public Rotation3(Image image)
{
icon = new ImageIcon( image );
rotated = new RotatedIcon(icon, 0);
// rotated.setCircularIcon( true );
setDegrees( 0 );
setPreferredSize( new Dimension(600, 600) );
}
@Override
protected void paintComponent(Graphics g)
{
super.paintComponent(g);
// translate x/y so Icon rotated around a specific point (300, 300)
int x = 300 - (rotated.getIconWidth() / 2);
int y = 300 - (rotated.getIconHeight() / 2);
rotated.paintIcon(this, g, x, y);
g.setColor(Color.RED);
g.fillOval(295, 295, 10, 10);
}
public void setDegrees(int degrees)
{
this.degrees = degrees;
rotated.setDegrees(degrees);
repaint();
}
public static void main(String[] args)
{
EventQueue.invokeLater(new Runnable()
{
public void run()
{
try
{
// String path = "dukewavered.gif";
String path = "lunch75.jpg";
ClassLoader cl = Rotation3.class.getClassLoader();
BufferedImage bi = ImageIO.read(Rotation3.class.getResourceAsStream(path));
final Rotation3 r = new Rotation3(bi);
final JSlider slider = new JSlider(JSlider.HORIZONTAL, 0, 360, 0);
slider.addChangeListener(new ChangeListener()
{
public void stateChanged(ChangeEvent e)
{
int value = slider.getValue();
r.setDegrees( value );
}
});
JFrame f = new JFrame();
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.add(new JScrollPane(r));
f.add(slider, BorderLayout.SOUTH);
f.pack();
f.setLocationRelativeTo(null);
f.setVisible(true);
}
catch(IOException e)
{
System.out.println(e);
}
}
});
}
}
注意:
此示例使用Rotated Icon类,因为此类管理图像旋转时更改的尺寸。
此外,如果您使用“圆形”图标,则可以使用setCircularIcon(true)
并且不会重新计算尺寸,因此您可以将x / y值指定为顶部/左侧。