游戲中的地圖是整個游戲的虛擬場景。通常情況下,手機上的游戲地圖按照畫面滾動方向可以分為以下三類:
1)縱向滾動
常見的是打飛機類游戲,畫面滾動主要是從上至下的模擬正在按照常規速度飛行的飛機。
2)橫向滾動
ARPG類游戲,主角通過畫面從左至右的滾動來探索未知的世界、消滅敵人、成功過關。例如魂斗羅、超級瑪麗等等。
3)縱、橫向滾動
RPG游戲中這種情況最為常見,主角的一個關鍵任務就是探索一片較大的未知領域:發現敵人、發現特殊位置地點、建築物等。
無論哪種場景,都會涉及到以下問題:
1)移動位置控制:主角在地圖中移動時必須考慮到地圖中物體的阻礙,不能越過牆體,必須通過木橋過河。更加真實的模擬會要求主角在不同的地面上有不同的移動速度:土地上速度一般,冰面上會打滑,停止效果滯后等。
2)地圖的動態變化:主角在游戲過程中的行為導致地圖變化。這里所說的變化是永久的,比如摧毀敵方建築,建立我方建築,修建道路等。而像敵人屍體的腐爛消逝這種臨時變化不在此列。
由此可見,游戲中地圖編程最主要的功能就是:
1)如何展示一個較大的地圖場景。
2)如何實現地圖對游戲主角和敵人移動的限制:阻止移動、修改運動效果。
3)如何動態的改變局部地圖的顯示內容。
從本章開始,我們講解cocos2d-x引擎提供的地圖處理機制:CCTMXTiledMap類。
TMX是當前主要支持的地圖格式,你可以使用Tiled Map Editor來生成這種格式的文件。
Tiled Map Editor分Qt版和Java版兩個版本,本文使用Qt版進行講解,知易原文使用Java版。至於更換版本的原因,參見我的前一篇文章《地圖編輯器的選擇1》。
基礎知識
考慮到內存容量、運行效率以及圖像顯示限制等諸多因素,手機上的游戲多半采用一種叫做瓦片地圖的機制。制作這種地圖時,首先對要繪制的地圖進行分析,將使用到的物件制作成尺寸一致的小圖片,即“瓦片”,然后使用這些瓦片拼接出完整的地圖。
例如下面這幅地圖:
繪制這幅地圖只使用了以下3個瓦片:
這樣一來,使用很少的圖像元素就可以表現一副大尺寸的地圖,大大地減少了內存使用量,提高了游戲運行效率。
下面就以這幅地圖為目標,逐步講解Tiled Map Editor的基本使用方法。
實戰演練
1)創建地圖
選擇菜單文件->新文件。
在彈出的新地圖對話框中,選擇地圖方向為正常,地圖大小為38 x 30,塊大小為20 x 20,確定。
2)創建“瓦片”集
選擇菜單地圖->新圖塊。
在彈出的新圖塊對話框中,輸入圖塊的名稱“codes”(不要問我為什么起這么個名字,我也不知道,也許知易是隨便起的吧),並選擇“tileSet.PNG”作為圖像的來源,確定。
這時,你就可以從窗口右下角的圖塊面板中看到它了。
3)創建圖層
你可以通過圖層面板的“添加圖層”按鈕來創建新圖層。
本例中,我們直接使用系統創建的默認圖層。雙擊圖層列表里的“塊層 1”,將其重命名為“tile”,回車。
4)繪制地圖
在開始之前,檢查一下顯示網格的功能是否開啟,它可以幫助我們精准地繪制地圖。
此功能如未開啟,你可以選擇菜單視圖->顯示網格來開啟它。
首先,選擇填充工具,將整張地圖填充為土地。
然后,選擇圖章刷工具,在地圖上繪制磚牆。
Tiled Map Editor編輯器支持地圖的復制、粘貼操作。所以可以對圖案相同的部分復制、粘貼來加速地圖的制作。
接着,點綴上幾塊鋼板完成整張地圖的繪制。
5)保存地圖
忙活這么半天了,最后千萬別忘了保存文件。選擇菜單文件->保存,將TMX地圖和用到的圖片資源保存在同一個文件夾下。
ps.如果遇到生成的地圖文件無法在cocos2d-x中使用的情況,請檢查編輯器參數設置中的“另存為數據層”一項是否為Base64 (不壓縮)、Base64 (gzip壓縮)、Base64 (zlib壓縮)之一。
繪制優質地圖的幾點建議
程序員們通常中規中矩,作品就顯得死板而不生動。
本段翻譯自下面的鏈接:
http://wiki.themanaworld.org/index.php/Mapping_Tutorial
- 在開始繪制之前你應當對整體布局有大致的規划,先從紙上畫個草圖,這將對你有所幫助。
- 避免將橋、山道、走廊之類的阻擋設置為1個瓦片的寬度,否則很容易卡在這些地方。
- 不要讓太多相似的物件同屏出現。非常顯眼的瓦片應當有節制地使用。不要讓大片相同的瓦片反復出現,你可以通過點綴一些不一樣的瓦片來斷開它們。
- 避免將自然環境畫得太規則。通常,樹不會成排成列地生長。河流、山脊以及洞穴里的走廊從來都不是筆直的。
- 地圖不能畫的太功能化。給玩家們一些東西看,即便這對玩游戲沒什么幫助。
- 但是,不要忘了可玩性。
稍作調整,感覺就好多了。
當然,這就要求我們在繪制地圖時要多少有些“藝術細胞”。如果感覺自己沒有這個水平,那就找幫手吧。你身邊肯定會有的,比如那個看見你一回家就趴在電腦前面而很惱火的人。