编程语言:Java
好的,所以我想要一个无限旋转的缓冲图像。我仍然很擅长提出好问题,所以请耐心等待。
我有一个名为 arm 的 BufferedImage,它是矩形的,我有一个每 100 毫秒循环一次 repaint() 的 ActionListener我的代码是:
public void paint(Graphics g){
AffineTransform t = new AffineTransform();
t.rotate(Math.toRadians(90),(arm.getWidth()/2)*scale,0);
t.translate(300,300);
g.drawImage(arm,t,null);
}
如果您想知道我将图像大小调整为 4 倍,因此可变比例 = 4。我认为我的错误是我没有正确映射枢轴点,但我不知道。我的游戏真的需要这个,所以请帮助我现在非常绝望。
新AffineTransform
始终具有零旋转。 您正在添加 90 度旋转,因此动画的每一帧看起来都相同:图像从其正常方向旋转了 90 度。
您需要计算当前的旋转角度。
// Instance variable intialized at zero.
double angle = 0.0;
// In your ActionListener timer handler increment the angle.
{
angle += Math.toRadians(5); // 5 degrees per 100 ms = 50 degrees/second
while (angle > 2 * Math.pi())
angle -= 2 * Math.pi(); // keep angle in reasonable range.
}
public void paint(Graphics g) {
// Just use the transform that's already in the graphics.
Graphics2d g2 = (Graphics2d) g;
g2.setToIdentity();
// The code for your other transforms is garbled in my browser. Fill in here.
g2.rotate(angle);
g2.drawImage(arm, t, null);
}
希望这能让你更接近。
我要补充一点,100 毫秒对于帧速率来说是相当慢的。动画看起来会很生涩。 平滑动作最多需要 30 毫秒或每秒 30 帧。 使用 GPU 的游戏有时会运行超过 100 fps。
并且应尽可能避免在动画循环中new
。 这将要求垃圾回收器更频繁地运行。这可能会导致动画卡顿。