项目用到 tiledmap, cocos 算是新手, 于是按照文档一点一点的使用, 做到获取 tiled 的世界坐标时, 发现了 TiledLayer.getPositionAt() 这个方法, 用了之后发现输出的坐标位置怎么都对不上
文档里写的倒是简单 “获取指定 tile 的像素坐标”
本来是又自己写了个方法根据 地图size 和 Tiled size 手动计算, 结果倒是精确, 但想着既然官方提供了方法, 应该是不至于不能用吧
于是开始调试, 在我将整个 tiledmap 节点位置稍微移动了一下之后发现 这个输出坐标怎么不变呢? 想来可能输出的是这个 layer 的本地坐标, 按照这个思路去封装了一下代码, 果然是这样 . 代码如下, 写的不好还请见谅
/**
* 获取指定位置的 tile 的世界坐标
* @param tiledLayer
* @param tiledPos
* @returns
*/
GetTileWorldPos(tiledLayer: TiledLayer, tiledPos: Vec2): Vec2 {
//core 这个接口获取的位置是基于 layer 的本地坐标系下的坐标, 不能直接用的, 需要根据 layer 的位置换算成真正的世界坐标
let pos = tiledLayer.getPositionAt(tiledPos);
let layerWorldPosition = tiledLayer.node.worldPosition;
// 由于锚点在左下角, 获取左下角的世界坐标
// halfW, halfH 是tiledmap 尺寸的一半
// gridSize 是 tiled大小, 这里默认是正方形
let leftDownPos = v2(
layerWorldPosition.x - this.halfW * this.gridSize,
layerWorldPosition.y - this.halfH * this.gridSize,
)
let ret = v2(pos.x + leftDownPos.x, pos.y + leftDownPos.y)
// 这里返回的是 tile 左下角的坐标
return ret;
}
问题算是解决了, 但中途经历过调试查资料还是浪费了不少时间, 如果文档稍微写的详细一些那么可以省很多事情, 感觉cocos 的文档写的默认用户是要了解一大堆的东西才看得懂 , 希望官方在文档方面更用些心