SpaceManager中自定义物体运动碰撞的监测
在SpaceManager中关于运动物体的碰撞监测卡了一上午,终于调了出来,mark一下。
情况是这样的,除了通过SpaceManager模拟物体在物理世界的运动外,还有一个Enemies类的运动轨迹需要自己定义,这个也好办,
schedule定义就是了。
- (void)enemiesMoving:(ccTime)dt { CGPoint end = [[[_enemy stepArray] objectAtIndex:[_enemy curPointNum]+1] CGPointValue]; CGFloat disX,disY; float dis = [self distanceBetweenTwoPoints:_enemy.position toPoint:end]; if (dis < 3) { _enemy.curPointNum = _enemy.curPointNum + 1; _enemy.position = end; _enemy.rotation = [Utils getRealMoveDurationWithLocation:[[[_enemy stepArray] objectAtIndex:[_enemy curPointNum]] CGPointValue] withPosition:[[[_enemy stepArray] objectAtIndex:[_enemy curPointNum]+1] CGPointValue] withContentSize:_enemy.contentSize]; }else{ //disX = end.x - start.x; //disY = end.y - start.y; //enemy.position = CGPointMake(enemy.position.x+disX*dt/3 , enemy.position.y+disY*dt/3); disX = end.x - _enemy.position.x; disY = end.y - _enemy.position.y; if (dis > 150) { _enemy.position = CGPointMake(_enemy.position.x+disX*dt/3, _enemy.position.y+disY*dt/3); }else if(dis > 50){ _enemy.position = CGPointMake(_enemy.position.x+disX*dt/2, _enemy.position.y+disY*dt/2); }else{ _enemy.position = CGPointMake(_enemy.position.x+disX*dt, _enemy.position.y+disY*dt); } } //_enemy.shape->body->p = cpv(_enemy.position.x,_enemy.position.y); }
OK,问题来了,Bomb发出后应该是通过addCollisionCallbackBetweenType监测到和enemy碰撞的,可是经常撞上了没有反应,直接飘过去了。
有时候明明没有碰到enemy确监测到了碰撞。
开始是猜测,可能是body的position和enemy的不同步导致,于是研究cpBodyUpdatePosition这个函数,用之还不对。于是来了更暴力的,
直接同步body的位置_enemy.shape->body->p = cpv(_enemy.position.x,_enemy.position.y),还是不行。
在国外论坛上泡了许久,终于发现一个smgr里面一个rehash...属性,救命稻草啊。
用之,完美。