cocos2dx重力感应中的碰撞检测以及对墙角模型的完善检测

前端之家收集整理的这篇文章主要介绍了cocos2dx重力感应中的碰撞检测以及对墙角模型的完善检测前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

最近在做一个游戏,利用重力感应控制角色移动,避开危险物(怪物,危险地形等),最后到达终点即可胜利。

一开始有2个主要想法:1.使用自带的物理引擎实现 2.自己写碰撞检测,不使用引擎

对物理引擎没怎么使用过,且对于多边形刚体的定形定位也不好弄,mac中有VertexHelper这款软件,可以简单的建立多边形,输出顶点信息,但我是win系统。

基本的重力感应初始化工作就不谢了,在onAcceleration(Acceleration* acc,Event* unused_event)中写重力感应回调函数。在这其中发现了几个问题:

1.我需要将role不停得与怪物monster检测碰撞,role与monster都是运动的sprite,在onAcceleration()中使用for循环检测与每个monster是否碰撞时,在真机上运行会崩溃,截图:

, Fetal signal 11错误信息,都与内存空有关。

即使在onAcceleration()中不用循环检测,单单写成role分别与monster1,monster2碰撞也会崩溃,着实的蛋疼,后来想想,是不是onAcceleration()函数调用过平凡,改成在update()函数中每帧检测碰撞,ok,可以了,因此,碰撞建议在schedule中每帧检测。

2.自己写的碰撞检测在遇到墙角处时判断错误,总结出来事只能和一面的墙壁做检测,而忽略了另外一面。我的碰撞检测是用intersectsRect()函数实现的,碰撞修复使用colFIx(COll_State),colFix(COll_State)使用根据coll_state的值判断role的哪一面与墙壁碰撞,如:COll_State = COLL_TOP,表示role的顶部与墙碰撞,截图:


可以看到,根据哪一面碰撞,colFix()只是将role往相反方向移动一点距离,避免role嵌套进墙壁中(上面代码是实现了墙角碰撞的代码)。 colFix(COll_State)只能检测一面墙,并且修复,当遇到墙角的地方,需要检测多面强时(最多上下左右4面),就不能了,所以要改为上面的代码函数变为colFix(COll_State[4],Rect Box[4]),参数1:四个方向是否碰撞,参数2:与之碰撞的墙壁。上面代码完整截图:

注意for循环,表示需要修复4个面的碰撞。并且修复一面之后使用continue继续。

3.另外,需要提一点,也就是把与墙壁碰撞写在onAcceleration()中后,需要把role位置更新写在roleCollisionWithWall()墙壁碰撞检测函数前面,若在roleCollisionWithWall()中先检测是否碰撞,若碰撞则修复,再更新role的position,这种情况下会出现role碰到墙壁后黏住不动的现象,需要注意。

猜你在找的Cocos2d-x相关文章