2013-03-25 52 views
1

我正在制作一个侧滚动游戏。为了防止我的游戏闪烁,我开始使用backbuffer来获得更流畅的图形。它解决了大部分问题,但是,如果我将角色移动足够长的时间,屏幕会开始闪烁。 I read about the problem here,但它没有详细说明如何解决这个垂直消隐间隔。我知道这并不是“闪烁”,而是因为新的东西被涂成了旧的,所以会更“撕裂”。有什么办法可以避免这种“撕裂”?双缓冲区的Java小应用程序闪烁

谢谢!

+0

什么时候重绘?不断在一个循环中,或当用户移动角色?这完全是基于这样一个事实的推测,即只有当您将角色移动一段时间时才会发生这种情况,但如果您在按键功能中重绘时没有每秒帧数的限制,由于按键事件触发得很快,每次都会越来越慢,直到撕裂终于开始。 – jonhopkins 2013-03-25 14:24:50

+0

回答我自己的问题。此链接很有帮助[链接](http://www.koonsolo.com/news/dewitters-gameloop/) – faeophyta 2013-03-25 14:40:57

回答

0

我会在评论中回答,但有太多的细节。以下代码几乎完全来自一个小程序,在这个小程序中,我必须以与现在相同的方式限制FPS(除了在mouseMove而不是keyPressed之外)。

private long lastDrawTime = 0; 

public void keyPressed(KeyEvent e) { 
    if (Calendar.getInstance().getTimeInMillis() - lastDrawTime < 20) return; 
    //do whatever needs to be done before redrawing 
    draw(); 
    lastDrawTime = Calendar.getInstance().getTimeInMillis(); 
} 

这里发生的事情是,有存储,最后重绘发生的时间变lastDrawTime一个实例。将此变量与任何绘图发生之前正在触发的keyPressed事件的当前时间进行比较。如果时间差小于允许的时间间隔(在这种情况下为20毫秒或50帧/秒),则函数返回并且不执行绘图或更新。如果足够的时间过去了,所有正常的事情都完成了,并且当前时间存储在变量中。

+0

谢谢!这比我发现的方法要容易得多。 – faeophyta 2013-03-25 14:43:08

+0

您发现的文章实际上非常有用。这个答案对于只需要更新用户输入的当前上下文是有用的,但是一旦你开始添加其他东西,如独立于播放器移动的敌人,最好使用文章中描述的方法。 – jonhopkins 2013-03-25 14:44:32