(NO.00004)iOS实现打砖块游戏(八):游戏中小球与砖块的碰撞

大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处.

如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;)


现在回到GameScene.m中,我们所有的碰撞处理就放在该类中.我们首先要搞清楚什么会和什么碰撞.就目前来说,我们先来实现2中碰撞:小球和砖块的碰撞,以及小球和反弹棒的碰撞.

小球和砖块的碰撞:碰撞开始

我们知道一般物理引擎对于碰撞的处理不是一蹴而就的,它分为多个阶段.在Chipmunk中将碰撞按照时间的前后分为开始和后续两个部分;不是在所有的碰撞处理中都要关注这2个方法,一般只要关注开始碰撞的部分就可以了.但是在小球和砖块碰撞的处理中,我们还要关注后续的部分,因为有些代码不可以放在碰撞的开始部分.下面我们先来看看碰撞开始回调代码是如何写的:

-(BOOL)ccPhysicsCollisionBegin:(CCPhysicsCollisionPair *)pair ball:(CCNode *)ball brick:(CCNode *)brick{

    [_userInterface updateHitsLabel:[NSString stringWithFormat:@"Hits:%d",++_hits]];

    _score += ((Brick*)brick).value * _scoreRatio;
    if (_scoreRatio > 1) {
        [self updateMsgLabel:[NSString stringWithFormat:@"Score X %d",_scoreRatio]];
    }
    //小球没连续碰撞一次砖块,得分比率都会翻倍
    _scoreRatio *= 2;

    [_userInterface updateScoreLabel:[NSString stringWithFormat:@"得分:%d",_score]];

    [brick removeFromParent];

    @synchronized(self){
        [_level removeFromBricks:brick];
    }

    return YES;
}

代码不长,首先更新了游戏场景中的撞击计数,然后按不同砖块的分值更新玩家的得分,然后将砖块从场景中删除.注意,最后调用了我们之前在Level类中实现的removeFromBricks方法,因为我们必须要更新关卡的数组.

小球和砖块的碰撞:碰撞结束

我们希望在小球与砖块碰撞时增加它的反弹力,所以我们要调整小球的力矩,而调整物理对象的力矩不能再CollisionBegin中完成,否则物理引擎会抱怨了 ;[ ,我们自然将其放到碰撞结束部分中:

-(BOOL)ccPhysicsCollisionPreSolve:(CCPhysicsCollisionPair *)pair ball:(CCNode *)ball
                            brick:(CCNode *)brick{
    CGPoint velocity = ball.physicsBody.velocity;
    //略微增加小球的力矩
    [ball.physicsBody applyImpulse:ccpMult(velocity, 1.00005)];
    return YES;
}

注意我增加了一个特别微小的力矩值,因为力矩会在多次碰撞后快速累积,很快就会变得非常大,毕竟你也不想看到小球经过几次反弹后超过光速吧 ;)

上一篇:常用输入法快速输入自定义格式的时间和日期(搜狗/QQ/微软拼音)


下一篇:基于Seajs的可控台球碰撞游戏