AndEngine引擎结合Tiled编辑器实现游戏中的瓦片地图瓦片地图是由若干反复出现的多边形小图片以矩阵的方式组合而成的。对于简单的瓦片地图来说,多边形通常是正方形。因此整张地图可以看作一张表格,其中每个单元格对应于瓦片集中的某个瓦片,这样所有单元格合起来就构成了整幅地图图像。
1 瓦片地图的结构
瓦片地图由三部分组成:用于创建瓦片贴图的图形文件,瓦片集以及地图本身,地图是以分层的方式创建的:
? 每个瓦片都有其属性,包括位置ID(地图中的行列位置)以及全局ID(在瓦片集中的贴图位置);
? 瓦片被拼接成图层,每个图层都是一张完整的地图层,其上覆盖了该区域的所有瓦片;
? 所有图层合起来构成整幅地图。
2 TMX文件与TSX文件
有两种非常流行的基于XML的文件格式,分别是用于瓦片集的TSX格式和用于瓦片地图的TMX格式。这两种格式是搭配使用的,大部分TMX文件都会引用TSX文件来获取瓦片集信息。TMX瓦片地图很容易同AndEngine 相结合。
首先制作用于创建瓦片贴图的图形文件。
然后制作瓦片集:
在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)游戏xml文件修改
5 利用AndEngine引擎制作的瓦片地图的实例
AndEngine加载瓦片地图的关键是在加载场景onLoadScene()中。首先要创建TMXLoader对象,再通过它从assets文件夹下加载相关图片以创建瓦片地图并载入到AndEngine中。在创建TMXLoader对象时,以匿名内部类的手段重写onTMXTileWithPropertiesCreated()方法,如果地图中有属性值为true的瓦片,该方法就会被回调。
H4sIAAAAAAAAC2NhYGBgQcJsaHwQZsIiBsOseOSQ9cLUMSOJY8PE2suCZh66H9D 1YvMXPjdjcw8
+vxJjPisB84l1G7Fhje42Jjx+IOQWXPKsOOQAvYm871gCAAA=
程序清
程序清单2 GameTileSet.tsx
修改后的文件中,source属性值写入了完整的assets路径(见阴影部分)。
载入地图后,获取图层对象,将其作为子对象加入到当前的场景中。再调用setOnSceneTouchListener()方法在场景对象上注册以捕获触摸事件。当类型为ACTION_DOWN的触摸事件发生时,回调方法通过在图层对象上调用getTileAt()方法来获取被触摸的瓦片,进而可对其进