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...属性,救命稻草啊。

用之,完美。


 

 

posted @ 2012-05-04 00:41  Andy Wang  阅读(196)  评论(0编辑  收藏  举报