我想创建Conway's Game of Life。我读了Java 2d API,但Graphics类只在drawRect()
的paintComponent上提供fillRect()
和JPanel
的方法。我的意思是矩形不能作为对象单独处理,即我可以检查哪一个相对于附近的那些。
所以我想问一下如何制作正方形,以便可以单独处理它们并动态创建网格?
答案 0 :(得分:2)
创建一个包含所有必需属性的Sqaure类。 创建表示板的Square对象列表。 在JPanel的draw方法中,迭代Square对象列表,根据其属性绘制每个对象。
尽可能将显示代码与逻辑分开 - 这几乎总是一个好主意。
答案 1 :(得分:1)
我想提出一个完全不同的解决方案。通常必须将生成的图形视为仅输出,这意味着,您不希望从图形中读取状态,因为它太慢了。 你必须将细胞的状态保持在其他位置,就像在二维数组中一样。 例如,boolean [] []或int [] []。 然后你需要一种“渲染”方法,它可以获取你的单元格的值,并将其绘制出来。
但我想提出一个更酷的方法来做到这一点。不使用二维数组,而是使用由BufferedImage组成的(一维)数组。 通常,每个“像素”是该阵列中的元素。然后使用drawImage绘制该图像,并将该图像缩放。这可能表现得非常好。您可以实时绘制整个屏幕。
BufferedImage有各种各样的方法,起初有点令人困惑。最后,你会在某个地方找到一个DataBuffer。您将需要访问int []。
然后,设置一个单元格:data [y * width + x] = -1; (白细胞) 清除单元格:data [y * width + x] = 0; (黑细胞) (例如 - 反之亦然 - 或任何其他颜色)。
你可以对此非常感兴趣。您可以使用各种偏移变量,而不是一直计算y * width + x,并且非常好地优化它。 事实上,我尽可能地使它变得如此高效,以至于你实际上可以胜过另一个在C ++中制作相同程序的人。