我目前正在嘗試使用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