游戏开发者社区

[游戏编程] 斜45度下物体遮挡关系的判定例子

查看: 15496|回复: 34

Rank: 5Rank: 5

威望
40 点
义气
42 点

AQ小生 六角金星勋章

发表于 2008-4-9 09:19:26 |显示全部楼层
上次看到一篇关于斜视角下物体遮挡关系的帖子,大家都说用碰撞检测来实现。
而我总觉得应该单独做一个针对显示列表操作的方法会更好一些。花了一点时间做了一个例子供大家参考。
基本思路如下:
我们知道显示列表是AS3的一个新属性,好处是他能够自动管理。我们可以把要显示的物体先准备好,再决定怎么放。
斜视角下的遮挡关系其实是比较好判断的,关键就是需要把屏幕坐标转换为游戏坐标。
如果我们知道了物体的四个顶点的游戏坐标就可以很快的判断出谁在上谁在下。
下一步就是把显示列表里面的物体根据游戏坐标排一下顺序就行了。
排序的时候不能直接对显示列表操作,必须先用一个数组将显示列表里面的物体先记录下来,然后对数组根据条件排序。

[ 本帖最后由 闪刀浪子 于 2008-4-10 10:59 编辑 ]

遮挡关系测试.rar

24.07 KB, 下载次数: 670, 下载积分: 银子 -1 两

本例的源文件。

本帖评分记录:1人评分    银子+6 
wizim 银子 + 6 鼓励教程

举报

Rank: 6Rank: 6Rank: 6

威望
31 点
义气
22 点

AQ小生 六角金星勋章

发表于 2008-4-9 11:55:38
拖动的话,很容易有BUG的,因为不知道什么时候是放在前面,什么时候是放在后面,在一个平面上移动的话就比较好判断了

点评

chongtianfeiyu  我也遇到过。。  发表于 2014-4-29 23:48:51

举报

Rank: 6Rank: 6Rank: 6

威望
1 点
义气
6 点
发表于 2008-4-9 15:39:11
怎么DNS解折错误啊 /??

举报

Rank: 5Rank: 5

威望
40 点
义气
42 点

AQ小生 六角金星勋章

发表于 2008-4-10 10:59:45
昨天发的链接已经失效了,我已经把源文件重新上传了。

举报

Rank: 4

威望
0 点
义气
5 点
发表于 2008-4-29 14:50:36
看了一下,其实45度角的深度说简单也不简单~

举报

Rank: 4

威望
0 点
义气
5 点
发表于 2008-4-29 14:51:19
看一下我的Blog中关于45度的深度排序就知道了: http://blog.37studio.net/?action=show&id=20

举报

Rank: 5Rank: 5

威望
40 点
义气
42 点

AQ小生 六角金星勋章

发表于 2008-5-1 00:51:10
wills,看了你的思路。原理上都差不多。只是你写的有些复杂,不知道你的两个点是如何定义的。
我把我的思路说一下。见下图。
A物体和B物体比较。如果B物体的任意一个点在A物体的红色区域,则B在上,A在下。
代码如下
  1. public static function CompareLevel (a:BaseSprite,b:BaseSprite):Boolean
  2.                 {
  3.                         if (a.leftpoint.y<b.rightpoint.y&&a.leftpoint.x>=b.rightpoint.x)
  4.                         {
  5.                                 return true;
  6.                         }
  7.                         else if (a.rightpoint.y<=b.leftpoint.y&&a.rightpoint.x>=b.leftpoint.x)
  8.                         {
  9.                                 return true;
  10.                         }
  11.                         else
  12.                         {
  13.                                 return false;
  14.                         }
  15.                 }
复制代码
代码说明:如果A物体在下返回true,否则返回false;
不过我的这个方法必须避免底面积重叠,否则无法得出正确的层级。
所以实际中我还会对底面积是否已经占用做判断。

[ 本帖最后由 闪刀浪子 于 2008-5-1 00:57 编辑 ]
示意图.png

举报

Rank: 4

威望
3 点
义气
5 点
发表于 2008-5-30 15:57:12
你这个算法肯定有问题,排序的时候,要注意几点:
1、A和B比较的结果看看是不是跟B和A比较的结果一样?
2、有没有可能出现B比A大,C比B大,而C又比A小的矛盾结果?
你试着放多几个模型上去,bug就出来了

举报

Rank: 5Rank: 5

威望
40 点
义气
42 点

AQ小生 六角金星勋章

发表于 2008-6-3 17:28:17
楼上说的bug已经解决了。
排序逻辑是
1、按照屏幕Y坐标排序
2、把所有的物体两两比较,如果产生遮挡关系则比较一下
3、从头开始重新排序(从第二步开始)
4、一直到每一个物体都有了唯一的位置序列。

举报

Rank: 2Rank: 2

威望
0 点
义气
5 点
发表于 2008-6-5 01:22:51
有拐角形状(L形),是不可能做出算法来的,因为当L开口朝左或者右时,则放置一个最小单元矩形物体填充到L的中间就会产生嵌入效果,这个时候要正确实现遮挡必须要把L形物体分拆。L形的一边挡住了矩形块,而另一边则被举行块挡住了。凑个热闹。

举报

Rank: 5Rank: 5

威望
40 点
义气
42 点

AQ小生 六角金星勋章

发表于 2008-6-5 09:27:55
确实不能正确得出,必须寻找一种更完美的解决方案

举报

Rank: 3Rank: 3Rank: 3

威望
0 点
义气
10 点
发表于 2008-6-6 14:38:31
还是看不大懂,有源码会好点

举报

Rank: 3Rank: 3Rank: 3

威望
3 点
义气
11 点
发表于 2008-6-7 22:34:45
http://www.flex3.net/2008/04/25/ ... o+de+fang+jian.aspx
这是我模拟新仙剑奇侠传的一个场景的DEMO.里面就解决了斜45度人物遮挡的问题,可以参考参考.

举报

Rank: 1

威望
0 点
义气
5 点
发表于 2008-7-31 10:32:41
L型的就要切图了。

楼上搞的不错。

深度切换其实也就是:
所有块根据其y坐标与高度将深排列一次(初始化深度),然后将每一个块与其发生碰撞的块加入临时数组,再重新排列
http://www.flashflex.net/game/test/xiaoyao_wu_map_test_grid.swf
http://www.flashflex.net/game/test/xiaoyao_wu_map_test_2.swf
开ps手工搞了一下,概楼上图一样。07年3月份玩的。。

点击移动李逍遥

举报

Rank: 14Rank: 14Rank: 14Rank: 14Rank: 14

威望
43 点
义气
11 点

AQ小生 退役舵主 紫带金边向日葵勋章 六角金星勋章 蓝色海洋水心勋章

发表于 2008-7-31 12:20:20
路过并学习

举报

您需要登录后才可以回帖 登录 | 注册

关闭

江湖传闻

手机版|9RIA.com ( 京ICP备11007422号-2 

GMT+8, 2017-7-28 14:53 , Processed in 0.136897 second(s), 24 queries .

Powered by Discuz! X2

© 2001-2011 Comsenz Inc.

回顶部