搞了一段时间的深度排序,几经波折,看了网上相关的资源但是并没有一个完整的介绍,于是自己写了一个,不是很完善,分享出来,希望大家多扔砖块,多给建议,下面是我的思路:
1. 将物体的显示区域多边形、占用区域多边形[即物体在游戏坐标中的投影]勾出来.
2. 每一个物体中占用区域多边形中点集屏幕坐标y值最小的点为物体的zMin点,y值最大的点为物体的zMax点.
3. 先根据物体的zMin由小到大排序生成列表temp,并将temp复制一份列表为zIndex;
4. 从temp中取一个物体P出来,跟余下的物体Q比较:
a. P与Q发生碰撞;
b. (1)如果P的index小于Q的index,那么检测P所占用的多边形的游戏坐标是否在Q近视点的一侧;(2)或如果P的index大小Q的index,那么检测P所占用的多边形的游戏坐标是否在Q远视点的一侧;
5. 如果以上条件都满足,即要对P和Q的深度进行调整. 调整方法如下:
将标记flag设置为false, 在有序列表zIndex中,P和Q必有先后关系,遍历zIndex, 如果是因为4.b(1)条件的话,则在zIndex中找到P,并将标记flag设置为true, ,凡是遇到flag为true的物体其index都加1,由num记录有多少个物体加了1,直到遇到Q,遇到Q后将Q的index-num并退出遍历; 如果是因为4.b(2)的条件的话,刚好相板,在列表zIndex中,Q必在P之前,按上述操作,先找到Q,将标记flag设置为true,......
6. 调整完后,将列表zIndex按index重新排序.
7. 执行4直到temp中没有任何物体.
DEMO:
点击其中一个物体拖动即可.
Word教程网 | Excel教程网 | Dreamweaver教程网 | Fireworks教程网 | PPT教程网 | FLASH教程网 | PS教程网 |
HTML教程网 | DIV CSS教程网 | FLASH AS教程网 | ACCESS教程网 | SQL SERVER教程网 | C语言教程网 | JAVASCRIPT教程网 |
ASP教程网 | ASP.NET教程网 | CorelDraw教程网 |