1
votes

I am making a simple physics based game. Everything is working normally with exception to collision detection. It feels like the didBeginContact method is being ignored.

I have tried several ways of configuring the "PhysicsCategory" struct (even using enum) and several formations of the bodyA/bodyB contact statements.

I am all out of ideas. I can get the 2 objects to collide but they just bounce off each other. There are no errors and nothing logged to the console. I hope that I have made a trivial mistake that I am overlooking.

Below is all the pertinent code. In case it matters... setupPhysics() is being called in didMoveToView

PhysicsCategory Struct

struct PhysicsCategory {
static let None: UInt32 = 0
static let Fish: UInt32 = 0b1
static let Bird: UInt32 = 0b10
static let BottomEdge: UInt32 = 0b100}    

Physics Setup Method

//MARK: - Physics Methods
func setupPhysics() {
    /* Physics World */
    physicsWorld.gravity = CGVectorMake(0, -9.8)
    physicsWorld.contactDelegate = self
    physicsBody = SKPhysicsBody(edgeLoopFromRect: self.frame)

/* Bottom Collision Rect */
    let bEdge = CGRect(x: CGPointZero.x, y: CGPointZero.y, width: size.width, height: size.height * 0.005)
    let bottomEdge = SKShapeNode(rect: bEdge)
    bottomEdge.physicsBody = SKPhysicsBody(edgeLoopFromRect: bEdge)
    bottomEdge.physicsBody!.categoryBitMask = PhysicsCategory.BottomEdge
    bottomEdge.physicsBody!.collisionBitMask  = PhysicsCategory.Fish
    bottomEdge.physicsBody!.dynamic = false
    gameLayer.addChild(bottomEdge)

    /* Fish */
    fish.physicsBody = SKPhysicsBody(circleOfRadius: blowfish.size.height / 2.1)
    fish.physicsBody!.allowsRotation = false
    fish.physicsBody!.categoryBitMask = PhysicsCategory.Fish
    fish.physicsBody!.collisionBitMask = PhysicsCategory.Bird | PhysicsCategory.BottomEdge

    /* Left Random Bird */
    randomLeftBird.physicsBody = SKPhysicsBody(rectangleOfSize: randomLeftBird.size)
    randomLeftBird.physicsBody!.affectedByGravity = false
    randomLeftBird.physicsBody!.allowsRotation = false
    randomLeftBird.physicsBody!.categoryBitMask = PhysicsCategory.Bird
    randomLeftBird.physicsBody!.collisionBitMask = PhysicsCategory.Fish

    /* Random Right Bird */
    randomRightBird.physicsBody = SKPhysicsBody(rectangleOfSize: randomRightBird.size)
    randomRightBird.physicsBody!.affectedByGravity = false
    randomRightBird.physicsBody!.allowsRotation = false
    randomRightBird.physicsBody!.categoryBitMask = PhysicsCategory.Bird
    randomRightBird.physicsBody!.collisionBitMask = PhysicsCategory.Fish
}

didBeginContact Setup

func didBeginContact(contact: SKPhysicsContact!) {
    let collision: UInt32 = contact.bodyA.categoryBitMask | contact.bodyB.categoryBitMask

    if collision == PhysicsCategory.Fish | PhysicsCategory.Bird {
        println("COLLISON WITH BIRD!")
        updateLives()
    } else if collision == PhysicsCategory.Fish | PhysicsCategory.BottomEdge {
        println("EPIC FAIL!")
    }
}
1

1 Answers

0
votes

I don't see any use of contactTestBitMask in your code. That one controls whether you get contact delegate messages — collisionBitMask just controls whether they collide (bounce off).

These are separate so that you can get contact delegate messages even for categories that don't bounce off each other, but it means you also can have collisions that don't send messages. (That can be a good thing if you don't want game logic for every kind of collision.) Any that you do want contact messages for you need to explicitly request.