我在iOS8.3上使用iOS SpriteKit Game Swift模板。我正在嘗試使用功能func intersectsNode(_ node: SKNode) -> Bool
來檢測創建爲SKShapeNodes的兩個圓的重疊。原來這個函數沒有檢測到它的SKShapeNodes的交集。但是在進一步的故障排除中,如果我使用模板的默認Spaceship精靈,則會發現該功能可行。這裏是其中工程的代碼:iOS Spritekit intersectsnode不適用於SKShapeNode
override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent) {
/* Called when a touch begins */
for touch in (touches as! Set<UITouch>) {
let location = touch.locationInNode(self)
let sprite = SKSpriteNode(imageNamed:"Spaceship")
sprite.xScale = 0.3
sprite.yScale = 0.3
sprite.position = location
self.circles.append(sprite)
self.addChild(sprite)
if circles.count == 1 {
println("One circle")
} else {
for var index = 0; index < circles.count-1; ++index {
if sprite.intersectsNode(circles[index]) {
println(circles[index].frame)
println("Circle intersects another")
}
}
}
}
}
當兩個精靈在上述代碼中的函數返回YES並打印的交點串重疊。這是不工作的代碼:
override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent) {
/* Called when a touch begins */
for touch in (touches as! Set<UITouch>) {
let location = touch.locationInNode(self)
let sprite = SKShapeNode(circleOfRadius: 50)
sprite.position = location
self.circles.append(sprite)
self.addChild(sprite)
if circles.count == 1 {
println("One circle")
} else {
for var index = 0; index < circles.count-1; ++index {
if sprite.intersectsNode(circles[index]) {
println(circles[index].frame)
println("Circle intersects another")
}
}
}
}
}
正如你所看到的代碼塊是除了在一個情況下,它的SKSpriteNode和其他情況下,其SKShapeNode完全一致。我還打印了SKShapeNode Circles的框架,我可以看到它們有有效的框架。所以我很困惑,因爲我現在想在我的代碼中使用SKShapeNodes,但是我不能使用intersectNode函數,因爲它不起作用。
檢查節點的邊界框。框架的大小和位置。順便說一句,如果你認爲intersectNode是一個智能功能,那真的不是。它只是檢查兩個幀是否共享任何點。如果節點與圓的邊界框的拐角相交,則會被視爲相交。 –
我很喜歡邊框觸摸和函數返回YES。但是對我而言沒有任何事情發生我已經用Circles和Rects嘗試過了。看起來像intersectNode只是不考慮SKShapeNodes值得回答,只喜歡SKSpriteNodes。除非我做錯了什麼。你可以在默認的iOS Swift Game模板中試試我的代碼。你只需要用我上面的那個替換'touchesBegan'方法。 – nata11
你有可能嘗試將skshapenode作爲skspritenode包含嗎?嘗試添加skshapenode作爲一個孩子。如果您需要訪問它並且不想將其聲明爲變量,則有一個有用的名稱屬性 –