我目前正在尝试使用 cocos2d 中的对象将精灵添加到等距平铺 TMX 地图。问题是来自 TMX 对象的 X 和 Y 元数据是标准的 2d 格式(像素 x,像素 y),而不是等距网格 X 和 Y 格式。通常您只需将它们除以图块大小,但等距需要某种变换。
例如,在 64x32 大小为 40 瓦乘 40 瓦的等距瓦片地图上,位于 (20,21) 坐标处的对象显示为 (640,584)
所以问题真的是从 (640,584) 得到 (20,21) 的公式是什么?
我目前正在尝试使用 cocos2d 中的对象将精灵添加到等距平铺 TMX 地图。问题是来自 TMX 对象的 X 和 Y 元数据是标准的 2d 格式(像素 x,像素 y),而不是等距网格 X 和 Y 格式。通常您只需将它们除以图块大小,但等距需要某种变换。
例如,在 64x32 大小为 40 瓦乘 40 瓦的等距瓦片地图上,位于 (20,21) 坐标处的对象显示为 (640,584)
所以问题真的是从 (640,584) 得到 (20,21) 的公式是什么?
直接来自 cocos2d 的 CCTMXLayer 源代码:
-(CGPoint) positionForIsoAt:(CGPoint)pos
{
CGPoint xy = {
mapTileSize_.width /2 * ( layerSize_.width + pos.x - pos.y - 1),
mapTileSize_.height /2 * (( layerSize_.height * 2 - pos.x - pos.y) - 2),
};
return xy;
}
维基百科的等距投影文章是你的朋友。在数学部分:
cx | 1 0 0 | | c' 0 -s' | ax
cy = | 0 c s | | 0 1 0 | ay
cz | 0 -s c | | s' 0 c' | az
其中 c 是通过某个角度 alpha(第一个矩阵)然后 beta(第二个矩阵)旋转 a 得到的向量,s = sin(alpha), c = cos(alpha), s' = sin(beta), c' = cos(测试版)。然后通过预乘 c 将其投影到 2d 上:
vx | 1 0 0 | cx
vy = | 0 1 0 | cy
vz | 0 0 1 | cz
将所有这些矩阵变换合并为一个:
vx | c' 0 -s' | ax
vy = | ss' c sc' | ay
vz | 0 0 0 | az
要获得数字转换,请使用您自己的 alpha 和 beta 值来生成系数。