var pt:Point=PPCD.getCollisionPoint(this.blk, map, mapCon);
复制代码
要知道man在哪个方向、多远距离碰到了障碍,只需要比较man的坐标(x, y)和pt的坐标(pt.x, pt.y)就行了。这里对这两个点的坐标作差:
var dx:Number=pt.x-this.x;
var dy:Number=pt.y-this.y;
使用dx和dy的方便之处在于它们的符号就代表着碰撞发生的方向。为了以后算法的方便,还有两个变量分别保存上一次碰撞时的dx和dy。当没有碰撞时,这两个值将被清零:
var dxl:Number=0;
var dyl:Number=0;
注意,若仅在x轴向做运动时,pt.x最多只会在C图的位置。换句话说,dx的绝对值应该大于等于w,其中w的定义为:
var w:Number=(width-step)/2;
同理也有var h:Number=(height-step)/2;
这在后面判断“擦边”运动时会用到。另外,因为blk放进了man里,所以这里man的width和height属性其实就别是blk的宽和高。
好了,现在开始正题,碰撞检测。
原理很简单:碰撞肯定是由人物向某个方向(这里假定为x负方向,如情况A所示)运动产生的。为了检测方便,先引入两个变量来存放当前人物的运动方向:
var dirxl:int=sign(dirx);
var diryl:int=sign(diry) ;
其中sign(n)是符号函数,n为正返回1,为负返回-1,等于0则返回0。这两个变量也将在没有碰撞时被清零。