2014-02-14 63 views
0

現在我有一個不斷重畫屏幕的主遊戲循環。由於我需要減慢這個線程,但繼續以更快的速度繪製其他項目,我需要做一個新的線程。問題是我不知道如何去做一個新的線程,也可以繪製到屏幕我知道如何創建一個新的線程,我只是堅持如何在新線程中實現Graphics2D繪圖。例如,我有下面的代碼是典型的起點,然後是另一個類中定義的繪製方法,它指導什麼以及何時繪製。如果我想分手,並有另一個線程繪製和做自己的事情,我該怎麼做?如何創建一個以Java繪製屏幕的新線程?

我是否必須創建一個新的類來創建一個全新的PaintComponent()?或者我會簡單地創建一個新的Graphics2D對象,以便我可以使用不同的字體顏色等?我想最讓我困惑的是我不能只調用一個不同的繪製方法,因爲我仍然需要通過g2d作爲參數。所以在我看來,我需要在已有g2d對象的另一個方法中創建線程。

如果這讓我感到困惑,我會道歉,因爲我還是JAVA的初學者。如果您需要更多信息,請告訴我。先謝謝你。

public abstract void draw(Graphics2D g2d); 



@Override 

public void paintComponent(Graphics g) 
{ 
Graphics2D g2d = (Graphics2D)g; 

super.paintComponent(g2d); 

draw(g2d); 
} 
+1

我離成爲遊戲專家很遠,但我認爲你應該堅持一個獨特的遊戲循環,重繪每次迭代必須以快速重繪的東西,並且只繪製應該繪製在每N次迭代緩慢。 –

+0

這當然是一種解決問題的方法。如果我明白你在說什麼,你建議我可以使用一個計數器,並且只有一個循環每一次都有很多次數。我認爲在這種情況下,雖然我真的需要使用多個線程。無論如何,學習如何更好地使用它們會更好,因爲更高級的遊戲幾乎需要它。謝謝您的意見。我會拭目以待,看看其他人是否也有一些想法。 – user3312030

回答

0

首先,Swing本質上是單線程的。這是在「單線程規則」中總結的

一旦實現了Swing組件,所有可能影響或依賴於該組件狀態的代碼都應該在事件分派線程中執行。

(不幸的是,相應的網站沒有生存的Java從太陽到Oracle的遷移,但有些信息可以在這裏找到http://docs.oracle.com/javase/tutorial/uiswing/concurrency/dispatch.html或做了「搖擺單線程規則」網絡搜索時)

在一般來說,這也適用於繪畫paintComponent只能由事件派發線程(EDT)安全地調用。它會被稱爲「自動」。這就是爲什麼這種技術被稱爲「被動渲染」:您覆蓋了paintComponent方法,期望它會被EDT調用。

但是,特別對於遊戲開發,您可以使用名爲「主動渲染」的技術。在這種情況下,繪畫稍微複雜一些,需要設置自己的BufferStrategy。潛在的優勢是任何線程都可以在這種情況下執行渲染操作,因爲您可以通過調用BufferStrategy#getDrawGraphics來獲得Graphics對象。

的信息可以在http://docs.oracle.com/javase/tutorial/extra/fullscreen/rendering.html發現(而這指的是全屏渲染,類似的概念可以在一個窗口中被應用到積極的渲染,但我建議你諮詢可以用像「搖擺的關鍵字中找到進一步的教程/資源主動渲染「)。

+0

謝謝Marco13。我將不得不閱讀這些內容。希望它不是非常複雜。如果它能讓我有更多的自由來繪製不同的線索,那麼它可能是值得的。至少現在我有一些事情要繼續下去。 – user3312030

相關問題