《超级玛丽》3



第三阶段:

目标:实现水平方向和竖直方向上的碰撞,更具有真实感。

1:要想解决水平方向的碰撞,就要先明白一个问题,地图上的哪些东西是不能够穿过的,也就是说要先定义好地图上的某些可供碰撞检測的物体砖块类型。如图:

水平检測函数的开头准备工作:

为了简化水平方向的检測,因为马里奥的锚点是中心位置,所以左右两边的检測都是採用左边和右边的中点位置来取代的。在图中的两个条件推断是为了检測马里奥是否迟到了变大蘑菇和奖人蘑菇。

上图中的倒数第三句是做GL坐标和砖块坐标的转换,这个非常重要。由于游戏採用的是GL坐标系,但TMX地图中採用的是砖块坐标,要将马里奥在游戏中的坐标转换成砖块坐标。然后再通过上图中的最后一句求出当前砖块坐标下的砖块类型,并做开关语句的推断:

在上图中能够看到哪些砖块是接受水平方向碰撞检測的。哪些是不用的。当遇到障碍物时,尽管马里奥有行走动画,可是位置不能移动,一直停留在障碍物的前面。

以上展示的所有是马里奥右側的检測过程,左側和右側同理。

2:竖直方向上的碰撞检測实现,以及站在地图梯子上的左右平移和跳跃不尾随实现:

竖直方向上的检測函数的开头:

第一个条件句马里奥掉入了陷阱里,就死亡,不必进行以下的检測。第二个条件句是控制马里奥的头顶不出地图区域。

游戏中马里奥在竖直方向上要可以踩砖块的边缘,如图:

这样的效果就不能一股脑的用马里奥的脚下中点作为检測点了。应该把检測的代码放到一个循环里,从马里奥的左下角到右下角,假设发现能够站立,那么就能够站立。退出循环。其余的部分和水平方向上的是一直的。

 

竖直方向上的检測有马里奥落地检測和向上跳跃时头顶到砖块落下的检測之分,上图中的是后者情况差别是当前的JumpOfffset正负号。当JumpOffset为正。说明马里奥在起跳阶段。反之就在下落阶段。

马里奥的下落检測和上面的没什么差别。

最后是马里奥站在梯子上的检測以及尾随梯子移动。由于梯子是通过地图摆放对象的方式实现的。在CCGameLayer中有一个梯子的数组,里面存储了全部的梯子,梯子有上下移动或是左右移动的移动分量数值,还有梯子的长度数值,由于梯子都是安放在腾空的地方。所以马里奥不可能头顶到梯子,所以梯子的检測仅仅有马里奥下落的情况。

update函数里的关于检測梯子的代码片段:

 

posted @ 2017-07-15 20:21  yxysuanfa  阅读(273)  评论(0编辑  收藏  举报