【问题标题】:how to draw large grids for map editor?如何为地图编辑器绘制大网格?
【发布时间】:2012-06-30 17:44:28
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

    标签: java user-interface paint bufferedimage heap-memory


    【解决方案1】:

    好的,我猜这与我目前正在做的事情相似。我目前正在用 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 内容提供一个等价物。这样做的好处是您最终会得到一个查找纹理、一个内存中的对象和一个保存顶点的缓冲区,这对于查找非常快速。

    希望这会有所帮助。

    【讨论】:

    • 感谢您的回复,我的问题有点不同,抱歉我不清楚。我在如何绘制实际的网格线、正方形方面遇到了麻烦。我已经按照您建议的方式绘制图块,其中单个哈希图包含所有图像,每个图块只包含一个变量,该变量是对应图像的键。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-22
    相关资源
    最近更新 更多