(NO.00002)iOS遊戲精靈戰爭雛形(七)
接上一篇博文,我們繼續完成射擊的功能.
還是在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變數是靜態.