【问题标题】:LibGDX Stage vs SpriteBatch to draw the GameLibGDX Stage vs SpriteBatch 绘制游戏
【发布时间】:2014-04-12 15:03:16
【问题描述】:

我在 LibGDX 中的绘图有一个大问题。首先,我不会在我的游戏中使用所有物理或其他复杂的东西。我只绘制精灵并在此放置矩形以进行碰撞检测。我的游戏中有 3 个屏幕:启动画面、菜单和游戏。所以我在启动画面和菜单屏幕中使用了一个舞台,但如果我在游戏中也使用舞台或者我用 SpriteBatch 绘图,我真的不会?舞台在动作方面确实有优势,但使用演员有点复杂。还有其他方法可以做到这一点吗?我不想使用 World,因为它会使游戏开发的开始变得复杂。 我想在游戏中使用什么?

【问题讨论】:

    标签: java 2d libgdx game-engine game-physics


    【解决方案1】:

    实际上你总是用SpriteBatch 绘图,因为Stage 使用它自己的SpriteBatch。如果你认为你可能需要Scene2ds Stage 的一些优点,比如Actions、Groups 或其他东西,你应该使用Stage。在我看来,它真的很容易使用。您有自己的对象,它们扩展 ImageActor,覆盖它们的 update(delta) 方法,您可以在其中检查 Actor 是否应该移动(按键或 AI 的事件)。此外,您应该在那里检测碰撞并注意它们。然后,如果你扩展Image,你不需要关心绘图(但Image需要Drawables,所以你会遇到Animations的一些问题),如果你扩展Actor覆盖draw(SpriteBatch batch),您拨打batch.draw(...)。 而已。 Stage 的一大缺点是排序。 Actor,首先被绘制在背景中。最后一个Actor 透支了所有其他人并位于前台。您可以使用 z-Index 对它们进行排序,但不确定。 所以你可能决定使用你自己的Stage(它或多或少是一个列表,包含所有Actors,当updatedraw被调用时,它会为每个Actor调用此列表),并在那里添加您自己的排序。 这取决于你的游戏设计、你的观点和你的风格。查看一些教程/示例,然后决定如何创建游戏。

    【讨论】:

    • 第二个很棒的答案,但更多细节,这对我有很大帮助;)
    • 我使用 Scene2D 只是为了使用 EventListener 几乎没有开销。
    【解决方案2】:

    您可以使用任何一种,这取决于您要创建的游戏类型。但无论如何,不要创建多个 SpriteBatch 实例——而是只创建一个并将其传递给Stage 构造函数,因为它是重对象。 (是的,Stage 在后台使用 SpriteBatch
    此外,如果您需要任何屏幕控件(按钮、操纵杆等),Stage 可能会非常有用,因为您可以使用来自scene2d.ui 的类并且不要重新发明轮子(有些轮子不太容易正确地重新发明)

    【讨论】:

    • 我有一个问题,做多个 batch.begin() 和 batch.end() 成本高吗?我问是因为在你完成 spritebatch 之后,你必须调用 batch.end() 并且在 Stage 的源代码中,它再次调用了 batch.begin() 和 batch.end()。
    • @EnesBattal 我无法给出确切的答案。这绝对是昂贵的,因为 batch.end() 大概将命令发送到 GPU,但实际上,如果每帧使用 2 次,它不会造成太大的伤害,在这种情况下,这是一个必要的邪恶(否则需要使用更复杂的抽象,或者在较低级别上进行所有绘制)
    猜你喜欢
    • 1970-01-01
    • 2012-10-03
    • 2018-09-13
    • 1970-01-01
    • 2018-04-14
    • 1970-01-01
    • 2011-06-09
    • 1970-01-01
    • 2013-12-04
    相关资源
    最近更新 更多