LibGDX中的纹理渲染顺序

3
我正在将一款游戏从iOS和Windows Phone移植到Android。我正在遵循大部分的代码来自于Windows Phone版本的规则,这是因为它与Java最相似。我的问题涉及到LibGDX中的OrthographicCamera类。
我使用了“游戏对象作为组件容器”的方法来制作这个游戏。你可以在这里阅读相关信息:http://cowboyprogramming.com/2007/01/05/evolve-your-heirachy/,以便你了解我在谈论什么。所以,几乎所有游戏中的内容都扩展了组件组件类。每个游戏对象,比如一个球,都是由组件组成的GameObject,例如Sprite、RigidBody(用于物理)、Transform2(位置、旋转等)。这包括Camera2类,它只是包装了一个OrthographicCamera成员。
我有两个问题,我已经做了大量的研究却没有找到答案。我无法弄清楚如何进行分层。游戏有一个抽屉,用户可以向下滑动以打开。这应该在游戏中处于最上方。XNA版本的开发人员实现这一点的方式是通过具有多个SpriteBatches并将每个SpriteBatch视为一个图层。这在LibGDX中行不通,而且使用多个SpriteBatches是不好的实践。问题在于,游戏对象按照树的遍历方式组织,并且它们的渲染顺序基于将对象插入到树中的时间。我已经研究了DecalBatch,这样我就可以使用Z顺序,但这需要大量的重构,因为游戏已经非常接近完成了。正如我所说,我尝试使用多个SpriteBatches,但由于某种原因这也行不通。
由于这已经是一篇很长的文章了,我会在另一篇文章中问我的第二个问题。

你正在使用Stage吗?那么你可以创建另一个Stage或将东西添加到你的Stage中的窗口。 - Matsemann
我实际上联系了Mario(LibGDX的主要开发人员之一)关于Scene2D的问题(Stage是基于它构建的),他说我不应该将其用于除UI之外的任何更复杂的游戏。但是,这可能是一个想法,也许只需为抽屉使用一个舞台。我会研究一下这个。 - weaverx9x9
我认为在这个阶段添加一个Stage会过于复杂。虽然我认为它可能有效,但是需要进行大量的重构。我在Google Code上找到了一个LibGDX的待办事项清单,其中他们已经将z-order添加到sprites中。这是0.9版本清单中的必须项。不过我觉得它还没有完成。 - weaverx9x9
是的,如果你还没有使用它,请不要现在添加阶段。我的建议只是“如果”你正在使用阶段。 - Matsemann
是的,我考虑过了,听起来像我需要的东西,但Mario说它对于完整的游戏来说不够健壮。 - weaverx9x9
1个回答

5

我解决了这个问题。我向来自LibGDX的Mario发送了一条消息,他建议在渲染之前对对象进行排序。我不太确定如何做到这一点,因为它在树中,我知道如何对树进行排序,但是没有排序的顺序。我添加了一个层字段,并使GameObject类实现Comparable接口,然后在访问者模式的accept方法中,我按照它们的层对所有节点的子级进行排序。现在它完美地工作了。


1
如果你有大量的小对象,这可能会对性能产生巨大的影响,请注意。 - Oliver Dixon

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