我們現在來依次看一下上篇中提到的各個方法,首先介紹的是updateStateLabel方法:
#pragma mark MainScene游戲相關輔助方法
//更新主角狀態標簽,格式為:神速 無敵 爆裂 穿牆 穿彈 遙控
-(void)updateStateLabel{
NSString *state = [NSString stringWithFormat:@"%@%@%@%@%@%@",
_isPlayerSpeedUp ? @"神速":@" ",
_player.isInvincible ? @"無敵":@" ",
!_isFearBomb ? @"爆裂":@" ",
_player.canAcrossBrick ? @"穿牆":@" ",
_player.canAcrossBomb ? @"穿彈":@" ",
_isManualExplode ? @"遙控":@" "];
[_hudLayer updateStateLabel:state];
}
代碼很好理解,就是根據當前主角的狀態創建狀態字符串然後顯示在標簽中,當然更可取的方法是使用圖標來顯示,這個可以留作以後擴展.
接下來看一下initNoWallTiles方法,該方法的作用是遍歷所有非牆的瓦塊坐標,為後面的方法調用做准備,起到一個緩存數據換速度的目的:
//初始化不是牆的所有瓦塊坐標,還要排除(0,0),(0,1),(1,0)三個瓦塊.
-(void)initNoWallTiles{
CGPoint badTilePos1 = ccp(0, 0);
CGPoint badTilePos2 = ccp(0, 1);
CGPoint badTilePos3 = ccp(1, 0);
for (int x = 0; x < _tileMap.mapSize.width; x++) {
for (int y = 0; y < _tileMap.mapSize.height; y++) {
CGPoint tilePos = ccp(x, y);
if (CGPointEqualToPoint(tilePos, badTilePos1) ||
CGPointEqualToPoint(tilePos, badTilePos2) ||
CGPointEqualToPoint(tilePos, badTilePos3)) {
continue;
}else if (![self isWallAtTileCoord:tilePos]) {
[_notWallTiles addObject:[NSValue valueWithCGPoint:tilePos]];
}
}
}
NSAssert(_notWallTiles.count == 249, @"_notWallTiles must equ 249");
}
代碼中依次遍歷了所有瓦塊,將非牆瓦塊的坐標加入到_notWallTiles數組中,這樣後面的隨機生成地圖方法裡我們可以很方便的使用這些數據了.注意其中剔除了3個坐標,分別為:
(0,0) , (0,1) 和 (1,0)
因為游戲主角炸彈人需要在(0,0)處產生,所以(0,1)和(1,0)自然不能放置磚塊,否則主角自身就會”死路一條”,最後用一個斷言來檢查非牆瓦塊的個數是否為249,這個是事先手動計算好的,總共為30x10=300個瓦塊,減去6*8=48個不可摧毀牆體,再減去3個上述坐標,最後剩余249個瓦塊可以操作.