2012-06-22 61 views
0

我在Java方面很有經驗,我用Swing(表單類型的應用程序)做了一點,但我從來不需要更多的權力,所以我不知道很多關於GUI下的情況。這是我從一直在做的閱讀中收集到的東西。我確定它關閉了。Java中的太空入侵者...組件或者繪圖

書面太空侵略者類型的遊戲,有兩種方法我想的是:

  1. 所有增量繪畫和分層創建一個大的組件和代碼。
  2. 在包含文本和圖像的JLayeredPane中創建一堆嵌套絕對定位的JPanel,然後在可能需要重繪的那些上調用repaint()。然後重寫paintComponent()(不確定以前的內容是否被自動清除)。從我讀的內容來看,這將處理組件的分層和重繪,而不必重畫整個屏幕。

這是正確的嗎?如果是這樣,哪種方法更適合該項目?

+0

@Charles謝謝!對於那個很抱歉。我真的很重視我在這裏得到的幫助。我需要努力,說出口! – Stinky

+0

參見[*太空侵略者101 *](http://www.stumbleupon.com/su/8wGoxm/www.cokeandcode.com/info/tut2d.html)。 – trashgod

+0

我建議你遠離Swing,因爲你已經正確地指出了自己 - 這是爲了GUI,而不是遊戲。對可用的遊戲特定的Java庫進行一些研究。 – maksimov

回答

3

當談到Java遊戲編程時,真正考慮的一件事就是切換到主動渲染。

正如我們所知,Swing負責在另一個線程中進行渲染,即Event Dispatch Thread。這就是所謂的被動渲染,因爲你並不真正渲染自己的可視化組件,但是你可以定義你的應用程序的外觀,Swing在他想要的時候實際繪製它。

遊戲通常以全屏模式工作,並且通常需要更多地控制「何時」,「如何」以及「將要繪製什麼」。這被稱爲主動渲染。在這種情況下,您必須禁用偶數調度線程並自行完成渲染。

這一切都是有道理的,因爲遊戲經常在一個大循環內工作。遊戲循環的一個例子是:

  1. 根據輸入數據獲取輸入數據(鍵盤,操縱桿等)
  2. 網絡通信(在客戶端 - 服務器的遊戲的情況下)
  3. 流程邏輯。 (最終,這將導致遊戲退出,當用戶告訴它)。
  4. 更新遊戲的狀態機。
  5. 根據新狀態重繪場景
  6. 重新啓動循環。

有很多來源,但我可以建議一讀,以澄清如下:Passive vs Active Rendering

+0

另一個更完整的資源:http://www.gamedev.net/page/resources/_/technical/general-programming/java-games-active-rendering-r2418 –

+0

非常有趣...似乎應用程序贏得'不一定會玩很好的W /窗口大小等,但是,對吧?如果你把所有的渲染代碼放在一個頂層組件中,那麼有一個反覆調用repaint()的循環?你能獲得開窗事件並擁有更多控制權嗎? – Stinky

+0

實際上,當您激活全屏模式時,將窗口設置爲操作系統/圖形卡所支持的尺寸之一。這樣,窗口實際佔據整個屏幕。如果您需要調整它的大小,它實際上是按照任何遊戲進行的:以編程方式將活動維度設置爲支持的顯示模式之一。 java.awt.DisplayMode是一組寬度,高度,bitDepth和刷新率。 –

2

的幾點思考你的方法

第一種方法可能會表現得更好,因爲你可以在整個繪圖中只使用一個VolatileImage。然而,你認爲它比第二種方法更復雜,因爲你必須自己處理所有的分層。

第二種方法不僅僅是因爲你已經聲明的原因,而是因爲如果你需要做任何事情,比如當鼠標在屏幕上輸入一個特定的「精靈」時,它會由Java自動給你JPanel實現。那說...太空侵略者克隆通常由鍵盤控制,因此無論您是否實際使用此功能都完全是另一回事。

底線......我通常最終會在paint()範式中做這種事情。分層繪製並不難,特別是對於太空侵略者這樣簡單的東西,如果您決定使用VolatileImage作爲後臺緩衝區,它將使改善性能變得更容易。

其他的想法

正如其他人所說,這是很難獲得一致的「幀速率」中搖擺,因爲你無法控制「時,」東西被渲染 - 這是由EDT,它運行確定與您的代碼異步。如果您決定依靠EDT,則可以嘗試使用SwingTimer進行渲染。要特別小心地將渲染和更新同步到底層遊戲狀態。