2013-03-25 87 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