最近在做一个游戏,利用重力感应控制角色移动,避开危险物(怪物,危险地形等),最后到达终点即可胜利。
一开始有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的顶部与墙碰撞,截图:
注意for循环,表示需要修复4个面的碰撞。并且修复一面之后使用continue继续。
3.另外,需要提一点,也就是把与墙壁碰撞写在onAcceleration()中后,需要把role位置更新写在roleCollisionWithWall()墙壁碰撞检测函数前面,若在roleCollisionWithWall()中先检测是否碰撞,若碰撞则修复,再更新role的position,这种情况下会出现role碰到墙壁后黏住不动的现象,需要注意。