Java旋转动画

标签 java swing graphics rotation bufferedimage

编程语言: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 毫秒对于帧速率来说相当慢。动画看起来会很生涩。流畅的 Action 最多需要 30 毫秒或每秒 30 帧。使用 GPU 的游戏有时运行速度超过 100 fps。

并且您应该尽可能在动画循环内避免 new 。它将要求垃圾收集器更频繁地运行。这可能会导致动画出现卡顿。

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

相关文章:

android - 在智能手机上具有大量图形的性能

java - 添加 "query.getResultList()"时编译器发出警告

java - 正则表达式获取两个引号之间的字符串内容,以给定名称开头

java - 如何在将 ImageIcon 放在 JButton 上之间获得延迟?

java - 仅当控制按钮被按下两次时如何使 JFrame 可见

opengl - 与 GL_MAX_TEXTURE_SIZE 混淆

java - 我需要帮助在 Java 中将文本文件转换为 xml

java - XMLRPC IP.Board 无法找到名为的 API 模块

java - 在 JEditorPane 中缩进 XML

graphics - Mathematica 中这些未记录的样式选项有什么作用?