Swift SpriteKit碰撞多次注册

时间:2015-12-30 01:11:32

标签: swift sprite-kit collision-detection skphysicsbody

我使用SpriteKit和Swift构建iPhone游戏,我的碰撞检测系统无法正常运行。当我的"子弹"物理机构和我的"播放器"物理体碰撞,碰撞检测功能被多次调用,通常为4-12次。我试过设置" usesPreciseCollisionDetection"是真的,但仍然存在问题。此外,当子弹以一定角度而不是直接击中玩家时,似乎更多次调用该方法。有任何想法如何解决这个问题?

碰撞类型:

enum ColliderType:UInt32 {
    case Player = 0b1
    case Bullet = 0b10
}

玩家物理身体设置:

playerBody!.categoryBitMask = ColliderType.Player.rawValue
playerBody!.contactTestBitMask = ColliderType.Bullet.rawValue
playerBody!.collisionBitMask = ColliderType.Bullet.rawValue

Bullet Physics Body Settings:

bulletBody!.categoryBitMask = ColliderType.Bullet.rawValue
bulletBody!.contactTestBitMask = ColliderType.Player.rawValue
bulletBody!.collisionBitMask = ColliderType.Player.rawValue

碰撞检测方法:

func didBeginContact(contact: SKPhysicsContact) {

    if (contact.bodyA.categoryBitMask == 0b1) && (contact.bodyB.categoryBitMask == 0b10) {
        playerVbullet(contact.bodyA, bullet: contact.bodyB)
    }

    if (contact.bodyA.categoryBitMask == 0b10) && (contact.bodyB.categoryBitMask == 0b11) {
        playerVbullet(contact.bodyB, bullet: contact.bodyA)
    }
}

碰撞时调用的函数:

func playerVbullet(player:SKPhysicsBody, bullet:SKPhysicsBody) {
    bullet.node?.removeFromParent()
    collisions++
    println(collisions)
}

1 个答案:

答案 0 :(得分:1)

为您的项目符号节点命名:

let bullet = SKSPriteNode()
bullet.name = "bullet"

然后检查您的物理联系

if (contact.bodyA.node?.name == "bullet") {
    contact.bodyA.node?.removeFromParent()
} else if contact.bodyB.node?.name == "bullet" {
    contact.bodyB.node?.removeFromParent()
}
祝你好运!