(NO.00002)iOS遊戲精靈戰爭雛形(七) – iPhone手機開發 iPhone軟體開發教學課程

接上一篇博文,我們繼續完成射擊的功能.

還是在MainScene.m中,添加initBullets方法:

-(void)initBullets{
    CCSprite *bullet;
    for (int i = 0; i < MAX_BULLET_COUNT; i++) {
        bullet = (CCSprite*)[CCBReader load:@Sprites/Bullet];
        bullet.positionType = CCPositionTypeNormalized;
        bullet.visible = NO;
        [_bullets addObject:bullet];
        [_physics addChild:bullet];
    }
}

該方法用來預先緩存子彈,其中MAX_BULLET_COUNT值為10,即表示我們預先創建10顆子彈,這10顆子彈是可以重復使用的,造成子彈無窮的假象.下面看一下如何”制造”一顆子彈:

首先加載Bullet.ccb文件到bullet變量中,不要問為什麼代碼中沒有.ccb後綴,前面SpriteBuilder普及知識裡已經說過瞭,大傢可以搜一下.然後修改子彈位置類型,這時子彈是看不見的,因為我們還沒有發射出去.將子彈分別添加到子彈數組和物理對象中.

這裡要註意的是,不能直接把子彈添加到MainScene場景中,因為子彈是物理對象,他隻能添加到物理世界中.

修改didLoadFromCCB方法,在最後添加如下代碼:

    [self initBullets];

子彈的初始化工作都完成瞭,但是這時子彈還是不能用,還需要一個子彈”上膛”操作,子彈上膛之後才可以真正發射,遂添加一個loadBullet方法:

-(CCSprite*)loadBullet{
    static NSInteger last = 0;
    for (CCSprite* bullet in _bullets) {
        if (!bullet.visible) {
            bullet.visible = YES;
            return bullet;
        }
    }
    //如果所有子彈都可見,則取可見時間最長的那一顆
    CCSprite *bullet = _bullets[last];
    last = (last + 1)%MAX_BULLET_COUNT;
    return bullet;
}

前面說過瞭,默認彈夾裡的子彈都是不可見的,一旦發射出去子彈就變得可見瞭.這裡尋找第一個不可見的子彈,然後上膛,將其變得可見,準備擊發.如果此時所有子彈都可見怎麼辦?這意味著所有彈夾內的子彈都被打出去瞭.我們必須回收利用已經打出去的子彈,我們選擇最早打出去的的那一顆子彈,註意方法中last變量是靜態的.

 

發佈留言