AndEngine引擎结合Tiled编辑器实现游戏中的瓦片地图

2018-02-02 17:35陈海燕王丽芬常莹张燕宁
电脑知识与技术 2018年1期

陈海燕+王丽芬+常莹+张燕宁

摘要:在游戏开发过程中,大部分设计者都需要足够大且可以扩展的游戏地图,例如即时战略游戏,使得玩家可以在地图中滚动游戏画面。这类游戏通常会有丰富的背景元素,如果直接使用背景图切换的方式,需要为每个不同的场景准备一张背景图,而且每个背景图都不小,这样会造成资源浪费。相对于创建一张巨大的位图来说,瓦片可以被多次使用,拼接成大图,从而可以在游戏运行时根据需要即刻生成大小不限的地图。瓦片地图既节省了内存,又节省了时间。AndEngine是一款基于OpenGL ES技术的Android游戏引擎,为开发者提供了免费且易用的游戏框架,Tiled Map Editor是瓦片地图编辑器。该文着重介绍AndEngine如何解析Tiled编辑器创建的地图文件。

关键词:AndEngine;Tiled Map Editor;瓦片地图;TMX文件与TSX文件

中图分类号:TP393 文献标识码:A 文章编号:1009-3044(2018)01-0226-02

瓦片地图是由若干反复出现的多边形小图片以矩阵的方式组合而成的。对于简单的瓦片地图来说,多边形通常是正方形。因此整张地图可以看作一张表格,其中每个单元格对应于瓦片集中的某个瓦片,这样所有单元格合起来就构成了整幅地图图像。

1 瓦片地图的结构

瓦片地图由三部分组成:用于创建瓦片贴图的图形文件,瓦片集以及地图本身,地图是以分层的方式创建的:

? 每个瓦片都有其属性,包括位置ID(地图中的行列位置)以及全局ID(在瓦片集中的贴图位置);

? 瓦片被拼接成图层,每个图层都是一张完整的地图层,其上覆盖了该区域的所有瓦片;

? 所有图层合起来构成整幅地图。

2 TMX文件与TSX文件

有两种非常流行的基于XML的文件格式,分别是用于瓦片集的TSX格式和用于瓦片地图的TMX格式。这两种格式是搭配使用的,大部分TMX文件都会引用TSX文件来获取瓦片集信息。TMX瓦片地图很容易同AndEngine相结合。

3 用瓦片编辑器Tiled制作瓦片地图

首先制作用于创建瓦片贴图的图形文件。

美工可以使用任何所喜爱的图形编辑器来制作游戏中的瓦片。笔者用Photoshop制作了六张32 像素*32像素的瓦片。Tiled所需的瓦片集图像为 .png格式,所有的瓦片需要像精灵表那样排列到一张大图上。美工同样可以使用自己喜欢图形编辑器来将瓦片拼合成一幅大的 .png文件。如图1所示:

然后制作瓦片集:

在Tiled软件中,可以通过地图菜单下的“新图块”菜单项将上一步做好的瓦片贴图的图形文件导入,在指定好相应瓦片的名字和属性后,将其导出成制作瓦片地图所需的瓦片集,格式为.tsx。

最后拼接瓦片地图:

Tiled制作瓦片地图的教程很多,也自带例子,关于怎么拼地图,这里就不介绍了,用Tiled制作的瓦片地图以 .tmx格式的文件存储,此文件需要导入游戏项目的assets文件夹中。

Tiled和AndEngine所使用的文件格式都是TMX,所有的贴图地图文件均以.tmx為扩展名。它所使用的瓦片集图像将以.png的格式随之一同存放。TMX文件是基于XML的,其中包含了地图上每个位置所对应的瓦片信息,为了减少数据量,这些信息是经过压缩的。

4 AndEngine中的用于加载、操作及渲染瓦片地图的类和主要方法

4.1 TMXLoader类

AndEngine中的TMXLoader类知道如何将TMX与TSX文件载入TMXTiledMap对象中去,其构造函数如下:

TMXLoader(final Context pContext, final TextureManager pTextureManager,

final TextureOptions pTextureOptions,

final ITMXTilePropertiesListener pTMXTilePropertyListener)

其中Context和TextureManager参数是必须的, TextureOptions和ITMXTilePropertiesListener参数是可选的。 TextureOptions指定OPenGL如何绘制瓦片地图,其默认值为NEAREST_PREMULTIPLYALPHA。ITMXTilePropertiesListener参数所定义的监听器会在瓦片被载入时回调。

创建好TMXLoader对象后,便可使用下面的方法加载瓦片地图:

TMXTiledMap loadFromAsset(final Context pContext, final String pAssetPath)

TMXTiledMap load(final InputStream pInputStream)

4.2 TMXTiledMap类

