2016-04-26 32 views
1

在我的遊戲中,當遊戲開始時,一些節點已經聯繫,但我沒有找到如何檢測這些聯繫人。我只能成功地檢測節點移動時發生的聯繫,並在遊戲中使用函數didBeginContact進行聯繫。SpriteKit/Swift - 如何檢查兩個節點已經聯繫的聯繫人

任何人有一個想法,請如何檢測這些聯繫人?

這是我didBeginContact如果需要的話:

func didBeginContact(contact: SKPhysicsContact) { 

    var firstBody: SKPhysicsBody 
    var secondBody: SKPhysicsBody 
    if contact.bodyA.categoryBitMask == contact.bodyB.categoryBitMask { 
     firstBody = contact.bodyA 
     secondBody = contact.bodyB 

     contactsList.append([firstBody.node!,secondBody.node!]) 
    } 
} 
+0

不錯的問題,我猜sprite節點開始遊戲觸摸不適用於didBeginContact。我認爲你唯一的選擇是didEndContact,但這似乎並不是你想要的。 – Steve

+0

如果didBeginContact被調用2個已經接觸的物體,你測試了嗎?從邏輯上講,我認爲在場景第一遍時,如果物理引擎發現2個物理體重疊,它將調用didBeginContact。然後,它們會將這些物體添加到列表中,如果它們仍然觸摸,則不會在下一個通道中調用didBeginContact,但如果它們不再接觸並將它們從列表中移除,則調用didEndContact。 –

+0

感謝您的回答,不幸的是didBeginContact沒有被調用。我的確如你所說的那樣做了! – Oscar

回答

1

我只是想提出兩個精靈從一開始重疊,併爲我檢測到接觸。下面是代碼:

import SpriteKit 

struct Collider { 
    static let SmallSquare  : UInt32 = 1 << 0 
    static let BigSquare  : UInt32 = 1 << 1 
} 

class GameScene: SKScene, SKPhysicsContactDelegate { 

    override func didMoveToView(view: SKView) { 

     self.physicsWorld.contactDelegate = self 

     let smallSquare = SKSpriteNode(color: .orangeColor(), size: CGSize(width: 50, height:50)) 
     smallSquare.zPosition = 2 
     smallSquare.position = CGPoint(x: frame.midX, y: frame.midY) 
     smallSquare.physicsBody = SKPhysicsBody(rectangleOfSize: smallSquare.size) 
     smallSquare.physicsBody?.affectedByGravity = false 
     smallSquare.physicsBody?.categoryBitMask = Collider.SmallSquare 
     smallSquare.physicsBody?.contactTestBitMask = Collider.BigSquare 
     smallSquare.physicsBody?.collisionBitMask = 0 
     addChild(smallSquare) 

     let bigSquare = SKSpriteNode(color: .purpleColor(), size: CGSize(width: 200, height: 200)) 
     bigSquare.zPosition = 1 
     bigSquare.position = CGPoint(x: frame.midX, y: frame.midY) 
     bigSquare.physicsBody = SKPhysicsBody(rectangleOfSize: bigSquare.size) 
     bigSquare.physicsBody?.affectedByGravity = false 
     bigSquare.physicsBody?.categoryBitMask = Collider.BigSquare 
     bigSquare.physicsBody?.contactTestBitMask = Collider.SmallSquare 
     bigSquare.physicsBody?.collisionBitMask = 0 
     addChild(bigSquare) 

    } 

    func didBeginContact(contact: SKPhysicsContact) { 

     print("Contact detected") 
    }  
} 

後來,適當地檢測某些團體之間的接觸,你應該做這樣的事情:

func didBeginContact(contact: SKPhysicsContact) { 

     var firstBody, secondBody: SKPhysicsBody 

     if contact.bodyA.categoryBitMask < contact.bodyB.categoryBitMask { 

      firstBody = contact.bodyA 
      secondBody = contact.bodyB 
     } else { 

      firstBody = contact.bodyB 
      secondBody = contact.bodyA 
     } 


     if ((firstBody.categoryBitMask & Collider.SmallSquare) != 0 && 
      (secondBody.categoryBitMask & Collider.BigSquare != 0)) { 

       print ("Contact detected") 
     } 

    } 

但即使沒有,將要打印的消息時遊戲第一次開始,因爲無論如何物理世界都會檢測到接觸。

相關問題