第三阶段:
目标:实现水平方向和竖直方向上的碰撞,更具有真实感。
1:要想解决水平方向的碰撞,就要先明确一个问题,地图上的哪些东西是不可以穿过的,也就是说要先定义好地图上的某些可供碰撞检测的物体砖块类型。如图:
水平检测函数的开头准备工作:
为了简化水平方向的检测,由于马里奥的锚点是中心位置,所以左右两边的检测都是采用左边和右边的中点位置来代替的。在图中的两个条件判断是为了检测马里奥是否迟到了变大蘑菇和奖人蘑菇。
上图中的倒数第三句是做GL坐标和砖块坐标的转换,这个很重要,因为游戏采用的是GL坐标系,但TMX地图中采用的是砖块坐标,要将马里奥在游戏中的坐标转换成砖块坐标,然后再通过上图中的最后一句求出当前砖块坐标下的砖块类型,并做开关语句的判断:
在上图中可以看到哪些砖块是接受水平方向碰撞检测的,哪些是不用的。当遇到障碍物时,虽然马里奥有行走动画,但是位置不能移动,一直停留在障碍物的前面。
以上展示的全部是马里奥右侧的检测过程,左侧和右侧同理。
2:竖直方向上的碰撞检测实现,以及站在地图梯子上的左右平移和跳跃不跟随实现:
竖直方向上的检测函数的开头:
第一个条件句马里奥掉入了陷阱里,就死亡,不必进行下面的检测。第二个条件句是控制马里奥的头顶不出地图区域。
游戏中马里奥在竖直方向上要能够踩砖块的边缘,如图:
这种效果就不能一股脑的用马里奥的脚下中点作为检测点了,应该把检测的代码放到一个循环里,从马里奥的左下角到右下角,如果发现可以站立,那么就可以站立,退出循环。其余的部分和水平方向上的是一直的。
竖直方向上的检测有马里奥落地检测和向上跳跃时头顶到砖块落下的检测之分,上图中的是后者情况区别是当前的JumpOfffset正负号,当JumpOffset为正,说明马里奥在起跳阶段,反之就在下落阶段。
马里奥的下落检测和上面的没什么区别。
最后是马里奥站在梯子上的检测以及跟随梯子移动。因为梯子是通过地图摆放对象的方式实现的,在CCGameLayer中有一个梯子的数组,里面存储了所有的梯子,梯子有上下移动或是左右移动的移动分量数值,还有梯子的长度数值,因为梯子都是安放在腾空的地方,所以马里奥不可能头顶到梯子,所以梯子的检测只有马里奥下落的情况。在update函数里的关于检测梯子的代码片段:
原文地址:http://blog.csdn.net/zlhy_/article/details/37914763