如今,咱們來給玩家加入遊戲積分統計功能。步驟以下。算法
打開HelloWorldLayer.m文件,添加變量,實現代碼以下(程序清單同上)。數組
// 分數值標籤ide
CCLabelTTF* scoreLabel;學習
// 分數動畫
int scoreValue;spa
找到onEnter方法,在初始化×××和敵機數組以後初始化分數值標籤和分數,實現代碼以下。.net
// 初始化分數標籤orm
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:方法實時更新生命值和分數值,地圖、分數、血條、時間進度條和技能條等都是HUD(Head-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所示。
圖13.65統計積分效果
到如今爲止,一個基本的打飛機遊戲已經快完成了,讓咱們再給它添加一個大Boss,增長一點遊戲的趣味性和難度吧!增長大Boss的具體步驟以下。
打開HelloWorldLayer.m文件,添加變量,實現代碼以下(程序清單同上)。
FKSprite* bossSprite;
// Boss×××精靈數組
CCArray* bossBulletArray;
// 是否啓動Boss和Boss是否發射×××
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所示。
到此爲止,這個打飛機遊戲基本已經開發完成,包括背景滾動、飛機飛行動畫、背景音樂、音效、大量敵機***、玩家射擊、Boss大招、玩家積分統計和遊戲設置等功能。記得有位軟件大師曾經說過,遊戲沒有真正意義上的完結,由於開發者老是能夠不斷地完善它,賦予遊戲更多的新元素和新玩法。好比,咱們可讓敵機俯衝時發射炮彈、敵機作不規則運動、Boss出動時伴隨大量小飛機、玩家飛機增長大×××功能、每過一關玩家飛機增長一架等。這個遊戲咱們暫時就介紹到這裏,本節咱們的目的是學習使用cocos2d製做一個簡單的遊戲。遊戲雖然簡單,可是包括的知識點不少,但願你們好好掌握,未來製做出更加有趣和完美的遊戲。