Search code examples
swiftcollision-detectionnodesskspritenodecollision

Swift - Random collisions are not detected


In my game, I use SKSprite. Some collisions are not detected. I did 10 tries, collisions are working well but about 25% of collisions that are supposed to be detected are not detected. I have NO idea why, I tried many things. Collisions are only with nodes of the same category.

I have no idea why randomly some collisions are not made when I can obviously see them, do you have any idea? Thanks for your help.

Here is the code of didBeginContact:

func didBeginContact(contact: SKPhysicsContact) {

    var firstBody: SKPhysicsBody = contact.bodyA
    var secondBody: SKPhysicsBody = contact.bodyB

    if firstBody.categoryBitMask == secondBody.categoryBitMask {

            listContacts.append([firstBody.node!,secondBody.node!])
        }

    }
}

Here is the code of didEndContact:

func didEndContact(contact: SKPhysicsContact) {

    var firstBody: SKPhysicsBody = contact.bodyA
    var secondBody: SKPhysicsBody = contact.bodyB

    if contact.bodyA.categoryBitMask == contact.bodyB.categoryBitMask {

        for i in listContacts{

            if (i.contains(firstBody.node!) && i.contains(secondBody.node!)){

                let findIndex = listContacts.indexOf { $0 == i }
                listContacts.removeFirst(findIndex!) 
            }
        }

    }

Finally when I declare a new SKSpriteNode I set this:

rectangle.physicsBody = SKPhysicsBody(rectangleOfSize: rectangle.size)
rectangle.physicsBody?.dynamic = true 
rectangle.physicsBody?.collisionBitMask = PhysicsCategory.None

usesPreciseCollisionDetection = true doesn't change anything so I don't use usePrecisionCollisionDetection

Every SKSpriteNode has his categoryBitmask and contactTestBitmask equal because only same SKSpriteNodes are supposed to collide.

Also:

physicsWorld.gravity = CGVectorMake(0, 0)
physicsWorld.contactDelegate = self

Finally here is a short video of my game if you want to understand easily what happens (problem of collisions are between rectangles) https://www.youtube.com/watch?v=-pbmKwQiE9U


Solution

  • I just fixed it! The reason was that in the function "touchesEnded", I had a recursive function that was deleting bad connections in the listContacts!