(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 *)ballbrick:(CCNode *)brick{CGPoint velocity = ball.physicsBody.velocity;//略微增加小球的力矩[ball.physicsBody applyImpulse:ccpMult(velocity, 1.00005)];return YES; }注意我增加了一個特別微小的力矩值,因為力矩會在多次碰撞后快速累積,很快就會變得非常大,畢竟你也不想看到小球經過幾次反彈后超過光速吧 ;)
總結
以上是生活随笔為你收集整理的(NO.00004)iOS实现打砖块游戏(八):游戏中小球与砖块的碰撞的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: BOSS直聘回应女子因未婚未育应聘被拒:
- 下一篇: 知乎关注动态在哪里看