关于多人物场景下遮挡关系的思考

来源:互联网 发布:豆角台剧网下载软件 编辑:程序博客网 时间:2024/04/28 02:13

原文出自:http://blog.csdn.net/blacksource/article/details/3894192

问题描述:
假设一张地图中有事先摆好的30个建筑,10个npc,20个游戏玩家。我们需要让每个人物在行走的时候处理正确的遮挡关系。

前提条件:
建筑和NPC的层级在地图制作的时候是已经拍好顺序的,而且保证顺序正确。
人物类已经写好,提供了移动到某点、换装的方法

要求:
给人物类的移动方法增加一个处理过程,让人物在行进中(ENTER_FRAME)随时调整自己的层级。

分析:
以上问题我们需要有几点考虑

1、人物在创建的时候是否需要让他找到自己正确的层级
2、如何知道人物行进中应该跟谁比较层级
3、比较的时候谁在上谁在下

对于第一点,我的想法是最好能够把他放到正确的层级上。至少这样做了以后对于,后面只要对发生碰撞的两个物体比较,就可以保证地图上所有参与遮挡的 物体依然是个有序的。这一点我在做地图编辑器的时候已经用到了,类似于暴力排序——首先将所有的物体根据屏幕Y值粗排序,然后把所有的物体两两对比是否发 生碰撞,一旦发现有碰撞并且顺序不对马上调整并且又从头开始重新两两对比,直到所有的顺序正确。

这种暴力排序的方式不可能随时随地比较,但是一旦完成就可以保证所有物体顺序正确。以后创建的对象只要和跟他发生碰撞的物体比较就行了。

对于第二点,我跟很多朋友讨论过。貌似只有遍历显示列表通过hitTest来获取到应该跟谁来比较层级。但是我们知道如果每一个人物在行进中都去遍历所有对象肯定会对效率有影响,所以我们必须来做一些优化。

如何优化?
游戏中一张地图通常都会比较大,最少也会有4个屏幕大小。我们自己的地图尺寸在8000*8000以上,差不多有100屏了。但是我们一般都会做这样的处理,把屏幕中暂时没有必要显示的建筑和NPC先移除,需要的时候我们再加载。

这样,我们只要对屏幕中可以看到建筑或者人物做遍历就行了,这实际上就是我想说得优化。

问题到这里似乎已经解决了,是的基本上已经解决了。不过需要提醒的是移除我们不能用removeChild而需要将没有必要显示的对象的visible设置为false。为什么?因为如果你removeChild再AddChild,那么你之前做好的排序就会全都乱套。

有了上面的思路我们看一下具体的做法:
1、创建一个Object对象 visibleList来记录所有visible=true对象的引用。
2、为负责随时移除和加入建筑的侦听器增加一些代码,随时更新visibleList中的数据。
3、每一个人物类都只对visibleList中存在的对象进行hitTest

对于第三点不打算再说了,天地会中曾经有专门的帖子进行过讨论。

最后的补充:
上面只是一个简单的优化。实际上对于更新visibleList的那个侦听器,也可以有一些办法来优化。我们可以把一张地图分成多个区域。把每个区域中存在的物体先记录下来,然后根据当前的屏幕占用了地图的哪几个区域,光遍历占用区域中的对象。

原创粉丝点击