何时在Libgdx中使用ShapeRenderer、Mesh + SpriteBatch、Box2D和Scene2D?

11
我是Android游戏开发的新手,尝试使用libgdx的ShapeRenderer后进行了更多的搜索,现在对于我是否正确入门感到困惑。

所以,我真正想知道的是何时应该使用ShapeRenderer、Mesh+SpriteBatch、Box2D和Scene2D。

1个回答

25

ShapeRenderer 可以方便快捷地在屏幕上放置基本的平面多边形和线条,但不是特别高效(每次渲染都会上传大量顶点数据)。它主要面向屏幕(默认情况下采用全屏正交投影,单位通常为像素)。

Mesh 类使您能够更直接地控制几何图形,但需要了解更多的细节(例如将颜色编码为浮点数并将顶点数据、颜色数据和纹理数据存储在同一个浮点数组中,以及索引数组的概念)。

SpriteBatch 以"精灵"(通常是带有纹理的矩形区域)为中心。这可以隐藏一些使用网格进行纹理贴图的复杂性和灵活性。

Box2D 用于物理建模,并且与您提到的其他 API 部分(主要是有关渲染的部分)不同。

最后,Scene2D 主要用于创建动画用户界面元素,例如按钮、列表和滑块。但它非常强大(并具有足够的灵活性和良好的交互支持),因此您也可以在其中实现相当多的"游戏"逻辑。

你也可以使用原始的"OpenGL"命令(参见GL20)。

你可以完全混合和匹配这些不同的基元(一个警告是在开始不同的渲染器ShapeRenderer/SpriteBatch/Mesh之前,通常必须"flush"和"end")。所以,例如,你可以在游戏的“主菜单”和一些元操作中使用Scene2D,SpriteBatch来渲染游戏的核心,并使用ShapeRenderer生成调试覆盖物(考虑可视化边框框等)。

还要注意,大多数libGDX面向2D。原始的OpenGLMesh API也可用于构建3D对象。

查看gdx-invaders example以了解它如何使用Mesh,OpenGL和SpriteBatch。(我认为这个例子是先于Scene2d的,所以没有那个...)。此外,值得看一下这些类的实现,以了解它们在内部做些什么。


嗯,谢谢。现在我看到了区别=)。只有一个最后的问题:哪种碰撞检测更好?Box2D、Intersector还是其他我不知道的? - Cristiano Santos
1
“Intersector”拥有您自己进行碰撞检测所需的所有工具。Box2D将执行碰撞检测,但它是完整的2D物理模拟,因此它会做更多的事情。如果您只是将子弹与敌人(或玩家与地板)相交,那么最好自己编写代码。 - P.T.
@P.T. 当你必须不断检查N颗子弹和M个敌人之间的碰撞时,自己编写可能并不容易,特别是当这些数字不小的时候...而且正确地阻止玩家在地板和墙壁上移动也不是那么容易做到的。 - Display Name

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接