你好,歡迎來到IOS教程網

 Ios教程網 >> IOS編程開發 >> IOS開發綜合 >> (NO.00004)iOS實現打磚塊游戲(八):游戲中小球與磚塊的碰撞

(NO.00004)iOS實現打磚塊游戲(八):游戲中小球與磚塊的碰撞

日期:2017/3/9 8:58:41      編輯:IOS開發綜合

 


現在回到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;
}

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

  1. 上一頁:
  2. 下一頁:
蘋果刷機越獄教程| IOS教程問題解答| IOS技巧綜合| IOS7技巧| IOS8教程
Copyright © Ios教程網 All Rights Reserved