两个SpriteNodes之间的问题联系

时间:2015-10-29 18:45:55

标签: swift sprite-kit swift2

我的func联系人遇到问题,因为第二个联系人没有工作(与Bonus和Vaisseau联系),但其他两个联系人都没有联系。

所以这是我的代码:

功能:

func didBeginContact(contact: SKPhysicsContact) {

        let PremierBody : SKPhysicsBody = contact.bodyA
        let SecondBody : SKPhysicsBody = contact.bodyB

        if ((PremierBody.categoryBitMask == PhysicsCategories.Meteorites) && (SecondBody.categoryBitMask == PhysicsCategories.Meteorites)) {
            contactEntreMeteorites(PremierBody.node as! SKSpriteNode, Meteorites2: SecondBody.node as! SKSpriteNode)
        }
        else if ((PremierBody.categoryBitMask == PhysicsCategories.Bonus) && (SecondBody.categoryBitMask == PhysicsCategories.Vaisseau) ||
            (PremierBody.categoryBitMask == PhysicsCategories.Vaisseau) && (SecondBody.categoryBitMask == PhysicsCategories.Bonus)){
                gameOver(PremierBody.node as! SKSpriteNode, Vaisseau: SecondBody.node as! SKSpriteNode)
                print("CONTACT")
        }
        else if ((PremierBody.categoryBitMask == PhysicsCategories.Meteorites) && (SecondBody.categoryBitMask == PhysicsCategories.Vaisseau) ||
        (PremierBody.categoryBitMask == PhysicsCategories.Vaisseau) && (SecondBody.categoryBitMask == PhysicsCategories.Meteorites)){
        gameOver(PremierBody.node as! SKSpriteNode, Vaisseau: SecondBody.node as! SKSpriteNode)
            print("Couco")
        }
    } 

这是我的物理类别:

struct PhysicsCategories {
    static let Meteorites : UInt32 = 1
    static let Bonus : UInt32 = 2
    static let Vaisseau : UInt32 = 5
}

这在我的func DidMoveToView:

Vaisseau = SKSpriteNode(texture: Vaisseau1)
        Vaisseau.position = CGPointMake(self.frame.size.width / 2, self.frame.size.height / 2)
        Vaisseau.physicsBody = SKPhysicsBody(rectangleOfSize: Vaisseau.size)
        Vaisseau.physicsBody?.affectedByGravity = false
        Vaisseau.physicsBody?.categoryBitMask = PhysicsCategories.Vaisseau
        Vaisseau.physicsBody?.contactTestBitMask = PhysicsCategories.Bonus
        Vaisseau.physicsBody?.contactTestBitMask = PhysicsCategories.Meteorites
        Vaisseau.physicsBody?.dynamic = false
        Vaisseau.setScale(0.08)
        self.addChild(Vaisseau)

我在这个函数中创建了SpriteNode Bonus:

func ApparitionBonus() {

        let BonusSprite = SKSpriteNode(imageNamed: "Bonus.png")
        var BonusApparitionX = UInt32(self.frame.size.width)
        var BonusApparitionY = UInt32(self.frame.size.height)

        BonusApparitionX = arc4random() % BonusApparitionX
        BonusApparitionY = arc4random() % BonusApparitionY

        BonusSprite.position = CGPointMake(CGFloat(BonusApparitionX),CGFloat(BonusApparitionY))
        BonusSprite.setScale(0.8)
        BonusSprite.physicsBody = SKPhysicsBody(circleOfRadius: 20)
        BonusSprite.physicsBody?.affectedByGravity = false
        BonusSprite.physicsBody?.categoryBitMask = PhysicsCategories.Bonus
        BonusSprite.physicsBody?.contactTestBitMask = PhysicsCategories.Vaisseau
        BonusSprite.physicsBody?.dynamic = false
        self.addChild(BonusSprite)

        let RotationBonus = SKAction.rotateByAngle(CGFloat(M_PI), duration: 3)
        let wait = SKAction.waitForDuration(3)
        let actionFini = SKAction.removeFromParent()
        BonusSprite.runAction(SKAction.sequence([RotationBonus, wait, actionFini]))
        BonusSprite.runAction(SKAction.repeatActionForever(RotationBonus))
    }

1 个答案:

答案 0 :(得分:1)

didMoveToView,当您致电时:

Vaisseau.physicsBody?.contactTestBitMask = PhysicsCategories.Bonus
Vaisseau.physicsBody?.contactTestBitMask = PhysicsCategories.Meteorites

您将contactTestBitMask设置为一个类别,然后设置为另一个类别。你需要按位或它们在一起。类似的东西:

Vaisseau.physicsBody?.contactTestBitMask = PhysicsCategories.Bonus | PhysicsCategories.Meteorites

这将合并两个位掩码,这将允许它与BonusMeteorites联系。

如果您不希望您的精灵发生碰撞,请将collisionBitMask设置为0x0(或者您想要代表0):

Vaisseau.physicsBody?.collisionBitMask = 0x0