Egret + TiledMap 快速上手
从 TiledMap 开始
TiledMap 简介
Tiled 是一款 2D 的地图编辑器,可以用来帮助开发您的游戏内容。它的主要功能是编辑各种形式的瓦片地图,同时也支持自用的图像摆放和编辑强大的注释在游戏中使用。 Tiled 注重通用性的基础上也注重于灵活性。
可以在 TiledMap 官网获取到TiledMap。更多文档可以参考 TiledMap 文档中心。
TiledMap 官网提供 Windows 、Mac 和源码下载。
安装Tiled和安装其他软件一样,比较简单这里就不用介绍了。
当然如果您熟悉 Tiled 的用法可以简单了解一下在 Tiled 导入到 Egret 过程中的注意事项即可。
TiledMap 快速上手
界面
Tiled 的界面比较简单,基本如上图所示。
菜单栏包含 Tiled 的全部菜单设置,菜单基本在这里都可以找到。
工具栏中是 Tiled 的常用工具,这里面主要有文件操作(新建,打开,保存按钮),操作按钮,和工具按钮等,下面使用过程中会慢慢介绍。
属性面板,显示地图或者图层的属性,这里面是常用的属性操作都在此。
编辑区,是编辑地图的主要区域。
这些区域都可以在视图菜单下进行调整,其他的面板和功能在在使用过程中都会慢慢介绍。
这里需要注意的是如果要调整界面语言,可以在编辑菜单下,选择参数选项,在弹出的对话框下进行调整:
使用示例地图
在 Tiled 的安装目录下有 examples
文件夹,里面有完整的官方示例地图。点击打开按钮:
找到安装目录下的examples
文件夹,打开其中的一个地图文件,这里面以desert.tmx
为例,打开之后可以看到界面变成下面这样:
地图属性
在左上角的属性面板上可以看到地图属性:
也可以在菜单栏的地图菜单->Map Properties 下找到地图属性。
此处显示地图的基本信息:
Orientation:旋转信息,有四个值可供选择:正常(orthogonal),45度(isometric),45度交错的(isometric staggered),hexagonal staggered(六角);
Width:地图的宽度,这里以图块为单位,40表示40个图块。
Height:地图的宽度,跟上面一样是以格子为单位的。
Tiled Width:最小的一个格子的宽度。
Tiled Height:最小的一个格子的高度。
Tiled SideLength:格子边长(这里适用于旋转设置为六角hexagonal的地图)
Stagger Axis:交错地图的坐标轴,x或者y
Stagger Index:交错地图的次序,包括奇异(odd)和平坦(even)。
Tile Layer Format:地图格式信息。包括XMl,base64,base64(gzip),base64(zlib),csv
Tile Render Order:地图渲染顺序。
Backgroud Color:背景颜色。
Custom properties:自定义属性。
这里需要注意的是在 Egret 中可以使用正常(orthogonal),45度(isometric)两种旋转信息的地图。Egret 中支持 XML,base64,csv 格式的地图,其他两种暂不支持。
可以点击属性面板上面的小加号可以添加自定义的属性,比如这样:
图层
在 Tiled 里有三种基本图层
图像图层:用于显示静态图像,支持常用图片格式。
对象图层:Tiled 中的对象绘制在该图层上。在 Tiled 中可以设置多种对象,在 Egret 程序中可以获得这些对象的数据,并做进一步的处理。
块图层:最基本的地图和图块绘制在该图层上面。
在图层面板的左下角可以新建这三种图层,在图层面板选中相应图层后对应的属性和工具也会有变化。
图像图层
新建一个图像图层,可以看到右侧的属性面板变成了图像图层的。
这里可以设置图像的可见性(visble),透明度(Opactiy)和图像属性。可以通过图像属性来设置图片的路径来添加图片。
这里在工具栏上面只有图像工具是可用的。
添加好图像之后就可以在地图上拖拽设置图片了。
这里的图片源尽量和地图放在同一文件夹下,方便导入到 Egret 中。
对象图层
Tiled 支持对象图层的编辑,在对象图层上可以编辑多边形和圆等对象。也可以选择图块插入。
在属性一栏里可以查看对象图层的属性。
在工具栏的对象工具栏里可以操作对象层。
在工具栏里面选择好相应工具之后就可以在地图上面绘制对象了:
同样也可以选择并查看一个对象的属性。
块层
块层或者说地图图层,这里面主要用来绘制图块或者地形。这里可以选择下面的图块选选择图块或者地形,然后绘制到块层。
可以点击图块面板的左下角添加新的图块:
这里需要注意的是 Tiled 中的基本单位为图块,如果图块的基本大小为 32 32 像素,那么一个 10 10 的地图实际大小为 320 * 320 像素。
可以点击图块面板下面倒数第三个按钮编辑地图信息按钮。然后添加新的地形。
Tiled 中有两种基本地图元素:
地形:有若干图块组成,形成一个完整的地形。
图块:单个的图块文件。
在地图中添加可以看到下面不同的效果,其中砖墙和石头墙是地形,而路牌和草丛小石头都是图块:
这里的地图资源尽量和地图放在同一文件夹下,方便导入到 Egret 中。
保存地图数据
上面我们修改了默认的地图desert.tmx
,点击工具栏上面的保存按钮可以将地图保存下来。
导出地图数据
前面在地图属性面板里面可以设置地图的基本信息,这里我们画好地图之后就需要将地图导出来,在文件另存为菜单下可以导出地图数据。
导出的tmx
文件是标准的xml
格式数据文件,可以用其他文本编辑器编辑。
这里我们选择tmx
地图文件。tmx
文件可以被egret支持,其他几种暂时不可以。
也可以参考 Tiled 官方网站:Using the Terrain Tool
在 Egret 中使用 Tiled
获取 Tiled 第三方库
可以在 github 上找到由 Egret 官方维护的 tiled 第三方库。
点此进入 tiled 库。
当然可以在 Egret Game Library下载其他官方维护的库。
下载下来的tiled文件夹包含两个文件夹其中,libsrc就是tiled库了。demo文件夹是一个完整的使用tiled的示例。
在 Egret 项目中引入tiled
模块
这里新建一个 Egret 工程TiledDemo
,将上面包含tiled
库的libsrc
文件夹放置在 Egret 工程外部,如下:
修改 Egret 工程内根目录下的egretProperties.json
,在modules
下添加tiled
模块:
{
"name": "tiled",
"path": "../libsrc"
}
这里需要填入正确的
path
,该路径是相对 Egret 工程来设置的。
然后编译引擎egret build -e
即可。
如果是在 Wing 中可以通过编译引擎按钮来编译 Egret 项目引擎。
现在可以使用tiled
模块的 API 了。
加载 tiled
地图
首先需要在 Egret 项目中准备好资源。
注意: Egret 中还不支持载入
tsx
文件,所以需要把上面Tiled
的默认示例desert.tmx
中的
<tileset firstgid="1" source="desert.tsx"/>
修改为:
<tileset firstgid="1" name="Desert" tilewidth="32" tileheight="32" spacing="1" margin="1" tilecount="48"> <p_w_picpath source="tmw_desert_spacing.png" width="265" height="199"/> </tileset>
这里需要注意的是p_w_picpath
的source
属性,确保路径是可以被访问到的。
将修改好的 desert.tmx
和图片资源文件tmw_desert_spacing.png
、hexmini.png
拷贝到 Egret 项目的 resource
文件夹下:
载入desert.tmx
参照下面代码:
class Main extends egret.DisplayObjectContainer {
/*设置请求*/
private request:egret.HttpRequest;
/*设置资源加载路径*/
private url:string;
public constructor() {
super();
this.once(egret.Event.ADDED_TO_STAGE,this.onAddToStage,this);
}
/*加载地图*/
private onAddToStage () {
/*初始化资源加载路径*/
this.url = "resource/desert.tmx";
/*初始化请求*/
this.request = new egret.HttpRequest();
/*监听资源加载完成事件*/
this.request.once( egret.Event.COMPLETE,this.onMapComplete,this);
/*发送请求*/
this.request.open(this.url,egret.HttpMethod.GET);
this.request.send();
}
/*地图加载完成*/
private onMapComplete( event:egret.Event ) {
/*获取到地图数据*/
var data:any = egret.XML.parse(event.currentTarget.response);
/*初始化地图*/
var tmxTileMap: tiled.TMXTilemap = new tiled.TMXTilemap(2000, 2000, data, this.url);
tmxTileMap.render();
/*将地图添加到显示列表*/
this.addChild(tmxTileMap);
}
}
首先通过 egret.HttpRequest
发送了一个 GET 请求,地址就是resource/desert.tmx
。并监听加载完成事件。通过下面这行代码来获得地图信息:
var data:any = egret.XML.parse(event.currentTarget.response);
之后初始化了地图:
var tmxTileMap: tiled.TMXTilemap = new tiled.TMXTilemap(2000, 2000, data, this.url);
这里需要注意的是 tiled.TMXTilemap(w,h,data,url) 中的四个参数分别是地图的长宽,地图数据和地图的url。
之后通过render()
方法渲染地图并将地图添加到显示列表。
需要注意的是 tiled.TMXTilemap 对象在 Egret 项目中也是一个显示对象。需要添加到显示列表当中让他显示出来。
移动地图
可以像操作其他显示对象一样操作 tiled.TMXTilemap
对象,比如添加触摸和设置位置等。在onMapComplete
中添加如下代码:
tmxTileMap.touchEnabled = true;
tmxTileMap.addEventListener(egret.TouchEvent.TOUCH_TAP,this.move,this);
并添加 move
方法:
private move(event:egret.TouchEvent) {
event.target.x -= 5;
event.target.y -= 5;
}
这样当鼠标点击的时候就可以见到移动的地图了。