编程语言: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。我认为我的错误是我没有正确映射枢轴点,但我不知道。我的游戏确实需要此功能,因此请帮助我,现在非常绝望。

最佳答案

新的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 ms相当慢。动画看起来会很生涩。平稳动作最多需要30毫秒或每秒30帧。使用GPU的游戏有时会以超过100 fps的速度运行。

并且在动画循环内应尽可能避免使用new。它将要求垃圾收集器更频繁地运行。这可能会导致动画结结。

关于java - Java旋转动画,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11111685/

10-12 22:36
查看更多