瘋狂ios之瘋狂打飛機遊戲(4)

13.14.10添加遊戲積分統計

現在,我們來給玩家加入遊戲積分統計功能。步驟如下。

打開HelloWorldLayer.m文件,添加變量,實現代碼如下(程序清單同上)。

// 分數值標籤

CCLabelTTF* scoreLabel;

// 分數

int scoreValue;

找到onEnter方法,在初始化子彈和敵機數組之後初始化分數值標籤和分數,實現代碼如下。

// 初始化分數標籤

scoreLabel = [CCLabelTTF labelWithString:@"00" fontName:@"Arial" fontSize:20];

scoreLabel.position = ccp(60, screenHeight-20);

[self addChild:scoreLabel];

// 初始化分數值

scoreValue = 0;

修改檢查碰撞方法collisionDetection:,當敵機生命值小於0時,增加計分算法,小飛機每個計分100,小飛碟每個計分500,實現代碼如下(程序清單同上)。

if (enemyPlaneSprite.lifeValue <= 0) {

// 刪除敵機精靈

[enemyPlaneArray removeObject:enemyPlaneSprite];

[batchNode removeChild:enemyPlaneSprite cleanup:YES];

// 播放爆炸動畫

[self bombAnimate:@"blast" :enemyPlaneSprite.position ];

// 播放爆炸音效

[[SimpleAudioEngine sharedEngine] playEffect:@"b0.mp3"];

if ([enemyPlaneSprite.name isEqualToString:@"e1"])

scoreValue += 500;

else

scoreValue += 100;

}

在私有分類中添加一個根據分數值實時更新相應的Label的方法,實現代碼如下(程序清單同上)。

-(void) updateHUD:(ccTime)delta;

updateHUD:方法實時更新生命值和分數值,地圖、分數、血條、時間進度條和技能條等都是HUDHead-UpDisplay)。實現代碼如下(程序清單同上)。

-(void) updateHUD:(ccTime)delta{

[scoreLabel setString:[NSString stringWithFormat:@"%i",scoreValue]];

}

修改update方法,實現代碼如下(程序清單同上)。

-(void) update:(ccTime)delta{

count++;

[self updateBackground:delta];

[self updateEnemySprite:delta];

[self removeEnemySprite:delta];

[self updateShooting:delta];

[self removeBulletSprite:delta];

self collisionDetection:delta];

[self updateHUD:delta];

}

再次編譯並運行遊戲,控制玩家飛機發射子彈,子彈擊中敵機,左上角的分數標籤不斷統計玩家得分。模擬器顯示效果如圖13.65所示。

085422_zpfY_262659.jpg

13.65統計積分效果

13.14.11添加遊戲大Boss

到現在爲止,一個基本的打飛機遊戲已經快完成了,讓我們再給它添加一個大Boss,增加一點遊戲的趣味性和難度吧!增加大Boss的具體步驟如下。

打開HelloWorldLayer.m文件,添加變量,實現代碼如下(程序清單同上)。

FKSprite* bossSprite;

// Boss子彈精靈數組

CCArray* bossBulletArray;

// 是否啓動BossBoss是否發射子彈

BOOL isStartBoss,isMoveBoss,isShootingBoss,isTemp;

在私有分類中添加3個方法,實現代碼如下(程序清單同上)。

// Boss出動

-(void) startBossSprite:(ccTime)delta;

// Boss在屏幕上不規則移動

-(void) moveBossSprite:(ccTime)delta;

// Boss更新子彈

-(void) updateBossShooting:(ccTime)delta;

startBossSprite:方法用於啓動Boss。實現代碼如下(程序清單同上)。

