在Java中制作动画的最佳方式?

时间:2011-12-22 06:12:01

标签: java swing animation graphics

我目前正在使用我设计的动画引擎,它接受Drawable类型的对象并将它们添加到List中。 Drawable是一个具有一种方法的接口:

public void draw(Graphics2D g2d);

扩展动画管理器遍历此列表并在每个对象上调用draw()方法,传递从Swing组件获取的Graphics2D对象。

这种方法起初似乎运作良好,但正如我所担心的,从长远来看似乎无法处理多个对象。

只注册了两个Drawable,两个都在屏幕上绘制图像,30-60秒后我看到有点闪烁。

有没有办法优化这种方法?它当前调用AWT线程(invokeLater)来处理所有任务。并发绘图实际上不是一个选项,因为这几乎总是会导致Swing / AWT出现问题,这在很大程度上是由于Graphics不同步。

如果这只是一种不好的动画制作方法,那么当你有多个对象需要用自己的特定变量渲染的东西时,有什么更好的方法咳嗽游戏咳嗽

任何帮助将不胜感激。谢谢!

编辑:

我不能使用repaint()因为我的引擎已经调用了AWT线程来绘制东西。如果我从AWT线程调用invokeLater,图像永远不会被绘制出来。

我还应该补充一点,我正在使用ticks和fps系统。 60滴@ 120 fps。

每个刻度都会更新游戏逻辑,而每个帧渲染调用绘制在帧管理器上。

这是个坏主意吗?我应该只使用FPS而不是滴答声吗?

1 个答案:

答案 0 :(得分:5)

我认为覆盖paintComponent(Graphics g)并定期调用JPanel上的重绘方法或者使用Timer绘制的任何内容更合适。你的问题可能是由于你试图绘制然后Swing做它自己的绘制。

public class Main {
public static void main(String[] args) {
    JFrame frame = new JFrame();
    JPanel panel = new JPanel() {
        public void paintComponent(Graphics g) {
            //draw here
        }
    };
    panel.setPreferredSize(800, 600);
    frame.add(panel);
    frame.pack();
    frame.setLocationRelativeTo(null);
    frame.setVisible(true)

    new Timer(16, new ActionListener() {
        public void actionPerformed(ActionEvent event) {
            panel.repaint();
        }
    }).start();
}
}