大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处.
如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! 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;
}
注意我增加了一个特别微小的力矩值,因为力矩会在多次碰撞后快速累积,很快就会变得非常大,毕竟你也不想看到小球经过几次反弹后超过光速吧 ;)