LibGDX舞台与SpriteBatch绘制游戏的比较

6

我在LibGDX中的绘制方面遇到了一个大问题。首先我没有在我的游戏中使用任何物理或其他复杂的东西,我只是绘制精灵并在其上放置Rectangle以进行碰撞检测。我在我的游戏中有3个屏幕:闪屏、菜单和游戏。因此,在闪屏和菜单屏幕中,我使用了一个舞台(Stage),但我不确定在游戏中是否也需要使用Stage,还是用SpriteBatch绘制? 舞台在行动方面确实有很多优点,但要使用演员(Actors)却有一点复杂。除此之外,还有其他方法可以解决这个问题吗? 我不想使用World,因为对于游戏开发的初学者来说太复杂了。 我想在游戏中使用什么?

2个回答

21

实际上,你总是使用SpriteBatch进行绘制,因为Stage使用了它自己的SpriteBatch。如果你认为可能需要Scene2dStage的一些优点,比如ActionGroup或其他东西,那么你应该使用Stage。我认为它非常容易使用。你有自己的对象,这些对象扩展了ImageActor,重写它们的update(delta)方法,在那里检查Actor是否应该移动(按下按键或AI事件)。此外,你应该在那里检测碰撞并处理它们。然后,如果你正在扩展Image,你不需要关心绘图(但是Image需要Drawable,所以你会遇到一些关于Animation的问题),如果你正在扩展Actor,则重写draw(SpriteBatch batch),在那里调用batch.draw(...)。 就是这样。 Stage的一个很大的缺点是排序。作为第一个绘制的Actor位于背景中。最后一个Actor覆盖了所有其他的Actor并位于前景中。你可以使用z-Index对它们进行排序,但是不是非常确切。 所以你可以决定使用自己的一种Stage(它更多或少是一个列表,包含所有Actor,当调用updatedraw时,它会针对这个列表中的每一个Actor被调用),并在那里添加自己的排序。 这取决于你的游戏设计,你的观点和你的风格。看一些教程/示例,并决定如何创建你的游戏。


第二个很棒的回答,但是提供了更多详细信息,这对我很有帮助 ;) - Fabian König
我使用Scene2D只是为了能够使用EventListener而几乎没有额外的开销。 - Jax

16

你可以根据游戏类型选择使用任何一种,但无论如何,请不要创建多个实例SpriteBatch——而是只创建一个并将其传递给Stage构造函数,因为它是一个重量级对象。(是的,Stage在幕后使用SpriteBatch)
此外,如果需要任何屏幕控制(按钮、操纵杆等),Stage可能非常有用,因为您可以使用scene2d.ui类,并且不必重新发明轮子(有些轮子很难恰当地重新发明)。


我有一个问题,做多个batch.begin()和batch.end()会很昂贵吗?我问这个问题是因为在你完成spritebatch之后,你必须调用batch.end(),而在Stage的源代码中,它再次调用batch.begin()和batch.end()。 - Buddy
1
@EnesBattal 我无法给出确切的答案。这肯定是代价高昂的,因为batch.end()可能会将命令发送到GPU,但实际上,如果每帧使用2次,它并不会对性能造成太大影响,在这种情况下,这是必要的(否则就需要使用更复杂的抽象,或在较低级别上进行所有绘图)。 - Display Name

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