我目前正在尝试使用cocos2d中的对象将精灵添加到等距平铺TMX地图。问题是来自TMX对象的X和Y元数据是标准2d格式(像素x,像素y),而不是等距网格X和Y格式。通常情况下,你只需将它们除以瓦片大小,但等距需要某种变换。从标准X,Y坐标获取等距网格坐标
上。例如尺寸40个瓦片由40瓦的物体在一个64×32等距tilemap的(20,21)的坐标出来为(640584)
所以,问题确实是得到什么式(20, 21)从(640,584)?
我目前正在尝试使用cocos2d中的对象将精灵添加到等距平铺TMX地图。问题是来自TMX对象的X和Y元数据是标准2d格式(像素x,像素y),而不是等距网格X和Y格式。通常情况下,你只需将它们除以瓦片大小,但等距需要某种变换。从标准X,Y坐标获取等距网格坐标
上。例如尺寸40个瓦片由40瓦的物体在一个64×32等距tilemap的(20,21)的坐标出来为(640584)
所以,问题确实是得到什么式(20, 21)从(640,584)?
Wikipedia's isometric projection article是你的朋友在这里。在数学部分:
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是你通过一些角α(第一基体),然后β(第二矩阵)中,s = SIN(阿尔法)旋转得到的矢量,C = COS(阿尔法),s'= sin(beta),c'= cos(beta)。然后,您预计,到2D通过预乘C:
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
要获得数字变换,使用自己的α和β值生成系数。
直接从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;
}
这是如何使用的?如果我尝试[UIAppDelegate.tileMap.layer positionForIsoAt:tilePos]它说:“请求成员层的东西不是一个结构或联合”,该方法没有在CCTMXLayer.h中公开 – RSH1
你不是在做3D?只是一个平面的东西的等距视图? – phkahler