Swift Spritekit изометрическая карта с сенсорным расположением
Я начал делать небольшой проект swift / spritekit, чтобы обучить себя разработке игр. Все начинается с изометрической карты, которую мне удалось нарисовать. Но у меня проблемы с получением точного местоположения касания на разных тайлах карты. Это работает, но немного неуместно и не кажется последовательным.
Вот мои функции:
class PlayScene: SKScene {
let map = SKNode()
override func didMoveToView(view: SKView) {
let origin = view.frame.origin
let mapOrigin = CGPointMake(origin.x + self.frame.width / 4, origin.y - self.frame.height / 4)
let mapConfig: Int[][] =
[[0, 0, 0, 0, 1, 0, 0, 0],
[0, 0, 0, 0, 1, 0, 0, 0],
[0, 0, 0, 0, 1, 0, 0, 0],
[2, 2, 2, 2, 1, 2, 2, 2],
[0, 0, 0, 0, 1, 0, 0, 0],
[0, 0, 0, 0, 1, 0, 0, 0],
[0, 0, 0, 0, 1, 0, 0, 0],
[0, 0, 0, 0, 1, 0, 0, 0]]
drawMap(mapConfig, mapOrigin: mapOrigin)
}
С :
func drawMap(mapConfig:Int[][], mapOrigin:CGPoint)
{
let tileHeight:CGFloat = 25.5
let numColumns:Int = 8
let numRows:Int = 8
var position = mapOrigin
var column: Int = 0
var row: Int = 0
for column = 0; column < numColumns; column++
{
for row = 0; row < numRows; row++
{
position.x = mapOrigin.x + CGFloat(column) * tileHeight
position.y = mapOrigin.y + CGFloat(row) * tileHeight
let isoPosition = twoDToIso(position)
placeTile(isoPosition, mapConfig: mapConfig[row][column])
}
}
self.addChild(map)
}
func placeTile(position:CGPoint, mapConfig:Int)
{
switch mapConfig
{
case 0:
let sprite = SKSpriteNode(imageNamed:"grassTile")
sprite.position = position
sprite.setScale(0.1)
sprite.name = "\(position)"
self.map.addChild(sprite)
case 1:
let sprite = SKSpriteNode(imageNamed:"roadTile")
sprite.position = position
sprite.setScale(0.1)
sprite.name = "\(position)"
self.map.addChild(sprite)
default:
let sprite = SKSpriteNode(imageNamed:"roadTileLTR")
sprite.position = position
sprite.setScale(0.1)
sprite.name = "\(position)"
self.map.addChild(sprite)
}
}
И тогда я хочу скрыть плитку, к которой я прикасаюсь (для тестирования):
override func touchesBegan(touches: NSSet, withEvent event: UIEvent)
{
for touch: AnyObject in touches
{
let locationNode = touch.locationInNode(self)
nodeAtPoint(locationNode).hidden = true
}
}
Но это не всегда скрывает правильную плитку. Так как я должен заняться этим? Мой код в корне неверный (возможно)? Или мне нужно каким-то образом преобразовать местоположение в изо-координаты? Или играть с битовой маской плитки?
Спасибо за вашу помощь в любом случае!