1

タイルマップを使用するプロジェクトがあります。低解像度 (29x29 タイルサイズ) と高解像度 (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 でのみ、Retina タイルマップを使用すると機能しません。賢い誰かがこれを HD で機能させる方法を思い付くことができますか? 低解像度でも動作する必要はありません。サブ iOS 7 をサポートする予定はありません。

ご存知かもしれませんが、cocos2d が HD へのサイズ変更を行います。(2倍して)

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;

ここでは、ヨル マップの 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 に答える