我有一个使用tilemap的项目。我有一个单独的tile图表用于低分辨率(29x29 Tilesize)和高分辨率(58x58)。我有这些方法来计算tileCoord的位置并再次返回。
- (CGPoint)tileCoordForPosition:(CGPoint)position {
int x = position.x / _tileMap.tileSize.width;
int y = ((_tileMap.mapSize.height * _tileMap.tileSize.height) - position.y) / _tileMap.tileSize.height;
return ccp(x, y);
}
- (CGPoint)positionForTileCoord:(CGPoint)tileCoord {
int x = (tileCoord.x * _tileMap.tileSize.width) + _tileMap.tileSize.width/2;
int y = (_tileMap.mapSize.height * _tileMap.tileSize.height) - (tileCoord.y * _tileMap.tileSize.height) - _tileMap.tileSize.height/2;
return ccp(x, y);
}
我从RayWenderLich那里得到了这个,并且我很难理解它是如何工作的,以及为什么它必须如此复杂。但是当我使用视网膜平铺贴图时,这不起作用,仅适用于480x320。有人可以巧妙地想出一种方法来使这项工作为高清?也不必在低分辨率上工作,我不打算支持子iOS 7.
我希望输出处于低分辨率坐标比例中,正如您所知,cocos2d会为您调整HD的大小。 (乘以2)
答案 0 :(得分:1)
我认为这会有用
- (CGPoint)tileCoordForPosition:(CGPoint)position {
int x = position.x/29;
int y = ((11*29)-position.y) / 29;
return ccp(x, y);
}
- (CGPoint)positionForTileCoord:(CGPoint)tileCoord {
double x = tileCoord.x * 29 + 14.5;
double y = (11*29) - (tileCoord.y * 29) - 14.5;
return ccp(x, y);
}
答案 1 :(得分:1)
在这里,您尝试计算地图X坐标:
int x = position.x / _tileMap.tileSize.width;
问题在于(截至v0.99.5-rc0,cocos2d通常使用点作为位置,但CCTMXTiledMap
始终使用像素作为{{ 1}}。在低分辨率设备上,1点= 1像素,但在Retina设备上,1点= 2像素。因此在Retina设备上,您需要乘以2。
您可以使用tileSize
宏来解决此问题:
CC_CONTENT_SCALE_FACTOR()
这里你试图计算yoru地图Y坐标:
int x = CC_CONTENT_SCALE_FACTOR() * position.x / _tileMap.tileSize.width;
这里的额外数学试图解释Cocos2D的法线坐标系与地图的翻转坐标系之间的差异。在标准笛卡尔坐标系中,原点位于左下方,Y坐标随着向上移动而增加。在翻转坐标系中,原点位于左上方,Y坐标随着向下移动而增加。因此,您必须从地图的高度(以场景单位,即点)减去位置的Y坐标,以将其翻转为地图坐标。
问题再次出现int y = ((_tileMap.mapSize.height * _tileMap.tileSize.height) - position.y) / _tileMap.tileSize.height;
以像素为单位,而非点数。您可以使用_tileMap.tileSize
:
CC_CONTENT_SCALE_FACTOR()