作为一项任务的一部分,我正在努力重建“塞尔达传说与过去的联系”。
我遇到了以下问题,游戏世界是一个 BufferedImage,其中 subImage() 是玩家当前位置所需的部分。游戏可以运行,但使用了 80%/110% 的 CPU。个人资料显示罪魁祸首是图像的绘制。
所以我想我将背景放在与玩家、敌人等 JPanel 分开的 JPanel 中。 渲染它们彼此重叠 (JLayeredPane) 并且重绘背景面板的频率要低得多。
但是我该怎么做才能告诉 swing 每秒绘制一个面板 x 次,其他 y 次?如果您有更好的优化方法,请告诉我。
这是我目前得到的:
public class Main extends JFrame
{
private ZeldaGame game = new ZeldaGame();
private View view = new View(game);
private BackgroundView bckView = new BackgroundView(game);
private Controller ctl = new Controller(game, view, bckView, this);
public Main()
{
setLayout(null);
view.setBounds(0, 0, game.getWidth(), game.getHeight());
bckView.setBounds(0, 0, game.getWidth(), game.getHeight());
JLayeredPane pane = new JLayeredPane();
pane.add(bckView, 1);
pane.add(view, 0);
setLayeredPane(pane);
setSize(game.getWidth(), game.getHeight());
setResizable(false);
setLocationRelativeTo(null);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
}
public static void main(String[] args)
{
new Main();
}
}
谢谢。
最佳答案
由于帧缓冲区的工作方式,实际上不可能有不同的渲染时间——结果将是大量令人讨厌的闪烁。您需要做的是使用 Canvas
而不是 JPanel
和 JLayeredPane
并且您可以覆盖 paint()
Canvas 的方法或使用 bi.getGraphics()
并以正确的顺序使用这些方法中的任何一种循环 blit 背景和字符。我建议使用像 GTGE 这样的瘦引擎它将从优化的所有困惑细节中抽象出来。您认真使用的这些高级组件不是为游戏设计的,您根本不应该使用它们。
关于Java优化为游戏绘制背景图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2372487/