Floyd Resler
Floyd Resler

Reputation: 1786

iOS Sprites Contact Detection

I'm working on a platform game where the character can climb ladders. Since the total length of each ladder varies, I have several ladders stacked on top of each other in SceneEditor. Upon entering a ladder, the contact delegate works fine and my code allows the character to move up the ladder. The problem I'm having is that as soon as the character moves off the first ladder segment, the didEnd method fires even though the character has entered the next ladder segment. I've gotten around it by given the ladder segments different category masks. Is this the only way to do it?

Upvotes: 1

Views: 60

Answers (1)

Ron Myschuk
Ron Myschuk

Reputation: 6071

try overlapping the ladders by 1 rung, and then set a count whenever didBegin contact is fired increase the value by 1 whenever didEnd is called decrease the value by 1. at the end of the didEnd func check if onladderCount == 0. if it is, trigger whatever code is supposed to fire when the player is not on a ladder.

this assumes that you have a ladder class, and will have to put a property in the ladder class for onLadder to ensure that the += 1 isn't called multiple times.

var onladderCount: Int = 0

func didBegin(_ contact: SKPhysicsContact) {

    let contactAName = contact.bodyA.node?.name
    let contactBName = contact.bodyB.node?.name

    if (contactAName == "ladder") || (contactBName == "ladder") {

        let ladder: Ladder? = (contact.bodyA.categoryBitMask == PhysicsCategory. ladder ? (contact.bodyA.node as? Ladder) : (contact.bodyB.node as? Ladder))
        if !ladder.onLadder {
            ladder.onLadder = true
            onladderCount += 1
        }
    }
}

func didEnd(_ contact: SKPhysicsContact) {

    let contactAName = contact.bodyA.node?.name
    let contactBName = contact.bodyB.node?.name

    if (contactAName == "ladder") || (contactBName == "ladder") {

        let ladder: Ladder? = (contact.bodyA.categoryBitMask == PhysicsCategory. ladder ? (contact.bodyA.node as? Ladder) : (contact.bodyB.node as? Ladder))
        if ladder.onLadder {
            ladder.onLadder = false
            onladderCount -= 1
        }
    }

    if onladderCount == 0 {
        //trigger whatever code happens when they leave a ladder
    }
}

Upvotes: 1

Related Questions