首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >双缓冲a JFrame

双缓冲a JFrame
EN

Stack Overflow用户
提问于 2012-02-21 03:50:47
回答 2查看 11.4K关注 0票数 1

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

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

代码语言:javascript
运行
复制
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,而sprite将是一个显示缩放图像的JComponent。

问候你,杰克。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-02-21 04:11:19

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

代码语言:javascript
运行
复制
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);  
}
票数 4
EN

Stack Overflow用户

发布于 2012-02-21 04:06:17

由于Java图形库速度不快,功能也不好,您应该了解一下“轻量级Java游戏库”( http://lwjgl.org/ )。它使用OpenGL,一个强大的图形库,使用原生代码。Lwjgl也用于游戏“我的世界”。此外,OpenGL用于不同的语言,因此您可以学习多功能和高级编程。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9367502

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档