我最近一直在研究一款java游戏,而且我有很多想法。然而,有一件事仍然困扰着我。它的设置方式是,玩家在背景中移动(游戏板)。目前,每次玩家移动时,它都会重新绘制整个帧,包括背景。每当玩家移动时,这会导致短暂但恼人的屏幕闪烁。
我已将我的代码分离出来,将背景与需要重新绘制的内容分开绘制:
public void drawMap(图形窗格){...}
public void drawPlayer(图形窗格){...}
问题是当我使用repaint()时,我找不到让电路板留在屏幕上的方法; ,球员移动的必要性。有什么建议吗?
答案 0 :(得分: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提供了一个很好的代码示例,您可以使用并进行调整,这应该可以让您最好地了解如何进行双缓冲
答案 1 :(得分:0)
我建议避免在每次更改时重新绘制所有内容。而是以固定的间隔绘制整个帧,例如,每隔50ms。只需保持类中每个元素的状态,如果有更改,只需更改数据值即可。由于固定的重绘间隔,显示将在下次重绘时获取任何更改。