Search code examples
swiftsprite-kitspritecollisionskphysicscontact

beginner swift sprite kit - node collision detection help (SKPhysicsContact)


I want a sprite to delete itself when touching another sprite. Right now when they touch, they just push each other.

I have this:

let alphaCategory: UInt32 = 0x1 << 0
let betaCategory: UInt32 = 0x1 << 1

I made the sprites dynamic and not affected by gravity

self.physicsworld.contactDelegate = self

alpha.physicsBody?.categoryBitMask = alphaCategory
alpha.physicsBody?.contactTestBitmask = betaCategory

and

beta.physicsBody?.categoryBitMask = betaCategory
beta.physicsBody?.contactTestBitmask = alphaCategory

I couldn't find anything in swift that made sense to me, but I think the problem is here

func didBeginContact(contact: SKPhysicsContact) {

    var firstBody: SKPhysicsBody
    var secondBody: SKPhysicsBody

    if contact.bodyA.categoryBitMask < contact.bodyB.categoryBitMask {
        firstBody = contact.bodyA
        secondBody = contact.BodyB
        beta.removeFromParent()
    }
}

Solution

  • First you should set your firstBody & secondBody to the order of their collisionBitMask:

    if contact.bodyA.categoryBitMask < contact.bodyB.categoryBitMask 
        {
            firstBody = contact.bodyA
            secondBody = contact.bodyB
        }
    else {
            firstBody = contact.bodyB
            secondBody = contact.bodyA
         }
    
    if firstBody.categoryBitMask=0 && secondBody.categoryBitMask=1 {
          secondBody.removeFromParent()
    }
    

    This will prevent your sprites from colliding with anything (including each other). Set this where you set the other BitMask properties:

    alpha.physicsBody.collisionBitMask = 0
    beta.physicsBody.collisionBitMask = 0