【发布时间】:2016-10-02 10:41:02
【问题描述】:
想象一个游戏世界,它只不过是一个屏幕上有 10x10 块的 SKTileMapNode。
用户触摸了一个图块。
SKTileMapNode 是否提供了一种方法来知道哪个图块已被触摸?或者是否需要进行坐标搜索以确定哪个图块位于触摸位置?
或者还有其他方法可以做到这一点?
【问题讨论】:
标签: ios sprite-kit touch sktilemapnode
想象一个游戏世界,它只不过是一个屏幕上有 10x10 块的 SKTileMapNode。
用户触摸了一个图块。
SKTileMapNode 是否提供了一种方法来知道哪个图块已被触摸?或者是否需要进行坐标搜索以确定哪个图块位于触摸位置?
或者还有其他方法可以做到这一点?
【问题讨论】:
标签: ios sprite-kit touch sktilemapnode
使用UITapGestureRecognizer,您可以使用SKTileMapNode 中的tileDefinition 函数检索触摸的图块。
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")
使用识别器的优势在于,点击、平移和长按可以在不相互干扰的单独功能中干净利落地处理。您在SKScene 中初始化手势识别器。
override func didMove(to view: SKView) {
let tapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(self.handleTapFrom(recognizer:)))
tapGestureRecognizer.numberOfTapsRequired = 1
view.addGestureRecognizer(tapGestureRecognizer)
}
【讨论】:
UITapGestureRecognizor 的示例更新了答案。这可以用来代替touchesBegan。 Pan 和 Long Press 很相似,但这是另一个问题 :)