2011-10-21 137 views
1

我想創建Conway's Game of Life。我讀了Java 2d API,但Graphics類只提供的paintComponent上的drawRect()fillRect()的方法。我的意思是這些矩形不能單獨作爲對象來處理,也就是說,我可以檢查哪一個與附近的相關。
所以我想問問如何製作正方形,以便它們可以單獨處理並且動態創建網格?動態創建矩形網格

回答

2

創建一個需要所有屬性的Sqaure類。 創建代表電路板的Square對象列表。 在JPanel的繪製方法中,迭代Square對象的列表,根據其屬性繪製每個對象的列表。

儘可能保持您的顯示代碼與您的邏輯分開 - 這幾乎總是一個好主意。

+0

我如何讓廣場可選?我可以在我製作的Square上實現MouseListener接口嗎? – prometheuspk

+0

你可以通過JPanel實現MouseListener,獲取點擊的共同點並檢查這些共同點是否在你的Square對象中(我建議在渲染時設置Square對象的共同點他們或者更好,在創建Squares時設置合作伙伴,然後使用這些合作伙伴選擇展示位置) –

+1

好的建議。對於像生命遊戲這樣的東西來說,通過座標檢查找出選定的正方形會更好,而不是試圖用面板上的組件(如按鈕或標籤)表示所有東西。它會更敏捷,更輕量。請務必閱讀模型視圖控制器模式,通常縮寫爲MVC)。您的網格是模型,可視化是視圖,同時控制器通過響應鼠標事件。 –

1

我想提出一個完全不同的解決方案。通常必須將生成的圖形視爲僅輸出,這意味着,您不想從圖形中讀取狀態,因爲這太慢了。 你必須保持其他地方的單元格狀態,就像在一個二維數組中。例如, boolean [] []或int [] []。 然後你需要一個「渲染」的排序方法,將你的單元格的值,並繪製出來。

但我想提出一個更酷的方式來做到這一點。而不是保留二維數組,使用BufferedImage組成的(一維)數組。通常,每個「像素」是該數組中的一個元素。然後使用drawImage繪製該圖像,並向上縮放該圖像。這可能表現非常好。您可能可以實時獲得整個畫面。

BufferedImage有很多不同的方法,起初有點混亂。最後你會在某處找到DataBuffer。你需要訪問int []。然後,設置單元格:data [y * width + x] = -1; (白色單元格) 以清除單元格:data [y * width + x] = 0; (黑色單元格) (例如 - 反之亦然 - 或任何其他顏色)。

你可以真的很喜歡這個。您可以使用各種偏移量變量,而不必一直計算y * ​​width + x,並對其進行優化。事實上,我儘可能地讓它變得如此高效,以至於你可以超越另一個用C++編寫完全相同的程序的人。

+0

如果這是性能比賽的一部分,我甚至可以提出一個*更高效的算法。回到80年代,我曾經在Commodore Amiga中使用Blitter芯片,並創建了一個Life程序。我想出了一個非常奇怪的算法,可以讓我用它做一個實時的全屏高分辨率遊戲 - 這是在一臺7MHz的計算機上(0.007 GHz)。我可以設想模仿一個阻擊器,然後再做一次。這不是你通常會想到的,但它可能會產生驚人的結果,例如100fps的5000x5000單元陣列或一些荒謬的結果。 – Mike

+0

然後就是那個GPU ......也可以使用它。這超出了我所知道的。 – Mike