-(void) startBossSprite:(ccTime)delta{

if(isStartBoss && !isMoveBoss && !isTemp ){

isTemp = YES;

CCSpriteBatchNode *batchNode = (CCSpriteBatchNode*)[self getChildByTag: kTagBatchNode];

FKSprite* enemyPlaneSprite;

// 刪除所有敵機

CCARRAY_FOREACH(enemyPlaneArray, enemyPlaneSprite){

[batchNode removeChild:enemyPlaneSprite cleanup:YES];

}

[enemyPlaneArray removeAllObjects];

// Boss出動

bossSprite= [FKSprite spriteWithSpriteFrameName:@"e-10.png"];

bossSprite.position=ccp(screenWidth/2, screenHeight+bossSprite.contentSize.height);

bossSprite.name = @"boss";

bossSprite.lifeValue = 600;

// 創建一個進度條精靈

CCSprite* barSprite = [CCSprite spriteWithFile:@"planeHP.png"];

// 初始化一個Boss血條對象

bossSprite.enemyPlaneHP = [CCProgressTimer progressWithSprite:barSprite];

// setPercentage:0.0f,表示並未加載任何資源,表現在畫面上就是什麼也看不見

[bossSprite.enemyPlaneHP setPercentage:0.0f];

// 由於圖片大小關係,把scale設置成0.5,即縮小一半

bossSprite.enemyPlaneHP.scale = 0.25;

bossSprite.enemyPlaneHP.midpoint = ccp(0,0.5);

bossSprite.enemyPlaneHP.barChangeRate = ccp(1, 0);

bossSprite.enemyPlaneHP.type = kCCProgressTimerTypeBar;

bossSprite.enemyPlaneHP.percentage = 100;

[bossSprite.enemyPlaneHP setPosition:ccp(screenWidth/2, screenHeight/2)];

bossSprite.enemyPlaneHP.visible = NO;

[self addChild:bossSprite.enemyPlaneHP];

// 血條更新量,100/10=10

bossSprite.HPInterval = 100.0 / (float)bossSprite.lifeValue;

// Boss精靈添加到敵機數組

[enemyPlaneArray addObject:bossSprite];

[batchNode addChild:bossSprite z:4];

// Boss移動到屏幕上方

id moveTo = [CCMoveTo actionWithDuration:2

position:ccp(screenWidth/2, screenHeight-bossSprite.contentSize.height-20)];

id action = [CCSequence actions:moveTo,[CCCallBlock actionWithBlock:^(){

isMoveBoss = YES;

}], nil] ;

[bossSprite runAction:action];

// 初始化Boss子彈數組

bossBulletArray = [[CCArray alloc] init];

}

}

startBossSprite:方法首先判斷isStartBoss是否爲“YES”(默認設置爲“NO”,當玩家達到10000分時會將該值改爲“YES”,則Boss啓動),如果是,則先獲取精靈表單,循環遍歷敵機數組,從精靈表單中刪除敵機,再從敵機數組中刪除敵機(如果玩家是高手,希望玩到高難度的打飛機遊戲,則可以不執行這段代碼,遊戲就會變成Boss和大量的小敵機輪番轟炸玩家)。接下來,創建一個Boss精靈,設置名稱爲“Boss”,生命值爲600,爲Boss創建一個血條,並計算血條比率。然後將Boss添加到敵機數組和精靈表單中。最後,執行一個moveBy動作,實際效果是Boss緩緩移動到屏幕上方,再將isMoveBoss設置爲“YES”(Boss開始不規則動作)。記得初始化Boss子彈數組。

moveBossSprite:方法用於Boss啓動後在屏幕上方做不規則運動。實現代碼如下(程序清單同上)。

-(void) moveBossSprite:(ccTime)delta{

if(isMoveBoss && !isShootingBoss){

isShootingBoss = YES;

// 不停地在屏幕上方左右移動

id moveToLift = [CCMoveTo actionWithDuration:3

position:ccp(screenWidth-bossSprite.contentSize.width/2,

screenHeight-bossSprite.contentSize.height-20)];

id moveRight = [CCMoveTo actionWithDuration:3

position:ccp(0+bossSprite.contentSize.width/2,

screenHeight-bossSprite.contentSize.height-20)];

id delay = [CCDelayTime actionWithDuration:2];

id sequence = [CCSequence actions:delay,moveToLift,moveRight, nil];

// 注意:CCSequence中不能包含這個反覆的動作。

id repeat = [CCRepeatForever actionWithAction:sequence];

[bossSprite runAction:repeat];

}

}

moveBossSprite:方法首先判斷isMoveBoss是否爲“YES”,如果是,則說明Boss精靈已經啓動,開始做不規則運動,並且設置isShootingBoss = YES,表示Boss可以發射子彈***玩家精靈。

updateBossShooting:方法用於Boss開始發射子彈。實現代碼如下(程序清單同上)。

-(void) updateBossShooting:(ccTime)delta{

if (isShootingBoss) {

// Boss精靈座標

CGPoint pos = bossSprite.position;

// Boss血條顯示座標位置

bossSprite.enemyPlaneHP.position = ccp(pos.x, pos.y+55);

if (!bossSprite.enemyPlaneHP.visible) {

bossSprite.enemyPlaneHP.visible = YES;

}

// 獲得精靈表單

CCSpriteBatchNode *batchNode = (CCSpriteBatchNode*)[self getChildByTag:kTagBatchNode];

if(count % 80 == 0)

{

// 創建代表子彈的精靈

CCSprite* bossBulletSprite = [CCSprite spriteWithSpriteFrameName:@"bullet1.png"];

// 設置子彈座標

CGPoint bulletPos = ccp(pos.x, pos.y - bossSprite.contentSize.height/2);

bossBulletSprite.position = bulletPos;

// 子彈精靈可見

bossBulletSprite.visible = YES;

// 子彈移動時間爲0.5秒,移動距離爲屏幕高度-子彈的y

id moveBy=[CCMoveBy actionWithDuration:2.0f position:ccp(0,-screenHeight-bulletPos.y)];

[bossBulletSprite runAction:moveBy];

// 添加到Boss子彈數組中

[bossBulletArray addObject:bossBulletSprite];

// 將子彈精靈添加到精靈表單中

[batchNode addChild:bossBulletSprite z:4];

}

}

}

