SKTileMapNode:检测触摸的Tile?

时间:2016-10-01 23:32:13

标签: ios sprite-kit touch sktilemapnode

想象一下游戏世界除了屏幕上有10x10磁贴的SKTileMapNode之外别无其他。

用户触摸瓷砖。

SKTileMapNode是否提供了一种了解触摸了哪个图块的方法?或者是否需要进行坐标搜索以确定哪个图块位于触摸位置?

还是有其他方法可以做到这一点吗?

1 个答案:

答案 0 :(得分:4)

使用UITapGestureRecognizer,您可以使用tileDefinition中的SKTileMapNode功能检索触摸的图块。

func handleTapFrom(recognizer: UITapGestureRecognizer) {
    if recognizer.state != .ended {
        return
    }

    let recognizorLocation = recognizer.location(in: recognizer.view!)
    let location = self.convertPoint(fromView: recognizorLocation)

    guard let map = childNode(withName: "background") as? SKTileMapNode else {
        fatalError("Background node not loaded")
    }

    let column = map.tileColumnIndex(fromPosition: location)
    let row = map.tileRowIndex(fromPosition: location)
    let tile = map.tileDefinition(atColumn: column, row: row)
}

然后,如果您在TilemapEditor中添加了userData,则可以检索此内容。要包含在userData中的值可能是移动磁贴等的成本。

let data = tile.userData?.value(forKey: "myKey")

使用识别器的优点是可以在不会相互干扰的单独功能中干净地处理Tap,Pan和Long Press。您在SKScene中初始化手势识别器。

override func didMove(to view: SKView) {
    let tapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(self.handleTapFrom(recognizer:)))
    tapGestureRecognizer.numberOfTapsRequired = 1
    view.addGestureRecognizer(tapGestureRecognizer)
}