我又粗粗看了下整個項目的代碼,比較多:
不少類都與其他類有著千絲萬縷的聯系,所以在後面交代某個類的時候可能會遇到一些其他類中的代碼,這個大家先看名會意吧.如果實在不明白的,都是我敘述的原因,和大家的理解力沒有任何關系 ;).大家可以隨時在博文後面直接跟帖發消息給我,如果時間允許,每條我都會回復.
MainScene類是整個工程裡代碼最多的類之一.共有六十多個方法:
vc+88rWlLMv50tS9q8v509DE2sjdtry3xbW9TWFpblNjZW5lwODW0CzDu9PQyrnTw8bky/u1xLOhvrDA4MHLLNTasci9z7i01NO1xNPOz7fW0Lu5tcPU2bfWs8m4/LbgtcRTY2VuZSyxyMjnsb7DqNX91Nq5xLW3tcRSUEfTzs+3U291bE9mUGFuZGE6PC9wPg0KPHA+PGltZyBhbHQ9"這裡寫圖片描述" src="/uploadfile/Collfiles/20151224/20151224091708100.gif" title="\" />
游戲中包括了大量的子場景和嵌入層,不過這個是題外話了.
主場景裡包括了所有的用戶交互部分和地圖顯示部分.無論如何如果不給玩家和敵人一個空間,任何游戲也無從開始,所以我們先談談地圖.
我們希望自動生成如下的地圖:
灰色的牆的位置是固定不變的,紅色的磚塊位置是隨機擺放的.由於磚塊下面要藏有道具和出口,所以我們很自然的就必須把整個地圖劃分為不同的層.
以前玩過Tiled的都知道,Tiled是一個很棒的地圖編輯軟件,盡管目前的版本中有一些不盡如人意的地方,比如同一層中只能在一張地圖集中選擇瓦塊.但總的來說Tiled功能還是很強大的,如果以後有機會我會單開一系列關於Tiled制作地圖的博文.
Tiled還可以創建特殊的層,稱為對象層.對象層不是用來擺放瓦塊的,而是用來放置幾何圍界對象的,在RPG類型的游戲中有著重要的用途,但是在炸彈人App中沒有用到對象層,所以大家暫時不用管它啦.
首先我們制作一張空白的地圖:
將地圖tmx文件和相關的地圖集文件全部拷貝到炸彈人工程資源目錄下的tileMap文件夾中.
在Xcode中打開MainScene.m文件,初始化方法代碼如下:
-(void)didLoadFromCCB{
_viewSize = [CCDirector sharedDirector].viewSize;
//在屏幕上顯示游戲幀數
[CCDirector sharedDirector].displayStats = YES;
//初始化話手勢識別器
[self initGestureRecognizer];
//其他初始化代碼...
//加載空白地圖到游戲中
_tileMap = [CCTiledMap tiledMapWithFile:@"EmptyMap.tmx"];
_mapHelper = [MapHelper sharedInstance];
_mapHelper.tileMap = _tileMap;
[self addChild:_tileMap];
//玩家在場景中出現的坐標
CGPoint spawnTileCoord = ccp(0,0);
CGPoint spawnPos = [self positionForTileCoord:spawnTileCoord];
[self setViewpointCenter:spawnPos];
//取得地圖中各個層的引用
_bgLayer = [_tileMap layerNamed:@"Background"];
_objectLayer = [_tileMap layerNamed:@"Objects"];
_underObjectsLayer = [_tileMap layerNamed:@"UnderObjectsLayer"];
_propertiesLayer = [_tileMap layerNamed:@"PropertiesLayer"];
_batchNode = [CCNode node];
[_tileMap addChild:_batchNode];
//省略其他初始化代碼...
//[self initGameData];
//用游戲數據初始化當前關卡
[self initGameDataFromGD];
//啟用游戲測試
//[self test];
}
簡單說一下,在MainScene類的初始化方法中,首先打開顯示調試,初始化手勢識別器,然後是實例數組的初始化和其他初始化代碼.接下來到了重要的部分:地圖的初始化,首先將空白地圖加載進來,並創建MapHelper類實例,裡面有很多方便的方法可供調用;然後建立其地圖中各個層的引用;之後是創建游戲主角炸彈人,然後調用initGameDataFromGD方法,其中包含了地圖隨機生成的代碼,我們後面會講到.