При получении индекса с помощью tileColumnIndex
/ tileRowIndex
вам необходимо проверить положение на карте тайлов.В вашем примере вы даете положение для сцены, которое может не совпадать, в зависимости от того, где расположена карта тайлов.
Если вы используете затронутое местоположение на карте, вы должны получить правильные возвращаемые индексы.
let positionInMap = touch.location(in: map)
let column = map.tileColumnIndex(fromPosition: positionInMap)
let row = map.tileRowIndex(fromPosition: positionInMap)
Обновленная версия touchesBegan()
из вашего примера
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
let touch:UITouch = touches.first! as UITouch
let positionInScene = touch.location(in: self)
let touchedNode = self.atPoint(positionInScene)
if(touchedNode.name == "Tile Map Node") {
let map = touchedNode as! (SKTileMapNode)
let positionInMap = touch.location(in: map) // Get the touched position in map
print(map.tileColumnIndex(fromPosition: positionInMap))
print(map.tileRowIndex(fromPosition: positionInMap))
print(map.numberOfColumns)
print(map.numberOfRows)
print(map)
}
}
Чтобы курсор был выровнен по плиткам при использовании centerOfTile
для его позиционирования, добавьте егокак дочерний элемент к карте листов, чтобы убедиться, что они находятся в одной системе координат.В противном случае вам придется добавить необходимые смещения в позицию курсора.
tilemap.addChild(cursor)