2012-02-20 2 views
0

Я читал много о двойной буферизации, поскольку я работаю над 2D-игрой. Я столкнулся со многими различными стратегиями для реализации, но я не уверен, как Double Buffering будет вписываться в то, как я создал свое игровое окно. Например, одна статья, с которой я столкнулся (http://content.gpwiki.org/index.php/Java:Tutorials:Double_Buffering), предложил использовать отдельный метод рисования; однако я подозреваю, что это применимо, если вы рисуете фигуры, а не добавляете компоненты в окно.Double Buffer a JFrame

Здесь (пропущенная методы KeyListener) мой основной код GUI

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; 
    } 
} 
} 

Как бы вы рекомендовали мне подойти к этому? Принимая во внимание, что Совет представляет собой JPanel, состоящий из сетки масштабированных изображений, а спрайт будет JComponent, отображающий масштабированное изображение.

С уважением, Джек.

ответ

2

Переопределите метод 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); 
} 
+2

'JPanel' по умолчанию двойной буферизации. – trashgod

+0

Да, ты прав. Просто увидел это в документации. Должен работать, хотя, как общий подход двойной буферизации в Swing. – Simon

+0

Да, «BufferedImage» хорош для составления промежуточного элемента, например. [Композитинга] (http://en.wikipedia.org/wiki/Digital_compositing). – trashgod

0

Поскольку графическая библиотека Java не является быстрой, либо функциональной, вы должны сообщить себе об «Легкой библиотеке игр Java» (http://lwjgl.org/). Он использует OpenGL, сильную графическую библиотеку, используя собственный код. Lwjgl также используется для игры Minecraft. Кроме того, OpenGL используется для разных языков, поэтому вы можете изучить многофункциональное и высокоуровневое программирование.

+4

+1 для OpenGl; -1 для необоснованных претензий. – trashgod

Смежные вопросы