(NO.00005)iOS實現炸彈人遊戲(五):遊戲資料初始化介紹(二)
我們現在來依次看一下上篇中提到的各個方法,首先介紹的是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個瓦塊可以操作.