TMXTiledMap类是AndEngine用于表示整个瓦片地图的类。它包含所有图层、瓦片及其相关属性。通常不需要直接调用其构造函数去构建整个地图,而是通过调用上述加载地图的方法而获得。编程中,经常使用如下get方法来获取瓦片地图的内容:

int getTileColumns()

int getTileRows()

int getTileWidth()

int getTileHeight()

以上方法会分别返回对应瓦片的长宽信息,长和宽均以像素为单位。

ArrayList getTMXTileSets()

ArrayList getTMXLayers()

ArrayList getTMXObjectGroups()

以上方法分别返回包含该瓦片地图的瓦片集、图层、对象组的列表。这些对象都有相应的方法来获取更加具体的地图相关信息。

TMXProperties getTMXTilePropertiesByGlobalTileID(final int pGlobalTileID)

TMXProperties getTMXTiledMapProperties()

TMXProperties getTMXTileProperties(final int pGlobalTileID)

以上方法可以获取到地图对象中地图、图层或瓦片的属性列表。

TextureRegion getTextureRegionFromGlobalTileID(final int pGlobalTileID)

这个方法可以获取载入瓦片地图中某块瓦片所用的TextureRegion对象。

4.3 TMXLayer类

瓦片地图是由图层组成的,每个图层都有自己的瓦片。开发者可以从TMXTiledMap对象上获取地图对象的图层列表。可以在图层对象上调用相关方法来获取或修改图层的相关信息。

TMXTile[][] getTMXTiles()

TMXTile getTMXTile(final int pTileColumn, final int pTileRow)

TMXTile getTMXTileAt(final float pX, final float pY)

这三个方法都可以用来获取瓦片地图的瓦片

TMXProperties getTMXLayerProperties()

这个方法可以提供本图层的属性列表。

4.4 TMXTile 类

可以通过TMXTile对象获取感兴趣的瓦片信息:

int getTileX()

int getTileY()

int getTileWidth()

int getTileHeight()

TextureRegion getTextureRegion()

以上方法都很简明,不再详细解释了。

int getGlobalTileID()

void setGlobalTileID(final TMXTiledMap pTMXTiledMap, final int pGlobalTileID)

全局ID是由瓦片编辑器Tiled赋予瓦片地图中的瓦片的,一般都是从默认值0开始,瓦片集中的每个瓦片图像都有其独特的全局ID,我们可以通过get和set方法设置和获取瓦片的全局ID。

5 利用AndEngine引擎制作的瓦片地图的实例

AndEngine加载瓦片地图的关键是在加载场景onLoadScene()中。首先要创建TMXLoader对象,再通过它从assets文件夹下加载相关图片以创建瓦片地图并载入到AndEngine中。在创建TMXLoader对象时,以匿名内部类的手段重写onTMXTileWithPropertiesCreated()方法,如果地图中有属性值为true的瓦片,该方法就会被回调。

AndEngine会在assets目录下查找相关的.tmx 文件,我们可以编辑Tiled软件所生成的.tmx文件和.tsx文件,将完整的路径加入其中(例如我们将GameTileSet.png文件,GameTileMap.tmx文件和GameTileSet.tsx文件存放在assets目录下的map 文件夹中),下面就是编辑后的GameTiledMap.tmx文件和GameTileSet.tsx文件。

<?xml version="1.0" encoding="UTF-8"?>

tilewidth="32" tileheight="32">

H4sIAAAAAAAAC2NhYGBgQcJsaHwQZsIiBsOseOSQ9cLUMSOJY8PE2suCZh66H9D1YvMXPjdjcw8

+vxJjPisB84l1G7Fhje42Jjx+IOQWXPKsOOQAvYm871gCAAA=

程序清單1 GameTiledMap.tmx

<?xml version="1.0" encoding="UTF-8"?>

程序清单2 GameTileSet.tsx

修改后的文件中,source属性值写入了完整的assets路径(见阴影部分)。

载入地图后,获取图层对象,将其作为子对象加入到当前的场景中。再调用setOnSceneTouchListener()方法在场景对象上注册监听器以捕获触摸事件。当类型为ACTION_DOWN的触摸事件发生时,回调方法通过在图层对象上调用getTileAt()方法来获取被触摸的瓦片,进而可对其进行相应的操作。

6 总结

瓦片地图是游戏编程的重要组成部分,制作这些瓦片集和瓦片地图所使用的工具Tiled非常的方便易用,而使用AndEngine提供的功能,可以将瓦片集与瓦片地图轻松地集成到游戏中来。

参考文献:

[1] 王玉芹.Android游戏开发从入门到精通[M].机械工业出版社,2016.

[2] 郑萌.VIP——Android游戏开发案例与关键技术[M].电子工业出版社,2013.

[3] 吴亚峰,苏亚光,于复兴.Android 游戏开发大全[M].人民邮电出版社,2015.

[4] http://code.google.com/p/andengineexamples/.