【干货】制作 oblique/cabinet 投影的 2D 游戏时,确认精灵先后顺序的排序方法( 二 )


文章图片
带有弧线的那一端是射线的末端 , 末端的物体比首端的物体更先渲染(位置更靠后) 。
这里说明一下 , 我们只对需要排序的一对物体进行连线(出于性能考虑) , 所以你的显示对象可能需要有相应的bounding_box或是什么的 。

【干货】制作 oblique/cabinet 投影的 2D 游戏时,确认精灵先后顺序的排序方法
文章图片
当场景中的物体足够多 , 遮挡关系足够复杂时 , 不难发现 , 我们的物体遮挡关系实际上构建出了一个有向图 。 而有向图可以通过拓扑排序来获取一个不唯一的线性序列 , 照着这个线性序列进行渲染就可以获得正确的场景排序了 。

【干货】制作 oblique/cabinet 投影的 2D 游戏时,确认精灵先后顺序的排序方法
文章图片
(图中蓝绿色的矩形是判断精灵相交/重叠用的bounding_box , DRAWIDX则是拓扑排序后得到的渲染顺序值)
这样 , 就得到了整个场景的正确呈现顺序 。
最后一点问题
相信我们都看到过一些"视觉错觉"的趣味图片 , 对吧?譬如三个无限循环的台阶 , 相互遮挡的三个棱柱……之类的 , 很有意思 , 不过在游戏开发当中可一点也不有趣 。 很显然 , 当游戏场景中出现了几个互相存在遮挡和被遮挡关系的对象时 , 我们构造出的有向图就成环了 。 而成环的有向图是不能进行拓扑排序的 , 这就导致我们没有办法去按正确顺序呈现画面 。 解决这个问题的最好方法就是把容易引起该问题的那个物体分割为两个物体 , 使得其中的一个部分"专门遮挡"而另一个部分"专门被遮挡" , 这样就可以消除我们构造的有向图中的环 。
本次的讨论就到这里 , 祝大家开发顺利 , 新年快乐!