我有一个我创建的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。
真的,我有三个问题模糊不清:
有没有更好的方法来创建一个SKShapeNode,它是两点之间的一条线而不调用便利初始值设定项?我计划继承SKShapeNode以向节点添加额外的逻辑,并且子类无法访问超类的便利初始化器。
更重要的是,如何让场景识别我的线路节点并触发touchesEnded?
有没有办法,使用这种机制,我可以使它更“模糊”,所以它处理接近线的触摸,而不是在线?我最终的计划是让它更薄,但我仍然希望有一个大的触摸区。我想,如果没有别的,我可以创建两个节点:一个清晰/厚,另一个红/薄,并处理清晰的触摸事件,但我想知道是否有更好的方法。
答案 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的变量,该变量略大于该行,以便您可以检测到不直接命中它的触摸。
至于更简洁的代码,我现在想不出任何代码,但并不是说没有办法。但是,我不太明白你对无法访问便捷方法的子类的意思,因为只要你正确导入它们就可以访问超类所做的任何事情。
我希望这会有所帮助。