2012-03-27 56 views
0

最近我一直在研究java游戏,并且我发现了很多东西。但是,有一件事仍然困扰着我。它的设置方式,玩家穿过背景(游戏板)。目前,每次玩家移动时,都会重新绘制整个框架,包括背景。当玩家移动时,这会导致简短而烦人的屏幕闪烁。Java:将多个对象绘制到一个框架上

我已经分离出来,我的代码,以从需要重新绘制的东西分别绘制背景:

公共无效drawMap(图形窗格){...}

公共无效drawPlayer(图形窗格){...}

问题是,我无法找到一种方法,使我留在屏幕上时,我使用repaint(); ,这是玩家移动的必要条件。有什么建议么?

+0

你想要双缓冲! – 2012-03-27 20:30:01

回答

1

你应该看看双缓冲,基本上你将图像绘制到缓冲区,然后绘制缓冲区。它应该消除你正在谈论的闪烁效果。下面是一些有用的链接:

http://docs.oracle.com/javase/tutorial/extra/fullscreen/doublebuf.html
http://content.gpwiki.org/index.php/Java:Tutorials:Double_Buffering
http://www.ecst.csuchico.edu/~amk/classes/csciOOP/double-buffering.html

只是评论,如果你无法理解它。

更新:我也建议你看看'Killer game programming in java'。您可以获得一个旧版本的免费电子书。其中一些有点过时,但前几章关于设置游戏循环和绘制屏幕等方面的内容仍然非常相关。

更新2:从第二个环节,尝试这样的事情:

private void drawStuff() { 
    BufferStrategy bf = this.getBufferStrategy(); 
    Graphics g = null; 

    try { 
    g = bf.getDrawGraphics(); 

     drawMap(g); 
     drawPlayer(g); 

    } finally { 
    // It is best to dispose() a Graphics object when done with it. 
    g.dispose(); 
    } 

    // Shows the contents of the backbuffer on the screen. 
    bf.show(); 

     //Tell the System to do the Drawing now, otherwise it can take a few extra ms until 
     //Drawing is done which looks very jerky 
     Toolkit.getDefaultToolkit().sync(); 
} 

更新3:这个帖子here给出了一个很好的代码示例,你可以玩和适应,应该给你最好的主意关于如何做双缓冲

+0

我在这些网站上阅读。我理解它背后的想法,但我不确定如何使用框架和绘画方法来实现它。 (绘画方法调用上面列出的两种方法。) – Docithe 2012-03-27 20:49:11

+0

+1对于'KGPIJ'。 – 2012-03-27 20:54:56

+0

我看到一个,但它似乎没有使用任何绘画方法。这就是我困惑的原因。 – Docithe 2012-03-27 22:18:41

0

我建议避免重绘每一个变化的一切。而是以固定间隔绘制整个帧,例如,每50ms。只要保持一个类中每个元素的状态,并且只要改变了某个数据值即可。由于固定的重绘时间间隔,显示屏将在下一次重绘时收集任何更改。