(NO.00004)iOS实现打砖块游戏(八):游戏中小球与砖块的碰撞
大熊貓豬·侯佩原創(chuàng)或翻譯作品.歡迎轉(zhuǎn)載,轉(zhuǎn)載請注明出處.
如果覺得寫的不好請告訴我,如果覺得不錯請多多支持點贊.謝謝! hopy ;)
現(xiàn)在回到GameScene.m中,我們所有的碰撞處理就放在該類中.我們首先要搞清楚什么會和什么碰撞.就目前來說,我們先來實現(xiàn)2中碰撞:小球和磚塊的碰撞,以及小球和反彈棒的碰撞.
小球和磚塊的碰撞:碰撞開始
我們知道一般物理引擎對于碰撞的處理不是一蹴而就的,它分為多個階段.在Chipmunk中將碰撞按照時間的前后分為開始和后續(xù)兩個部分;不是在所有的碰撞處理中都要關(guān)注這2個方法,一般只要關(guān)注開始碰撞的部分就可以了.但是在小球和磚塊碰撞的處理中,我們還要關(guān)注后續(xù)的部分,因為有些代碼不可以放在碰撞的開始部分.下面我們先來看看碰撞開始回調(diào)代碼是如何寫的:
-(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]];}//小球沒連續(xù)碰撞一次磚塊,得分比率都會翻倍_scoreRatio *= 2;[_userInterface updateScoreLabel:[NSString stringWithFormat:@"得分:%d",_score]];[brick removeFromParent];@synchronized(self){[_level removeFromBricks:brick];}return YES; }代碼不長,首先更新了游戲場景中的撞擊計數(shù),然后按不同磚塊的分值更新玩家的得分,然后將磚塊從場景中刪除.注意,最后調(diào)用了我們之前在Level類中實現(xiàn)的removeFromBricks方法,因為我們必須要更新關(guān)卡的數(shù)組.
小球和磚塊的碰撞:碰撞結(jié)束
我們希望在小球與磚塊碰撞時增加它的反彈力,所以我們要調(diào)整小球的力矩,而調(diào)整物理對象的力矩不能再CollisionBegin中完成,否則物理引擎會抱怨了 ;[ ,我們自然將其放到碰撞結(jié)束部分中:
-(BOOL)ccPhysicsCollisionPreSolve:(CCPhysicsCollisionPair *)pair ball:(CCNode *)ballbrick:(CCNode *)brick{CGPoint velocity = ball.physicsBody.velocity;//略微增加小球的力矩[ball.physicsBody applyImpulse:ccpMult(velocity, 1.00005)];return YES; }注意我增加了一個特別微小的力矩值,因為力矩會在多次碰撞后快速累積,很快就會變得非常大,畢竟你也不想看到小球經(jīng)過幾次反彈后超過光速吧 ;)
總結(jié)
以上是生活随笔為你收集整理的(NO.00004)iOS实现打砖块游戏(八):游戏中小球与砖块的碰撞的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: BOSS直聘回应女子因未婚未育应聘被拒:
- 下一篇: Swift 数组、字典