1

我有一个使用 tilemap 的项目。我有一个单独的低分辨率(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 上。聪明的人能想出一种方法来使这项工作适用于高清吗?也不必在低分辨率上工作,我不打算支持 sub-iOS 7。

我希望输出处于低分辨率坐标范围内,正如您可能知道的那样,cocos2d 会为您调整到 HD 的大小。(乘以二)

4

2 回答 2

1

在这里,您正在尝试计算地图 X 坐标:

int x = position.x / _tileMap.tileSize.width;

这里的问题是(从v0.99.5-rc0 开始,cocos2d 通常使用作为位置,但CCTMXTiledMap总是使用像素作为tileSize. 在低分辨率设备上,1 点 = 1 像素,但在 Retina 设备上,1 点 = 2像素。因此,在 Retina 设备上,您需要乘以 2。

您可以使用CC_CONTENT_SCALE_FACTOR()宏来解决此问题:

int x = CC_CONTENT_SCALE_FACTOR() * position.x / _tileMap.tileSize.width;

在这里,您正在尝试计算 yoru 地图 Y 坐标:

int y = ((_tileMap.mapSize.height * _tileMap.tileSize.height) - position.y) / _tileMap.tileSize.height;

这里的额外数学试图解释 Cocos2D 的法线坐标系和地图的翻转坐标系之间的差异。在标准笛卡尔坐标中,原点位于左下方,Y 坐标随着您向上移动而增加。在翻转坐标系中,原点位于左上角,向下移动时 Y 坐标增加。因此,您必须从地图的高度(以场景单位,即点)中减去您所在位置的 Y 坐标,以将其翻转为地图坐标。

问题再次是_tileMap.tileSize像素,而不是点。您可以再次使用以下方法解决此问题CC_CONTENT_SCALE_FACTOR()

CGFloat tileHeight = _tileMap.tileSize.height / CC_CONTENT_SCALE_FACTOR();
int y = ((_tileMap.mapSize.height * tileHeight) - position.y) / tileHeight;
于 2013-08-13T19:43:01.940 回答
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);
}
于 2013-08-13T19:19:51.110 回答