2015-06-12 57 views
0

我在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函數,因爲它不起作用。

+1

檢查節點的邊界框。框架的大小和位置。順便說一句,如果你認爲intersectNode是一個智能功能,那真的不是。它只是檢查兩個幀是否共享任何點。如果節點與圓的邊界框的拐角相交,則會被視爲相交。 –

+0

我很喜歡邊框觸摸和函數返回YES。但是對我而言沒有任何事情發生我已經用Circles和Rects嘗試過了。看起來像intersectNode只是不考慮SKShapeNodes值得回答,只喜歡SKSpriteNodes。除非我做錯了什麼。你可以在默認的iOS Swift Game模板中試試我的代碼。你只需要用我上面的那個替換'touchesBegan'方法。 – nata11

+0

你有可能嘗試將skshapenode作爲skspritenode包含嗎?嘗試添加skshapenode作爲一個孩子。如果您需要訪問它並且不想將其聲明爲變量,則有一個有用的名稱屬性 –

回答

1

intersectsNode文檔說這個:

兩個節點被視爲相交,如果他們的幀相交。這個測試中忽略了兩個節點的孩子。

這意味着您在使用圓圈時不會得到想要的結果。

但是,檢查兩個圓是否重疊與檢查它們的中心之間的距離是否小於其半徑的總和一樣容易。

+0

圓形或方形總是有相關的框架。如果我打印框架,我會得到適當的值。但僅僅爲了好玩,我將SKShapeNode改爲了一個矩形,使用下面的'let sprite = SKShapeNode(rectOfSize:CGSizeMake(50.0,50.0))',但仍然不起作用。我知道我可以做檢查重疊的計算,但我也想與其他多邊形一起使用intersectsNode方法。 – nata11