Мне удалось загрузить и отобразить изометрическую карту с помощью 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)
}
Благодарим за помощь, ответ кажется настолько очевидным. Я пытался усложнить его. – Tomoso