updateBossShooting:首先判斷isShootingBoss是否爲“YES”,如果是,則設置Boss血條的座標位置,並顯示Boss血條。當count % 80 == 0時,發射Boss子彈,同時將Boss子彈添加到Boss子彈數組和精靈表單中。

修改collisionDetection:方法,重新判斷玩家得分,並在爆炸效果之後添加代碼,當玩家積分達到10000時,啓動Boss。實現代碼如下(程序清單同上)。

if ([enemyPlaneSprite.name isEqualToString:@"boss"]) {

// 播放爆炸動畫

[self bombAnimate:@"bomb" :enemyPlaneSprite.position ];

// 播放爆炸音效

[[SimpleAudioEngine sharedEngine] playEffect:@"b1.mp3"];

scoreValue += 5000;

// 遊戲勝利

[self gameOver:@"遊戲勝利!"];

}else{

// 播放爆炸動畫

[self bombAnimate:@"blast" :enemyPlaneSprite.position ];

// 播放爆炸音效

[[SimpleAudioEngine sharedEngine] playEffect:@"b0.mp3"];

if ([enemyPlaneSprite.name isEqualToString:@"e1"])

scoreValue += 500;

else

scoreValue += 100;

}

// 10000分大Boss出動

if (scoreValue >= 10000) {

isStartBoss = YES;

break;

}

}

循環遍歷完子彈數組之後,再添加遍歷Boss子彈數組的代碼,判斷Boss子彈是否擊中玩家飛機。實現代碼如下(程序清單同上)。

// 判斷Boss的子彈和玩家飛機的碰撞

if (isShootingBoss) {

CCSprite* bossBulletSprite;

CCARRAY_FOREACH(bossBulletArray, bossBulletSprite){

if(CGRectIntersectsRect(planeSprite.boundingBox,bossBulletSprite.boundingBox)){

[planeSprite stopAllActions];

// 刪除玩家精靈

[batchNode removeChild:planeSprite cleanup:YES];

// 爆炸聲音

[[SimpleAudioEngine sharedEngine] playEffect:@"b0.mp3"];

// 播放爆炸動畫

[self bombAnimate:@"blast" :planeSprite.position ];

[self gameOver:@"遊戲結束!"];

}

}

}

修改updateEnemySprite:方法,判斷是否更新敵機時增加!isStartBoss進行判斷,意味着Boss出動後不再更新敵機。實現代碼如下(程序清單同上)。

if (count % 30 == 0 && !isStartBoss)

if (count % 200 == 0 && !isStartBoss)

修改update方法,實現代碼如下(程序清單同上)。

-(void) update:(ccTime)delta{

count++;

[self updateBackground:delta];

[self updateEnemySprite:delta];

[self removeEnemySprite:delta];

[self updateShooting:delta];

[self removeBulletSprite:delta];

self collisionDetection:delta];

[self updateHUD:delta];

[self startBossSprite:delta];

[self moveBossSprite:delta];

[self updateBossShooting:delta];

}

再次編譯並運行遊戲,當玩家得分達到10000分時,Boss出動。模擬器顯示效果如圖13.66所示。

當玩家控制飛機***大Boss時,Boss的血條會隨着生命值的減少而縮短。當Boss生命值爲0時,播放爆炸效果,提示遊戲勝利,模擬器顯示效果如圖13.67所示。

085329_Am7W_262659.jpg085346_Mx1D_262659.jpg

到此爲止,這個打飛機遊戲基本已經開發完成,包括背景滾動、飛機飛行動畫、背景音樂、音效、大量敵機***、玩家射擊、Boss大招、玩家積分統計和遊戲設置等功能。記得有位軟件大師曾經說過,遊戲沒有真正意義上的完結,因爲開發者總是可以不斷地完善它,賦予遊戲更多的新元素和新玩法。比如,我們可以讓敵機俯衝時發射炮彈、敵機做不規則運動、Boss出動時伴隨大量小飛機、玩家飛機增加大炸彈功能、每過一關玩家飛機增加一架等。這個遊戲我們暫時就介紹到這裏,本節我們的目的是學習使用cocos2d製作一個簡單的遊戲。遊戲雖然簡單,但是包括的知識點很多,希望大家好好掌握,將來製作出更加有趣和完美的遊戲。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章