2013-08-13 1 views
1

У меня есть проект, который использует tilemap. У меня есть отдельная табличная карта для low-res (29x29 Tilesize) и high-res (58x58). У меня есть эти методы для вычисления tileCoord в положение и обратно.Плитка к конверсии CGPoint с дисплеем Retina

- (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 и я honeslty не понимаю, как это работает, и почему он должен быть настолько сложным. Но это не работает, когда я использую сетчатые фрагменты, только на 480x320. Может ли кто-нибудь умный придумать способ сделать эту работу для HD? Также не нужно работать с низким разрешением, я не планирую поддерживать суб-iOS 7.

Я хочу, чтобы выход находился в шкале координат с низким разрешением tho, как вы могли бы знать, cocos2d делает изменение размера для HD для вас. (Путем умножения на два)

+0

«Не должны работать на низком разрешении либо, я не планирую поддерживать суб-IOS 7.» Если вы хотите поддержать IPADS изначально, вам нужно низко -res, потому что iPad mini не является сетчаткой, независимо от версии iOS. –

+0

@robmayoff У меня будет еще одна раскадровка и файл кода для ipad, так как я собираюсь сделать что-то особенное, чтобы использовать все это красивое пространство экрана. –

ответ

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

Здесь вы пытаетесь вычислить вашу карту 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; 
+1

У меня нет шаров, чтобы использовать функции капота, я оставлю это для больших мальчиков –