2015-04-18 3 views
0

Мне удалось загрузить и отобразить изометрическую карту с помощью SpriteKit и Swift, написав собственный .TMX-парсер. Ортогональные карты работают нормально, но это мой первый раз, используя изометрические карты, и математика меня сбивает с толку.Как определить размер изометрической карты любого размера?

Мои плитки 64x32, а карта может быть любого размера.

В идеале я хотел бы, чтобы левый край края (плитка в [0, maxRow]) сидел на ноле по оси x, а нижний край самого края (плитка в [maxCol , maxRow]) для сидения на оси 0 y.

Происхождение карты - это плитка наверху. X идет сверху вниз, Y идет сверху вниз.

SpriteKit также имеет обратную ось y. Код ниже - это то, как я позиционирую плитки на основе их коордов и извлекаю их, используя положение на экране. Этот код работает отлично.

Таким образом, чтобы компенсировать исправление положения, чтобы я мог разместить карту, где я хочу, мне нужно найти ширину и высоту изометрической карты любого размера, и я не знаю, с чего начать.

func positionForCoord(col: Int, _ row: Int) -> (x: CGFloat, y: CGFloat) { 

    var x: CGFloat = 0 
    var y: CGFloat = 0 

    x = (CGFloat(col - row) * CGFloat(tileSize.width))/2 
    y = (CGFloat(col + row) * -CGFloat(tileSize.height))/2 

    return (x, y) 
} 

    func coordForPosition(x: CGFloat,_ y: CGFloat) -> (col: Int, row: Int) { 

    var col: Int = 0 
    var row: Int = 0 

    let tileWidthHalved = CGFloat(tileSize.width)/2 
    let tileHeightHalved = CGFloat(tileSize.height)/2 

    col = Int(floor(((x/tileWidthHalved) - ((y - tileHeightHalved)/tileHeightHalved))/2)) 
    row = Int(ceil(((((y - tileHeightHalved)/-tileHeightHalved) - (x/tileWidthHalved))/2))) 


    return (col, row) 
} 

ответ

0

Поскольку вы помечено это с кафелем, один способ начать, посмотрев на исходный код, плиточным, чтобы увидеть, как он вычисляет его. Это действительно только этот маленький кусочек кода в isometricrenderer.cpp:

QSize IsometricRenderer::mapSize() const 
{ 
    // Map width and height contribute equally in both directions 
    const int side = map()->height() + map()->width(); 
    return QSize(side * map()->tileWidth()/2, 
       side * map()->tileHeight()/2); 
} 

Чтобы понять это, я обычно рисую небольшой кусочек изометрической карты на бумаге и посмотреть на то, как ее границы являются производными от его размера плитки. Вы увидите, что для каждой дополнительной строки плитки границы карты растут на ту же сумму, что и для каждого дополнительного столбца плитки. И сумма составляет ровно половину размера плитки.

+0

Благодарим за помощь, ответ кажется настолько очевидным. Я пытался усложнить его. – Tomoso