bgr*_*nks 2 java graphics animation swing
我目前正在使用我设计的动画引擎,它接受Drawable类型的对象并将它们添加到List中.Drawable是一个有一个方法的接口:
public void draw(Graphics2D g2d);
Run Code Online (Sandbox Code Playgroud)
扩展动画管理器遍历此列表并在每个对象上调用draw()方法,传递从Swing组件获取的Graphics2D对象.
这种方法起初看起来效果很好,但正如我所担心的,从长远来看似乎无法处理多个对象.
只有两个Drawables注册,两个都在屏幕上绘制图像,我看到30-60秒后有点闪烁.
有没有办法优化这种方法?它当前调用AWT线程(invokeLater)来处理所有任务.并发绘图实际上不是一个选项,因为这几乎总是会导致Swing/AWT出现问题,这在很大程度上是由于Graphics不同步.
如果这只是一种不好的动画制作方法,那么当你有多个对象需要用自己特定的变量来渲染咳嗽游戏咳嗽时,更好的方法是什么?
任何帮助,将不胜感激.谢谢!
编辑:
我不能使用repaint()因为我的引擎已经调用了AWT线程来绘制东西.如果我从AWT线程调用invokeLater,图像永远不会被绘制出于某种原因.
我还应该补充一点,我正在使用ticks和fps系统.60蜱@ 120 fps.
每个刻度都会更新游戏逻辑,而每个帧渲染调用绘制在帧管理器上.
这是一个坏主意吗?我应该只使用FPS而不是滴答声吗?
我认为覆盖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();
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2452 次 |
| 最近记录: |