陳海燕+王麗芬+常瑩+張燕寧
摘要:在游戲開發(fā)過(guò)程中,大部分設(shè)計(jì)者都需要足夠大且可以擴(kuò)展的游戲地圖,例如即時(shí)戰(zhàn)略游戲,使得玩家可以在地圖中滾動(dòng)游戲畫面。這類游戲通常會(huì)有豐富的背景元素,如果直接使用背景圖切換的方式,需要為每個(gè)不同的場(chǎng)景準(zhǔn)備一張背景圖,而且每個(gè)背景圖都不小,這樣會(huì)造成資源浪費(fèi)。相對(duì)于創(chuàng)建一張巨大的位圖來(lái)說(shuō),瓦片可以被多次使用,拼接成大圖,從而可以在游戲運(yùn)行時(shí)根據(jù)需要即刻生成大小不限的地圖。瓦片地圖既節(jié)省了內(nèi)存,又節(jié)省了時(shí)間。AndEngine是一款基于OpenGL ES技術(shù)的Android游戲引擎,為開發(fā)者提供了免費(fèi)且易用的游戲框架,Tiled Map Editor是瓦片地圖編輯器。該文著重介紹AndEngine如何解析Tiled編輯器創(chuàng)建的地圖文件。
關(guān)鍵詞:AndEngine;Tiled Map Editor;瓦片地圖;TMX文件與TSX文件
中圖分類號(hào):TP393 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):1009-3044(2018)01-0226-02
瓦片地圖是由若干反復(fù)出現(xiàn)的多邊形小圖片以矩陣的方式組合而成的。對(duì)于簡(jiǎn)單的瓦片地圖來(lái)說(shuō),多邊形通常是正方形。因此整張地圖可以看作一張表格,其中每個(gè)單元格對(duì)應(yīng)于瓦片集中的某個(gè)瓦片,這樣所有單元格合起來(lái)就構(gòu)成了整幅地圖圖像。
1 瓦片地圖的結(jié)構(gòu)
瓦片地圖由三部分組成:用于創(chuàng)建瓦片貼圖的圖形文件,瓦片集以及地圖本身,地圖是以分層的方式創(chuàng)建的:
? 每個(gè)瓦片都有其屬性,包括位置ID(地圖中的行列位置)以及全局ID(在瓦片集中的貼圖位置);
? 瓦片被拼接成圖層,每個(gè)圖層都是一張完整的地圖層,其上覆蓋了該區(qū)域的所有瓦片;
? 所有圖層合起來(lái)構(gòu)成整幅地圖。
2 TMX文件與TSX文件
有兩種非常流行的基于XML的文件格式,分別是用于瓦片集的TSX格式和用于瓦片地圖的TMX格式。這兩種格式是搭配使用的,大部分TMX文件都會(huì)引用TSX文件來(lái)獲取瓦片集信息。TMX瓦片地圖很容易同AndEngine相結(jié)合。
3 用瓦片編輯器Tiled制作瓦片地圖
首先制作用于創(chuàng)建瓦片貼圖的圖形文件。
美工可以使用任何所喜愛的圖形編輯器來(lái)制作游戲中的瓦片。筆者用Photoshop制作了六張32 像素*32像素的瓦片。Tiled所需的瓦片集圖像為 .png格式,所有的瓦片需要像精靈表那樣排列到一張大圖上。美工同樣可以使用自己喜歡圖形編輯器來(lái)將瓦片拼合成一幅大的 .png文件。如圖1所示:
然后制作瓦片集:
在Tiled軟件中,可以通過(guò)地圖菜單下的“新圖塊”菜單項(xiàng)將上一步做好的瓦片貼圖的圖形文件導(dǎo)入,在指定好相應(yīng)瓦片的名字和屬性后,將其導(dǎo)出成制作瓦片地圖所需的瓦片集,格式為.tsx。
最后拼接瓦片地圖:
Tiled制作瓦片地圖的教程很多,也自帶例子,關(guān)于怎么拼地圖,這里就不介紹了,用Tiled制作的瓦片地圖以 .tmx格式的文件存儲(chǔ),此文件需要導(dǎo)入游戲項(xiàng)目的assets文件夾中。
Tiled和AndEngine所使用的文件格式都是TMX,所有的貼圖地圖文件均以.tmx為擴(kuò)展名。它所使用的瓦片集圖像將以.png的格式隨之一同存放。TMX文件是基于XML的,其中包含了地圖上每個(gè)位置所對(duì)應(yīng)的瓦片信息,為了減少數(shù)據(jù)量,這些信息是經(jīng)過(guò)壓縮的。
4 AndEngine中的用于加載、操作及渲染瓦片地圖的類和主要方法
4.1 TMXLoader類
AndEngine中的TMXLoader類知道如何將TMX與TSX文件載入TMXTiledMap對(duì)象中去,其構(gòu)造函數(shù)如下:
TMXLoader(final Context pContext, final TextureManager pTextureManager,
final TextureOptions pTextureOptions,
final ITMXTilePropertiesListener pTMXTilePropertyListener)
其中Context和TextureManager參數(shù)是必須的, TextureOptions和ITMXTilePropertiesListener參數(shù)是可選的。 TextureOptions指定OPenGL如何繪制瓦片地圖,其默認(rèn)值為NEAREST_PREMULTIPLYALPHA。ITMXTilePropertiesListener參數(shù)所定義的監(jiān)聽器會(huì)在瓦片被載入時(shí)回調(diào)。
創(chuàng)建好TMXLoader對(duì)象后,便可使用下面的方法加載瓦片地圖:
TMXTiledMap loadFromAsset(final Context pContext, final String pAssetPath)
TMXTiledMap load(final InputStream pInputStream)
4.2 TMXTiledMap類
TMXTiledMap類是AndEngine用于表示整個(gè)瓦片地圖的類。它包含所有圖層、瓦片及其相關(guān)屬性。通常不需要直接調(diào)用其構(gòu)造函數(shù)去構(gòu)建整個(gè)地圖,而是通過(guò)調(diào)用上述加載地圖的方法而獲得。編程中,經(jīng)常使用如下get方法來(lái)獲取瓦片地圖的內(nèi)容:
int getTileColumns()
int getTileRows()
int getTileWidth()
int getTileHeight()
以上方法會(huì)分別返回對(duì)應(yīng)瓦片的長(zhǎng)寬信息,長(zhǎng)和寬均以像素為單位。
ArrayList
ArrayList
ArrayList
以上方法分別返回包含該瓦片地圖的瓦片集、圖層、對(duì)象組的列表。這些對(duì)象都有相應(yīng)的方法來(lái)獲取更加具體的地圖相關(guān)信息。
TMXProperties
TMXProperties
TMXProperties
以上方法可以獲取到地圖對(duì)象中地圖、圖層或瓦片的屬性列表。
TextureRegion getTextureRegionFromGlobalTileID(final int pGlobalTileID)
這個(gè)方法可以獲取載入瓦片地圖中某塊瓦片所用的TextureRegion對(duì)象。
4.3 TMXLayer類
瓦片地圖是由圖層組成的,每個(gè)圖層都有自己的瓦片。開發(fā)者可以從TMXTiledMap對(duì)象上獲取地圖對(duì)象的圖層列表??梢栽趫D層對(duì)象上調(diào)用相關(guān)方法來(lái)獲取或修改圖層的相關(guān)信息。
TMXTile[][] getTMXTiles()
TMXTile getTMXTile(final int pTileColumn, final int pTileRow)
TMXTile getTMXTileAt(final float pX, final float pY)
這三個(gè)方法都可以用來(lái)獲取瓦片地圖的瓦片
TMXProperties
這個(gè)方法可以提供本圖層的屬性列表。
4.4 TMXTile 類
可以通過(guò)TMXTile對(duì)象獲取感興趣的瓦片信息:
int getTileX()
int getTileY()
int getTileWidth()
int getTileHeight()
TextureRegion getTextureRegion()
以上方法都很簡(jiǎn)明,不再詳細(xì)解釋了。
int getGlobalTileID()
void setGlobalTileID(final TMXTiledMap pTMXTiledMap, final int pGlobalTileID)
全局ID是由瓦片編輯器Tiled賦予瓦片地圖中的瓦片的,一般都是從默認(rèn)值0開始,瓦片集中的每個(gè)瓦片圖像都有其獨(dú)特的全局ID,我們可以通過(guò)get和set方法設(shè)置和獲取瓦片的全局ID。
5 利用AndEngine引擎制作的瓦片地圖的實(shí)例
AndEngine加載瓦片地圖的關(guān)鍵是在加載場(chǎng)景onLoadScene()中。首先要?jiǎng)?chuàng)建TMXLoader對(duì)象,再通過(guò)它從assets文件夾下加載相關(guān)圖片以創(chuàng)建瓦片地圖并載入到AndEngine中。在創(chuàng)建TMXLoader對(duì)象時(shí),以匿名內(nèi)部類的手段重寫onTMXTileWithPropertiesCreated()方法,如果地圖中有屬性值為true的瓦片,該方法就會(huì)被回調(diào)。
AndEngine會(huì)在assets目錄下查找相關(guān)的.tmx 文件,我們可以編輯Tiled軟件所生成的.tmx文件和.tsx文件,將完整的路徑加入其中(例如我們將GameTileSet.png文件,GameTileMap.tmx文件和GameTileSet.tsx文件存放在assets目錄下的map 文件夾中),下面就是編輯后的GameTiledMap.tmx文件和GameTileSet.tsx文件。
<?xml version="1.0" encoding="UTF-8"?>
程序清單1 GameTiledMap.tmx
<?xml version="1.0" encoding="UTF-8"?>
程序清單2 GameTileSet.tsx
修改后的文件中,source屬性值寫入了完整的assets路徑(見陰影部分)。
載入地圖后,獲取圖層對(duì)象,將其作為子對(duì)象加入到當(dāng)前的場(chǎng)景中。再調(diào)用setOnSceneTouchListener()方法在場(chǎng)景對(duì)象上注冊(cè)監(jiān)聽器以捕獲觸摸事件。當(dāng)類型為ACTION_DOWN的觸摸事件發(fā)生時(shí),回調(diào)方法通過(guò)在圖層對(duì)象上調(diào)用getTileAt()方法來(lái)獲取被觸摸的瓦片,進(jìn)而可對(duì)其進(jìn)行相應(yīng)的操作。
6 總結(jié)
瓦片地圖是游戲編程的重要組成部分,制作這些瓦片集和瓦片地圖所使用的工具Tiled非常的方便易用,而使用AndEngine提供的功能,可以將瓦片集與瓦片地圖輕松地集成到游戲中來(lái)。
參考文獻(xiàn):
[1] 王玉芹.Android游戲開發(fā)從入門到精通[M].機(jī)械工業(yè)出版社,2016.
[2] 鄭萌.VIP——Android游戲開發(fā)案例與關(guān)鍵技術(shù)[M].電子工業(yè)出版社,2013.
[3] 吳亞峰,蘇亞光,于復(fù)興.Android 游戲開發(fā)大全[M].人民郵電出版社,2015.
[4] http://code.google.com/p/andengineexamples/.