2012-05-21 233 views
0

我目前正在尝试使用cocos2d中的对象将精灵添加到等距平铺TMX地图。问题是来自TMX对象的X和Y元数据是标准2d格式(像素x,像素y),而不是等距网格X和Y格式。通常情况下,你只需将它们除以瓦片大小,但等距需要某种变换。从标准X,Y坐标获取等距网格坐标

上。例如尺寸40个瓦片由40瓦的物体在一个64×32等距tilemap的(20,21)的坐标出来为(640584)

所以,问题确实是得到什么式(20, 21)从(640,584)?

+0

你不是在做3D?只是一个平面的东西的等距视图? – phkahler

回答

0

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 

要获得数字变换,使用自己的α和β值生成系数。

1

直接从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; 
} 
+0

这是如何使用的?如果我尝试[UIAppDelegate.tileMap.layer positionForIsoAt:tilePos]它说:“请求成员层的东西不是一个结构或联合”,该方法没有在CCTMXLayer.h中公开 – RSH1