Doble Buffer a JFrame

He estado leyendo mucho sobre Double Buffering mientras estoy trabajando en un juego 2D. Me he encontrado con muchas estrategias diferentes para la implementación, pero no estoy seguro de cómo encajaría Double Buffering en la forma en que he creado mi ventana de juego. Por ejemplo, un artículo que encontré (http://content.gpwiki.org/index.php/Java:Tutorials:Double_Buffering) sugirió tener un método separado para dibujar; sin embargo, sospecho que esto sería aplicable si estuviera dibujando formas, en lugar de agregar componentes a la ventana.

Aquí está mi código GUI principal (se omiten los métodos 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; } } } 

¿Cómo me recomendaría que me acercara a esto? Teniendo en cuenta que la Junta es un JPanel que consiste en una cuadrícula de imágenes a escala, y el sprite será un JComponent que muestra una imagen a escala.

Saludos, Jack.

Anule el método paintComponent () de JPanel y pinte el contenido primero en una imagen de Imagen de Buffer . Una vez hecho esto, copie el contenido de BufferedImage en el contexto de gráficos que obtiene de 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); } 

Como la biblioteca de gráficos de Java no es rápida ni funcional, debe informarse sobre la “biblioteca de juegos Java ligera” ( http://lwjgl.org/ ). Utiliza OpenGL, una fuerte biblioteca de gráficos, utilizando código nativo. Lwjgl también se utiliza para el juego Minecraft. Además, OpenGL se usa para diferentes idiomas, por lo que podría aprender progtwigción multifuncional y de alto nivel.

    Intereting Posts