编程语言:Java
好的,所以我想要一个 BufferedImage一直无限旋转。我对于提出好问题还很陌生,所以请耐心等待。
我有一个名为arm的BufferedImage,它是矩形的,我有一个ActionListener每 100 毫秒循环一次 repaint() 我的代码是:
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 毫秒对于帧速率来说相当慢。动画看起来会很生涩。流畅的 Action 最多需要 30 毫秒或每秒 30 帧。使用 GPU 的游戏有时运行速度超过 100 fps。
并且您应该尽可能在动画循环内避免 new
。它将要求垃圾收集器更频繁地运行。这可能会导致动画出现卡顿。
关于Java旋转动画,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11111685/