2015-06-19 27 views
0

我有一個奇怪的行爲SKPhysicsbody即使不直接接觸物理體

首先讓我告訴你我的主要節點:

self.physicsWorld.contactDelegate = self 
self.physicsWorld.gravity = CGVectorMake(0, 0) 
self.physicsBody = SKPhysicsBody(rectangleOfSize: self.frame.size) 
self.physicsBody!.collisionBitMask = player 
self.physicsBody!.categoryBitMask = wall 
self.physicsBody!.contactTestBitMask = player 
self.physicsBody?.dynamic = true 
self.name = "background" 

現在最重要的是,有沒有任何physicsbody另一個SKSpriteNode,姑且稱之爲path

一段時間後,我產生另一個節點,在該path頂部的playernode:

playerNode = SKSpriteNode(color: UIColor.blackColor(), size: CGSizeMake(tileSize/1, tileSize/1)) 
playerNode.position = CGPointMake(self.frame.width/2, self.frame.height/2) 
playerNode.zPosition = 3 

playerNode.name = "player" 

playerNode.physicsBody = SKPhysicsBody(rectangleOfSize: playerNode.size) 
playerNode.physicsBody!.categoryBitMask = player 
playerNode.physicsBody!.collisionBitMask = wall 
playerNode.physicsBody!.contactTestBitMask = wall 
playerNode.physicsBody?.dynamic = false 
在我看來

所以,didBeginContact應該只觸發如果playerNodepath節點之外,如果移動它真的觸及了背景。

但目前,didBeginContact觸發我立即在我的path之上產生我的playerNode後。

我錯過了什麼嗎?

回答

0

有點麻煩理解..但它聽起來像是你想檢測你的播放節點何時退出你的路徑節點的位置。

它觸發了一個物理接觸,因爲無論如何,你的播放器節點總是與你的場景的物理體相交。

在現實中你不需要任何物理學。在你的更新方法中,你可以檢查你的播放器是否與你的路徑節點相交(或你關心的節點)。如果它不相交的,那麼它直接坐在你的世界,場景等

更新的內部:

if !playerNode.intersectsNode(path) { 
    // your code here 
+0

的問題是,我的背景始終是我的節點後面。我應該能夠檢查我的節點是否觸及了我的背景,或者我的播放器和背景節點之間是否有節點。 – Christian

+0

您可以通過檢查以查看您的節點是否與任何其他節點相交。這就是我上面所描述的。 – hamobi

+0

@Christian如果內存服務器正確地處理物理實體忽略層,子和zPositions。這意味着如果你的路徑在一個物理體內,並且你將一個新的物理體添加到路徑中,如果路徑在第一個物理體內,它將觸發didBeginContact。這聽起來像你試圖檢測玩家何時離開路徑。 Hamobi是正確的,你不需要物理學來檢測它,你可以檢查它是否仍然與節點相交。 –