0

编程语言:Java

好的,所以我想要一个BufferedImage保持无限旋转。我在提出好问题方面还是个新手,所以请多多包涵。

我有一个名为 arm 的 BufferedImage,它是矩形的,我有一个ActionListener,它每 100 毫秒循环一次 repaint() 我的代码是:

public void paint(Graphics g){ 
    AffineTransform t = new AffineTransform(); 
    t.rotate(Math.toRadians(90),(a­­rm.getWidth()/2)*scale,0); 
    t.translate(300,300); 
    g.drawImage(arm,t,null);
}

如果您想知道我将图像的大小调整了 4 倍,因此变量比例 = 4。我认为我的错误是我没有正确映射枢轴点,但我不知道。我的游戏真的需要这个,所以请帮助我现在非常绝望。

4

1 回答 1

2

新的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尽可能避免在动画循环中。它将要求垃圾收集器更频繁地运行。这可能会导致动画卡顿。

于 2012-06-20T01:44:43.167 回答