检测作为Line的SKShapeNode上的Touch

时间:2014-07-01 03:24:01

标签: swift sprite-kit cgpath skshapenode

我有一个我创建的SKShapeNode并给了一个CGPath。这是我在didMoveToView中的GameScene.swift:

let myNode = SKShapeNode()
let lineToDraw = CGPathCreateMutable()
CGPathMoveToPoint(lineToDraw, nil, 0, 0)
CGPathAddLineToPoint(lineToDraw, nil, 87, 120)
myNode.path = lineToDraw
myNode.strokeColor = SKColor.redColor()
myNode.lineWidth = 20
myNode.name = "My Node!"
world.addChild(myNode) // World is a higher-level node in my scene

这就是我在场景中检测触摸的方式:

override func touchesEnded(touches: NSSet!, withEvent event: UIEvent!) {
    if let touch = touches.anyObject() as? UITouch {
        if let shapeNode = nodeAtPoint(touch.locationInNode(self)) as? SKShapeNode {
            println("Touched \(shapeNode.name)")
        } else {
            println("Nothing here")
        }
    }
}

线路节点显示没有问题。但是,它根本没有注册touchesEnded。

真的,我有三个问题模糊不清:

  1. 有没有更好的方法来创建一个SKShapeNode,它是两点之间的一条线而不调用便利初始值设定项?我计划继承SKShapeNode以向节点添加额外的逻辑,并且子类无法访问超类的便利初始化器。

  2. 更重要的是,如何让场景识别我的线路节点并触发touchesEnded?

  3. 有没有办法,使用这种机制,我可以使它更“模糊”,所以它处理接近线的触摸,而不是在线?我最终的计划是让它更薄,但我仍然希望有一个大的触摸区。我想,如果没有别的,我可以创建两个节点:一个清晰/厚,另一个红/薄,并处理清晰的触摸事件,但我想知道是否有更好的方法。

1 个答案:

答案 0 :(得分:2)

在回答您的主要问题时,您的touchesEnded方法存在问题。 apple显示的模板建议采用以下布局:

override func touchesEnded(touches: NSSet, withEvent event: UIEvent) {
        for touch: AnyObject in touches {
            let location = touch.locationInNode(self)
    }
}

然后你可以使用这个方法来查看location值是否在行框内(为了做到这一点,我在didMoveToView之外创建了" myNode"变量以便我可以从其他功能中访问它:

override func touchesEnded(touches: NSSet, withEvent event: UIEvent) {
        for touch: AnyObject in touches {
            let location = touch.locationInNode(world)

            if CGRectContainsPoint(myNode.frame, location) {
                println("Touched \(myNode.name)")

            } else {

                println("Nothing here")
        }

    }
}

至于"模糊"你可以简单地检查一下更大的CGRect。在上面的代码中,我检查myNode.frame,但您可以创建一个带有CGRect的变量,该变量略大于该行,以便您可以检测到不直接命中它的触摸。

至于更简洁的代码,我现在想不出任何代码,但并不是说没有办法。但是,我不太明白你对无法访问便捷方法的子类的意思,因为只要你正确导入它们就可以访问超类所做的任何事情。

我希望这会有所帮助。