2017-04-20 66 views
0

基本上我有地面,球員(雷蒙德)和硬幣。 當玩家接觸地面時不會發生任何事情,遊戲繼續正常進行。當玩家與硬幣接觸時,我想讓它打印以控制「硬幣與玩家的接觸」。雪碧套件接觸檢測

enum ColliderType: UInt32 { 
    case Raymond = 1 
    case Object = 2 
    case Coin = 3 
} 

Raymonds物理

raymond.physicsBody = SKPhysicsBody(circleOfRadius: raymondTexture.size().height/2) 
    raymond.physicsBody!.dynamic = true 

    raymond.physicsBody!.categoryBitMask = ColliderType.Raymond.rawValue 
    raymond.physicsBody?.contactTestBitMask = ColliderType.Object.rawValue 
    raymond.physicsBody?.collisionBitMask = ColliderType.Object.rawValue 

硬幣物理

 coin.physicsBody = SKPhysicsBody(circleOfRadius: raymondTexture.size().height/2) 
    coin.physicsBody!.dynamic = true 

    coin.physicsBody!.categoryBitMask = ColliderType.Coin.rawValue 
    coin.physicsBody?.contactTestBitMask = ColliderType.Raymond.rawValue 
    coin.physicsBody?.collisionBitMask = ColliderType.Object.rawValue 

地面物理,如果你需要

 ground.physicsBody = SKPhysicsBody(rectangleOfSize: CGSizeMake(self.frame.size.width, 1)) 
    ground.physicsBody!.dynamic = false 
    ground.physicsBody!.categoryBitMask = ColliderType.Object.rawValue 
    ground.physicsBody?.contactTestBitMask = ColliderType.Object.rawValue 
    ground.physicsBody?.collisionBitMask = ColliderType.Object.rawValue 

繼承人的接觸功能我有,我知道它錯了,我需要幫助如何檢測硬幣和雷蒙德接觸。

func didBeginContact(contact: SKPhysicsContact) { 
    print("coin contact with player") 

} 

在此先感謝。

+0

您可以添加更多的代碼,最好是當你的國家物理 –

+0

@OrenEdrich DONE 。 –

+1

您沒有正確使用位掩碼,3代表00000000000000000000000000000011,這實際上意味着對象和Raym0nd。你需要以2的權力工作,所以下一個可行的數字是4(1,2,4,8,16,32)如果你想讓它可讀,那麼使用(1 << 2)代表你的硬幣(1 << 0)爲你的物體,和(1 << 1)爲你的雷蒙德 – Knight0fDragon

回答

0

確實有幾種檢查方法,下面是最基本的兩種方法來開始。第一個檢查聯繫人姓名,第二個檢查CategoryBitMask。值得注意的是,如果您的PhysicsBody位掩碼沒有正確設置,則可能永遠不會在2個對象之間報告連接。

編輯確保現場符合SKPhysicsContactDelegate

class GameScene: SKScene, SKPhysicsContactDelegate 

...

func didBegin(_ contact: SKPhysicsContact) { 

    let contactAName = contact.bodyA.node?.name 
    let contactBName = contact.bodyB.node?.name 

    if (contactAName == "raymond") || (contactBName == "raymond") { 

     if (contactAName == "coin") || (contactBName == "coin") { 
      print("coin contact with player") 
      return 
     } 
    } 

    //or 

    if contact.bodyA.categoryBitMask == ColliderType.Coin || contact.bodyB.categoryBitMask == ColliderType.Coin { 

     if contact.bodyA.categoryBitMask == ColliderType.Raymond || contact.bodyB.categoryBitMask == ColliderType.Raymond { 
      print("coin contact with player") 
      return 
     } 
    } 
} 
+0

謝謝你的快速回答,我的物理體設置是否正確?他們似乎是 –

+0

。儘管 –

+0

沒問題,但當raymond和硬幣碰觸時,您並不需要rawValue,但它不會打印到控制檯。 –