[url]http://bbs.9ria.com/thread-72990-1-1.html[/url]
看到过很多版本的深度排序算法,效果各不相同,有的局限性也很大,我以前使用的是根据y轴来排序的,这是最普通快捷的方法,同时也是局限新最大的,显然已经不再适合现在的游戏开发了。
这里介绍的是一种基于向量的深度排序算法,这种想法早在几个月前就有了,只是当时是停留在概念阶段,可行性是个未知数。不过现在看实现的效果,还是挺不错的,只要别把建筑摆得跟马蜂窝一样就出不了什么bug。
下面是效果图
[img]http://dl.iteye.com/upload/attachment/404176/dec9715d-e576-3f1c-a81f-219846da23ce.jpg[/img]
原理是这样的。
拿生活中的一个普通的建筑来说,我们总能找到一个面,在这个面的后面的东西会被遮挡住,在这个面前面的东西会遮挡住这个建筑。像这张图一样。
[img]http://dl.iteye.com/upload/attachment/404177/03d26bbf-0e2d-3350-94c9-c680117a8bbe.jpg[/img]
在上面的图中,在红色平面后面的东西会被建筑遮挡住,而在红色平面前面的东西会遮挡住这个建筑。
由于我们这里是2d的所以可以把面简化成线。(把面投影要地面上)
[img]http://dl.iteye.com/upload/attachment/404180/ff1cbe71-34e4-3c9b-91b2-bd60487436fd.jpg[/img]
下面我们把游戏中的人物想象成一个点。如果这个点在直线的后面,那么就会被建筑遮住,反之人物遮住建筑。
思路有了,具体该怎么判断呢。
[img]http://dl.iteye.com/upload/attachment/404182/93165068-a791-38ea-ad65-1bd867b7ad3e.jpg[/img]
蓝色的点就表示人物,两个箭头表示两个矢量,如果你熟悉矢量的话,就知道该怎么办了。两个矢量a、b是可以算出,b是在a的顺时针方向,还是逆时针方向的。上面这张图很显然b在a的顺时针方向,所以人遮住建筑。
人物的判断很简单,那么两个建筑怎么判断遮挡关系呢。
其实道理是一样的,只是建筑有两个点,所以这里有了三个矢量,可以通过判断两个黄色的矢量和蓝色矢量个关系就可以判断出两个建筑的遮挡关系了
[img]http://dl.iteye.com/upload/attachment/404184/097d413e-2450-36a0-8b97-263f154dc3de.jpg[/img]
基本的思路介绍就到这里。
这种算法的好处是,她不是基于地图网格的,而是基于像素,所以适用于任何类型的地图,正交、菱形、六边形通吃。
还有一个点,以前我们要在地图上放置一个门的时候,人物可以从门下穿过,那么只能把门切开来,现在这种算法就不需要这么做了。
上面的介绍是仅是提供一个可行的思路。
Vector2D.as
看到过很多版本的深度排序算法,效果各不相同,有的局限性也很大,我以前使用的是根据y轴来排序的,这是最普通快捷的方法,同时也是局限新最大的,显然已经不再适合现在的游戏开发了。
这里介绍的是一种基于向量的深度排序算法,这种想法早在几个月前就有了,只是当时是停留在概念阶段,可行性是个未知数。不过现在看实现的效果,还是挺不错的,只要别把建筑摆得跟马蜂窝一样就出不了什么bug。
下面是效果图
[img]http://dl.iteye.com/upload/attachment/404176/dec9715d-e576-3f1c-a81f-219846da23ce.jpg[/img]
原理是这样的。
拿生活中的一个普通的建筑来说,我们总能找到一个面,在这个面的后面的东西会被遮挡住,在这个面前面的东西会遮挡住这个建筑。像这张图一样。
[img]http://dl.iteye.com/upload/attachment/404177/03d26bbf-0e2d-3350-94c9-c680117a8bbe.jpg[/img]
在上面的图中,在红色平面后面的东西会被建筑遮挡住,而在红色平面前面的东西会遮挡住这个建筑。
由于我们这里是2d的所以可以把面简化成线。(把面投影要地面上)
[img]http://dl.iteye.com/upload/attachment/404180/ff1cbe71-34e4-3c9b-91b2-bd60487436fd.jpg[/img]
下面我们把游戏中的人物想象成一个点。如果这个点在直线的后面,那么就会被建筑遮住,反之人物遮住建筑。
思路有了,具体该怎么判断呢。
[img]http://dl.iteye.com/upload/attachment/404182/93165068-a791-38ea-ad65-1bd867b7ad3e.jpg[/img]
蓝色的点就表示人物,两个箭头表示两个矢量,如果你熟悉矢量的话,就知道该怎么办了。两个矢量a、b是可以算出,b是在a的顺时针方向,还是逆时针方向的。上面这张图很显然b在a的顺时针方向,所以人遮住建筑。
人物的判断很简单,那么两个建筑怎么判断遮挡关系呢。
其实道理是一样的,只是建筑有两个点,所以这里有了三个矢量,可以通过判断两个黄色的矢量和蓝色矢量个关系就可以判断出两个建筑的遮挡关系了
[img]http://dl.iteye.com/upload/attachment/404184/097d413e-2450-36a0-8b97-263f154dc3de.jpg[/img]
基本的思路介绍就到这里。
这种算法的好处是,她不是基于地图网格的,而是基于像素,所以适用于任何类型的地图,正交、菱形、六边形通吃。
还有一个点,以前我们要在地图上放置一个门的时候,人物可以从门下穿过,那么只能把门切开来,现在这种算法就不需要这么做了。
上面的介绍是仅是提供一个可行的思路。
Vector2D.as