(NO.00005)iOS實現炸彈人遊戲(三):從主情境類談起
我又粗粗看了下整個項目的代碼,比較多:
不少類都與其他類有著千絲萬縷的聯絡,所以在後面交代某個類的時候可能會遇到一些其他類中的代碼,這個大家先看名會意吧.如果實在不明白的,都是我敘述的原因,和大家的理解力沒有任何關係 ;).大家可以隨時在博文後面直接跟帖發訊息給我,如果時間允許,每條我都會回複.
從MainScene類開始
MainScene類是整個工程裡代碼最多的類之一.共有六十多個方法:
vc+88rWlLMv50tS9q8v509DE2sjdtry3xbW9TWFpblNjZW5lwODW0CzDu9PQyrnTw8bky/u1xLOhvrDA4MHLLNTasci9z7i01NO1xNPOz7fW0Lu5tcPU2bfWs8m4/LbgtcRTY2VuZSyxyMjnsb7DqNX91Nq5xLW3tcRSUEfTzs+3U291bE9mUGFuZGE6PC9wPg0KPHA+PGltZyBhbHQ9"這裡寫圖片描述" src="http://www.bkjia.com/uploads/allimg/151225/04013560J-2.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方法,其中包含了地圖隨機產生的程式碼,我們後面會講到.