我正在尝试创建一个显示位图僵尸图片的简单程序,然后使用AffineTransform和Thread旋转它。我按照我必须完成的示例,但每当我运行程序时,僵尸位图只旋转一次并停止。此外,由于某些原因,当我绘制僵尸位图时,图像沿y轴部分偏离屏幕。
所以我的问题是:为什么位图不能旋转,为什么位图不在屏幕上。
代码如下:
import java.awt.*;// Graphics class
import java.awt.geom.*;
import java.net.*;//URL navigation
import javax.swing.*;//JFrame
import java.util.*;//Toolkit
public class BitMapZombies2 extends JFrame implements Runnable
{
private Image zombieOneRight;
Thread zombieRun;
public static void main (String[] args)
{
new BitMapZombies2();
}
public BitMapZombies2()
{
super("Bit Map Zombies..RUN FOR YOUR LIFE!!!");
setSize(800,600);
setVisible(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Toolkit Zkit = Toolkit.getDefaultToolkit();
zombieOneLeft = Zkit.getImage(getURL("_images/_production_images/zombie_1_left_75h.png"));
zombieOneRight = Zkit.getImage(getURL("_images/_production_images/zombie_1_right_75h.png"));
zombieRun = new Thread(this);
zombieRun.start();
}
AffineTransform zombieIdentity = new AffineTransform();
private URL getURL(String filename)
{
URL url = null;
try
{
url = this.getClass().getResource(filename);
}
catch (Exception e) {}
return url;
}
public void paint(Graphics z)
{
Graphics2D z2d = (Graphics2D) z;
AffineTransform ZombiePowered = new AffineTransform();
z2d.setColor(Color.BLACK);
z2d.fillRect(0,0, 800, 600);
ZombiePowered.setTransform(zombieIdentity);
ZombiePowered.rotate(2,37.5,37.5);
z2d.drawImage(zombieOneRight,ZombiePowered,this);
}
public void run()
{
Thread zT = Thread.currentThread();
while (zT == zombieRun)
{
try
{
Thread.sleep(500);
}
catch(InterruptedException e)
{
e.printStackTrace();
}
repaint();
}
}
}
感谢我能得到的任何帮助。
答案 0 :(得分:0)
创建转换后,需要将其应用于图形上下文...
public void paint(Graphics z)
{
//...
z2d.setTransform(ZombiePowered);
//...
}
应用转换后,它会影响绘制到Graphics
上下文的所有内容,因此您需要重置它或引用它。有很多方法可以做到这一点,但最简单的方法是创建Graphics
上下文的副本,并在您不再需要它时简单地dispose
...
public void paint(Graphics z)
{
Graphics2D z2d = (Graphics2D) z.create();
//...
z2d.dispose();
}
另外,这只是我,但我会创建一个AffineTransform
的新实例,这些东西很容易搞砸......
答案 1 :(得分:0)
评论您的代码:
AffineTransform ZombiePowered = new AffineTransform();//Create an Id. transform
ZombiePowered.setTransform(zombieIdentity);//Set it as a copy of an Id. transform
ZombiePowered.rotate(2, 37.5, 37.5);//Concatenate the rotation with the Id. transform
z2d.drawImage(zombieOneRight, ZombiePowered, this);//Apply the rotation
所以你总是旋转2rads你的形象。如果在paint方法结束时执行此分配:
zombieIdentity = ZombiePowered;
下次绘制图像时,它将旋转2rads。 关于该职位的问题,请看一下旋转javadoc:
使用旋转坐标的变换连接此变换 围绕锚点。此操作相当于翻译 然后,坐标使锚点位于原点(S1) 围绕新原点旋转它们(S2),最后进行平移 中间原点恢复到的坐标 原始锚点(S3)。
此操作相当于以下调用序列:
translate(anchorx, anchory); // S3: final translation rotate(theta); // S2: rotate around anchor translate(-anchorx, -anchory); // S1: translate anchor to origin
希望它有所帮助。