使用Retina显示平铺到CGPoint转换

时间:2013-08-13 13:43:29

标签: ios objective-c cocos2d-iphone tile

我有一个使用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)

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()