|
发表于 2004-8-13 11:14:00
|
显示全部楼层
Re:ARPG中角色之间互动如何判断
碰撞检测的方法很多,我只写一个自己接触过的方法,物件索引表法:也就是楼主的第二种方法。
如果地图是按照格子的,且一个格子内只有一个物件,就根据地图格子生成同比大小的一张索引表(如Array[64][64])。
循环内部:
1清空索引表。
2物件逻辑-》将物件按照自己的位置把ID或者指针存入这个索引表。
3碰撞检测时只要知道碰撞所发生的位置(如14,17),就可以在索引表内唯一对应到某个Cell内(Array[14][17]),这时查找此Cell内存储的数值是否为0,如果不为0,就是物件的ID或者指针。指针可能会方便一些,但是ID更加安全。
但是如果不按照格子来组织呢?或者地图很大呢?
例如地图1280X1280,我们可以这样生成一个Cell表:10X10为一个Cell,每一个Cell内部放一个物件链表。
循环内部:
1,物件按照位置和上一步的位置更新Cell
如一个物件从0,0Cell到了0,1Cell,就把自己的指针从Cell[0][0]的链表中清掉,放入Cell[0][1]的物件链表中。如果没有跨越Cell,就不变。
2,物件需要做碰撞检测时,按照如下方式:
根据物件所处的Cell和碰撞要求,在本Cell及邻近Cell内遍历物件链表,对物件链表中的每一个物件做碰撞检测。
例如物件绝对坐标是125,125,就是在Cell[9][9]内,那么会发生什么情况呢?如果碰撞不需要越界(不是爆炸性质的碰撞),则只在Cell[9][9]内部遍历链表检测碰撞就可以了,但如果是需要越界,那就需要算上邻近的Cell了。边界和边角的也需要考虑越界。
这样的办法有些拙劣,期待更好的方法。
PS:ARPG的物件碰撞不仅仅考虑的是角色,可能更多需要考虑的是“飞行道具”例如魔法、弓箭等。如果要求比较低一些,最好能绕过这些飞行道具的实时检测。
|
|