我正在为我的基于2D的平铺RPG游戏制作地图编辑器,而且我遇到了障碍。问题实际上是如何有效地为非常大的地图绘制网格线,例如300x300瓷砖。
最初我每次移动鼠标或点击时都会调用整个网格面板(因为它允许您拖动并突出显示您正在悬停的图块)。这对于大型地图来说太可怕了,而且非常慢。
所以我的解决方案是在创建新的空地图时为指定大小的网格创建一个bufferedImage,并在每次调用paint时重绘该图像。这非常有效,除了对于200x200以上的任何东西,java在创建bufferedImage时会耗尽堆空间。我无法真正拥有预加载的图像,因为用户应该能够指定任何大小的新地图。此外,我喜欢在瓷砖上绘制网格,否则瓷砖会覆盖线条,看起来更麻烦。这意味着每次添加瓷砖时都必须再次绘制网格?
我的问题是,是否有另一种方法来绘制一个非常大的网格,每次移动鼠标时都会重新绘制? Tiled程序可以轻松创建1000x1000或更高的地图,它是如何完成的?感谢
修改 我的意思是实际网格LINES,而不是像瓷砖这样的网格内容。现在,当绘制网格时,它会遍历2D数组并在每个tile的长度上绘制一条线。
修改 我通过仅绘制屏幕的可见部分来实现它。事实证明,在JScrollPane中找到视图窗格的坐标并不困难。 :)
答案 0 :(得分:0)
好的,所以这就是similair我想我现在正在做什么。我目前正在Ogre3D中编写一些带有3D前端的仿真软件。我有一个基于图块的地图,可以很容易地3000 x 3000,有时甚至可能更大。
现在我不知道如何绘制你的网格,如果你只是做2D / 3D,但我的主要问题是如何将不同的纹理应用于每个图块。如果这不相关,那么希望这可能有助于未来lol。对我来说问题是,由于速度的原因,为eacch tile创建一个单独的对象是不可能的。如果甚至有1024 x 1024,你会看到超过100万个瓷砖,每个瓷砖都有属性。这在我的第一次测试中效果很好,我只有10 x 10个地图,但在较大的地图上,它只是暂停了。
我目前正在做的是重写它,新方法如下。 (如果它有帮助,您可以根据自己的需要进行调整)。网格现在只有一个对象,在我的情况下它是一个网格,因为我在3d中工作。每个顶点都有几个值,一个是列,一个是行。我有一个单独的纹理,与我的地图大小相同,所以对于一个100列和100行的地图,我创建一个100 x 100的纹理(这是动态创建的)。
然后我将这个纹理和顶点传递给我的cg着色器(这是tyou可能需要考虑一种等效的做事方式,但我认为它应该是可行的)。通过查找与我想要纹理的网格槽相关的纹理中的像素颜色,我可以找到一个颜色值,这些颜色值与我的纹理图集有关,它保存了我的地图所有可能的纹理。然后你要做的就是将纹理图集的特定部分用于网格/网格的特定部分。
我希望这有点道理,如果没有,那么我很乐意再解释一下。我认为即使我使用CG着色器,你也应该能够在java中找到基于非CG的东西。这样做的好处是你最终得到一个查找纹理,一个内存中的一个对象和一个容纳顶点的缓冲区,可以非常快速地进行查找。
希望这有帮助。