ios - SKTileMapNode:检测触摸的 Tile?

标签 ios sprite-kit touch sktilemapnode

想象一个游戏世界,它只不过是屏幕上有 10x10 方 block 的 SKTileMapNode。

用户触摸了一个图 block 。

SKTileMapNode 是否提供了一种方法来知道哪个图 block 被触摸了?或者是否需要进行坐标搜寻以确定哪个图 block 位于触摸位置?

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

最佳答案

使用 UITapGestureRecognizer,您可以使用 SKTileMapNode 中的 tileDefinition 函数检索触摸的图 block 。

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)
}

关于ios - SKTileMapNode:检测触摸的 Tile?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39812458/

相关文章:

iphone - 在两个 View 之间翻转时如何修复 iOS 泄漏

javascript - 让 Famo.us ScrollView 滚动到末尾

ios - Objective-C 对象放置 iPad

ios - SpriteKit SKAction.playSoundFile - waitForCompletion 不等待

java - 我可以在 Android 中通过按键时的后台应用程序以编程方式生成触摸事件吗?

java - 在 Android 上检测后台的屏幕触摸实例

ios - Swift Facebook SDK 注销

swift - 改变 swift 2 中 Ball Type 的颜色

ios - 使用 SpriteKit 场景呈现 UIAlertController (Objective-C)

html - IE10 css Hover 不适用于触摸设备