egret 使用 tiledMap时 用getObjectById()获取对象层里的对象 遇到的坑

 

制作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获取对象层里的具体对象了。

或者

就可以啦。

【第一次发文章,还请多多包涵。有哪里描述的不清晰的,欢迎评论。】

参与评论 您还未登录,请先 登录 后发表或查看评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页

打赏作者

Mr丶Xie

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值