基于二维平铺的游戏:每个平铺作为一个对象是不切实际的?

时间:2012-07-09 04:20:15

标签: java opengl lwjgl multidimensional-array

我几个月来一直在尝试各种方法来创建一个二维的基于图块的游戏。我总是让每个瓷砖成为“瓷砖”类的独立对象。 tile对象存储在二维对象数组中。事实证明这是非常不切实际的,主要是在性能方面,同时渲染了许多瓷砖。我已经帮助了这个,只允许玩家在一定距离内渲染,但这也不是那么好。当我尝试在游戏中编辑tile的值时,我也遇到了返回空指针异常的对象的问题。这与2D阵列中的对象未正确初始化有关。

还有其他更简单的方法吗?我无法想象每个基于平铺的游戏都使用这种方式,我必须忽略一些东西。

编辑:也许LWJGL不是正确的库?我在使用LWJGL实现字体系统方面遇到了类似的问题...输入多个句子会使FPS降低100甚至更多。

2 个答案:

答案 0 :(得分:2)

对于静态对象(不会去任何地方,保持原样)1 tile = 1对象就可以了。这就是在Wolf3d中完成的方式。对于移动物体,您有多种选择。

如果您真的真的想要,当对象未完全包含在其中一个对象中并跨越一个或多个单元格/图块边界时,您可以将对象子部件存储在相邻的单元格/图块中。但这可能不太方便,因为你需要动态地将对象分成几部分。

更合理的方法是根本不将移动对象存储在单元格/切片中,并且或多或少地独立于静态对象处理它们。但是,您需要使用一些代码来确定对象可见性。实际上,在图形中,最基本的性能问题来自不必要的计算和渲染。通常,您甚至不想尝试渲染不可见的东西。同样,如果某些计算(特别是复杂的计算)可以移动到最里面的循环之外,它们应该是。

除此之外,很难给出任何具体的建议给出关于你正在做什么,你是如何做以及看到实际代码的细节。你应该真的试着让你的问题具体化。

答案 1 :(得分:1)

Tile对象的二维数组应该很好........这是大多数2D游戏使用的,你当然应该能够从OpenGL / LWJGL中获得足够好的性能来渲染它速度很快(100FPS +)。

要检查的事项:

  • 确保剪裁仅显示可见的图块集(根据屏幕宽度和高度以及玩家的位置)
  • 确保绘制每个图块的代码很快...理想情况下,您应该为每个图块绘制一个纹理正方形。特别是,您不应该在渲染代码中基于每个tile执行任何复杂的操作。
  • 如果你很聪明,你可以在一个OpenGL调用中使用VBO /巧妙地使用纹理坐标等绘制多个图块。但这对于基于图块的游戏来说可能是不必要的。