我在Java中製作遊戲,但旋轉圖像時出現問題。Java圖形2D旋轉
當我使用graphics2D旋轉圖像時,圖像的X和Y在屏幕上發生變化。仍然當我得到圖像的X和Y時,該值與旋轉之前的值相同。然而,在屏幕上,它顯示在另一個位置上。
任何知道可以將圖像恢復到原始位置的方法或公式的人?
我在Java中製作遊戲,但旋轉圖像時出現問題。Java圖形2D旋轉
當我使用graphics2D旋轉圖像時,圖像的X和Y在屏幕上發生變化。仍然當我得到圖像的X和Y時,該值與旋轉之前的值相同。然而,在屏幕上,它顯示在另一個位置上。
任何知道可以將圖像恢復到原始位置的方法或公式的人?
您需要將旋轉點設置到圖像中間(或任何旋轉的對象)。例如,如果要旋轉的圖像是20x20像素,那麼旋轉角度應該在(X_POS + 10,Y_POS + 10);
X_POS和Y_POS是屏幕上圖像左上角的座標。
通常,當您繪製圖像時,您可以指定一個頂部/左側座標來繪製圖像。然而,當你旋轉一個非矩形的圖像時,圖像的大小將會改變,所以x/y位置會改變。
因此,您需要考慮旋轉圖像的中心點。因此,對於每次旋轉,您都需要重新計算相對於中心的x/y位置。
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類,因爲這類管理的不斷變化的尺寸
在圖像下面的例子將圍繞點(300,300)被旋轉圖像旋轉。
此外,如果您使用「圓形」圖標,則可以使用setCircularIcon(true)
,並且不會重新計算大小,因此您可以將x/y值指定爲頂部/左側。
您可能需要提供圖像可以旋轉的錨點 – MadProgrammer