0

我正在为基于 2d 瓷砖的 RPG 游戏制作地图编辑器,但遇到了障碍。问题实际上是如何为非常大的地图(例如 300x300 瓦片)有效地绘制网格线。

最初,我每次移动鼠标或单击时都会调用重新绘制整个网格面板(因为它允许您拖动并突出显示您悬停的图块)。这对于大型地图来说太可怕了,而且速度非常慢。

所以我的解决方案是在创建新的空地图时为指定大小的网格创建一个缓冲图像,并在每次调用paint时重绘该图像。这工作得很好,除了 200x200ish 以上的任何东西,java 在创建缓冲图像时会耗尽堆空间。我真的不能有一个预加载的图像,因为用户应该能够将新地图指定为任意大小。另外,我喜欢在瓷砖上绘制网格,否则瓷砖会遮住线条,看起来更乱。这意味着每次添加瓷砖时都必须再次绘制网格,对吗?

我的问题是,有没有另一种方法来绘制一个非常大的网格,每次移动鼠标时都会重新绘制?Tiled 程序可以轻松创建 1000x1000 或更大的地图,它是如何完成的?谢谢

编辑: 我的意思是实际的网格线,而不是像瓷砖这样的网格内容。现在,当绘制网格时,它会遍历 2D 数组并在图块的每个长度处绘制一条线。

编辑: 我通过仅绘制屏幕的可见部分来使其工作。事实证明,在 JScrollPane 中找到视图窗格的坐标并不难。:)

4

1 回答 1

0

好的,所以这与我目前正在做的事情相似。我目前正在用 Ogre3D 编写一些带有 3D 前端的模拟软件。我有一个基于图块的地图,可以很容易地达到 3000 x 3000,有时它们可​​能更大。

现在我不确定你将如何绘制网格,如果你只是在做 2D/3D,但对我来说主要的问题是如何将不同的纹理应用到每个图块。如果这不相关,那么希望这对未来的大声笑有所帮助。对我来说,问题是因为速度的原因,为每个图块创建一个单独的对象是不行的。如果甚至有 1024 x 1024,您会看到超过 100 万个图块,每个图块都有属性。这在我只有 10 x 10 的地图的第一次测试中效果很好,但在更大的地图上它只是停止了。

我目前正在做的是重写它,新方法如下。(如果有帮助,您可以根据自己的工作进行调整)。网格现在只有 1 个对象,在我的情况下它是一个网格,因为我在 3d 中工作。每个顶点都有几个值,一个是列,一个是行。我有一个与我的地图大小相同的单独纹理,因此对于具有 100 列和 100 行的地图,我创建了一个 100 x 100 的纹理(这是动态创建的)。

然后我将这个纹理和顶点传递给我的 cg 着色器(这是你可能不得不考虑一种等效的做事方式的地方,但我认为它应该是可行的)。通过在这个纹理中与我想要纹理的网格槽相关的像素处查找颜色,我可以找到一个颜色值,这些颜色值与我的纹理图集相关,该图集包含我的地图的所有可能纹理。然后,您所要做的就是将纹理图集的特定部分用于网格/网格的特定部分。

我希望这有某种意义,如果不是,那么我很乐意解释一下。我认为即使我使用 CG 着色器,你也应该能够为 java 中的非 CG 内容提供一个等价物。这样做的好处是您最终会得到一个查找纹理、一个内存中的对象和一个保存顶点的缓冲区,这对于查找非常快速。

希望这可以帮助。

于 2012-06-30T18:02:32.687 回答