現在回到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;
}
注意我增加了一個特別微小的力矩值,因為力矩會在多次碰撞後快速累積,很快就會變得非常大,畢竟你也不想看到小球經過幾次反彈後超過光速吧 ;)