gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 06:32:46 25 4
gpt4 key购买 nike

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

public void draw(Graphics2D g2d);

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

这种方法一开始似乎很有效,但正如我所担心的,从长远来看,它似乎无法处理多个对象。

仅注册了两个 Drawable,它们都在屏幕上绘制图像,我在 30-60 秒后看到了一些闪烁。

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

如果这只是一种糟糕的动画方式,那么当您有多个对象都需要用它们自己的特定变量渲染时,什么是更好的方法咳咳游戏咳咳?

如有任何帮助,我们将不胜感激。谢谢!

编辑:

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

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

每个 tick 更新游戏逻辑,而每个帧渲染调用帧管理器上的绘制。

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

最佳答案

我认为覆盖 paintComponent(Graphics g) 并定期调用 JPanel 上的 repaint 方法或您使用 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();
}
}

关于java - 在 Java 中制作动画的最佳方式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8600049/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com