双缓冲JFrame

当我正在制作2D游戏时,我一直在阅读很多关于双缓冲的内容。 我遇到了许多不同的实现策略,但我不确定Double Buffering如何适合我创建游戏窗口的方式。 例如,我遇到的一篇文章(http://content.gpwiki.org/index.php/Java:Tutorials:Double_Buffering)建议使用单独的绘图方法; 但是,我怀疑如果您正在绘制形状,而不是向窗口添加组件,这将适用。

这是我的主要GUI代码(省略了keylistener方法)

public class MainWindow extends JFrame implements KeyListener{ private Dimension dim; private CardLayout layout; private JPanel panel; private JLayeredPane gameLayers; private Menu menu; private MiniGame miniGame; private Board board; private Sprite sprite; private Game game; private Map map; private GameState gs; private Boolean[] keys; public MainWindow(Game game, GameState gs, Map map, Sprite sprite){ //Call superclass. super(); addKeyListener(this); //Sore references to critical game components. this.game = game;//So we can call methods when an event occurs. this.gs = gs; this.map = map;//Used to construct the board. //The board needs to know the layout of the map. this.sprite = sprite;//Used to add the sprite to one of the layers. //Instantiate objects. dim = new Dimension(800, 600); layout = new CardLayout(); panel = new JPanel(layout); menu = new Menu(); miniGame = new MiniGame(); board = new Board(map); gameLayers = new JLayeredPane(); //Remove decoration and place window in center of screen. setUndecorated(true); Dimension screenDim = Toolkit.getDefaultToolkit().getScreenSize(); setBounds((screenDim.width /2)-(dim.width/2), (screenDim.height/2)-(dim.height/2), dim.width, dim.height); //Add the board to a layer. gameLayers.add(board, JLayeredPane.DEFAULT_LAYER); board.setBounds(0, 0, dim.width, dim.height); board.setBoard(); //Add the sprite to a layer. gameLayers.add(sprite, JLayeredPane.PALETTE_LAYER); sprite.setBounds(0, 0, 50, 50); //Add components to window. panel.add(gameLayers, "gameLayers"); panel.add(miniGame, "miniGame"); panel.add(menu, "menu"); //Add the "cards" to the window. add(panel); //JFrame housekeeping. pack(); setSize(dim); setDefaultCloseOperation(EXIT_ON_CLOSE); setResizable(false); setVisible(true); //Holds state when an event is triggered. //Ugly hack to circumvent delay issue. keys = new Boolean[4]; for(int i=0; i<keys.length; i++){ keys[i] = false; } } } 

你会怎么推荐我接近这个? 请记住,Board是一个JPanel,由一个缩放图像网格组成,精灵将是一个显示缩放图像的JComponent。

问候,杰克。

覆盖JPanel的paintComponent()方法并首先将内容绘制到BufferedImage图像中。 完成后,将BufferedImage的内容复制到您从paintComponent()获得的图形上下文中。

 protected void paintComponent(Graphics g) { BufferedImage bufferedImage = new BufferedImage(500, 500, BufferedImage.TYPE_ARGB); Graphics2D g2d = bufferedImage.createGraphics(); //paint using g2d ... Graphics2D g2dComponent = (Graphics2D) g; g2dComponent.drawImage(bufferedImage, null, 0, 0); } 

由于Java图形库速度不快,要么function齐全,您应该了解“轻量级Java游戏库”( http://lwjgl.org/ )。 它使用OpenGL,一个强大的图形库,使用本机代码。 Lwjgl也用于游戏Minecraft。 此外,OpenGL用于不同的语言,因此您可以学习多function和高级编程。