制作tiled地图 这里就不说了哈。(可以参考这位大佬的教程 https://blog.csdn.net/Super_Cola/article/details/81084506)
注意点:
1、egret 目前好像只支持 XML、Base64(无压缩)、CSV 三种格式
2、因为这里我用的是egret的tiled库来解析数据的。egret的tiled库目前不支持加载tsx文件(.tsx 是图块文件)。所以添加图块的时候,选择嵌入地图。
如果你未选择嵌入,地图又做好了。怎么办呢?这里有个解决方法:
打开 .tsx文件 把 tileset 标签内容添加到 tmx里面去(注意保留 tmx 里 tileset 标签原有的属性)
好了!此时我们手里有2个文件(.tmx 和 资源图片),把它们copy到项目 resource 里
【下面就是加载数据啦!】
/**
* 创建场景界面
* Create scene interface
*/
protected createGameScene(): void {
this.createScene();
}
/** 加载地图 */
private createScene(): void {
/*初始化资源加载路径*/
this.url = "resource/untitled.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) {
/*获取到地图数据*/
let data: any = egret.XML.parse(event.currentTarget.response); // tmx 其实就是 XML
/*初始化地图*/
let tmxTileMap: tiled.TMXTilemap = this._tmxTileMap = new tiled.TMXTilemap(480, 480, data, this.url);
/*将地图添加到显示列表*/
tmxTileMap.x = 100;
tmxTileMap.y = 500;
this.addChild(tmxTileMap);
tmxTileMap.once(tiled.TMXImageLoadEvent.ALL_IMAGE_COMPLETE, this.onTiledImgComp, this);
tmxTileMap.render(); //渲染
}
private onTiledImgComp(): void {
let objGroup: tiled.TMXObjectGroup[] = this._tmxTileMap.getObjects(); // 获取对象层
let _ID:number = 2; // tiled里对象层下的某个对象的ID(在tiledMap里面自动生成)
let play1: tiled.TMXObject = objGroup[0].getObjectById(ID);
console.log(play1); // 获取对象实例
}
这个时候,我们来看下打印
这时候 就遇到了这位老哥的问题了 https://bbs.egret.com/forum.php?mod=viewthread&tid=27285&highlight=getObjectById
getObjectById() 获取不到对象实例!!!【下面解决办法可能不是最优解,如有更好的办法,欢迎您在评论区留言】
在tiled源码中可以看到:继续看源码,就知道 this._objectHash是在draw里面赋值的
我研究了下 egret的tiled库,大致机制是这样的:调用render() → 加载地图 → 加载图片 → 触发单个图片加载完成事件 → 触发全部图片加载完成事件。draw 是监听“全部图片加载完成”事件的,上面代码中onTiledImgComp方法也是监听这个事件的。所以这里的事件监听优先级必须要比 draw 慢,这样才能保证在调用getObjectById时,draw是执行过了的,也就可以用getObjectById获取对象层里的具体对象了。
或者
就可以啦。
【第一次发文章,还请多多包涵。有哪里描述的不清晰的,欢迎评论。】