精灵套件接触检测

时间:2017-04-20 13:59:04

标签: ios swift sprite-kit

基本上我有地面,玩家(雷蒙德)和硬币。 当玩家触地时不会发生任何事情,游戏继续正常进行。当玩家接触到硬币时,我希望它能够打印到控制台"硬币接触玩家"。

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

Raymonds physics

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")

}

提前致谢。

1 个答案:

答案 0 :(得分:0)

确实有几种方法可以检查这一点,以下是帮助您入门的两种最基本的方法。第一个检查联系人的名称,第二个检查CategoryBitMask。值得注意的是,如果没有正确设置您的PhysicsBodies位掩码,则可能永远不会在两个对象之间报告联系。

  

编辑确保场景符合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
        }
    }
}