JonB
JonB

Reputation: 3

spriteKit collision not working

Not sure which part is the problem. I'm doing a spriteKit shooter game and the collision isn't working. The spaceships are not being destroyed.

It must have to do with the collision somewhere...

The projectiles are just moving the enemy over slightly but not destroying them.

    struct physicsCategory {
        static let player : UInt32 = 1
         static let enemy : UInt32 = 2
        static let projectile : UInt32 = 3


    }


        func didBeginContact(contact: SKPhysicsContact) {
            let firstBody : SKPhysicsBody = contact.bodyA
            let secondBody : SKPhysicsBody = contact.bodyB

            if ((firstBody.categoryBitMask == physicsCategory.projectile) && (secondBody.categoryBitMask == physicsCategory.enemy) || (firstBody.categoryBitMask == physicsCategory.enemy) && (secondBody.categoryBitMask == physicsCategory.projectile)) {


                projectileCollision(enemyTemp: firstBody.node as! SKSpriteNode, projectileTemp: secondBody.node as! SKSpriteNode)

            }
            if ((firstBody.categoryBitMask == physicsCategory.enemy) && (secondBody.categoryBitMask == physicsCategory.player) || (firstBody.categoryBitMask == physicsCategory.player) && (secondBody.categoryBitMask == physicsCategory.enemy)) {


                enemyPlayerCollision(enemyTemp: firstBody.node as! SKSpriteNode, playerTemp: secondBody.node as! SKSpriteNode)

            }
        }
        ///////////
        func projectileCollision(enemyTemp: SKSpriteNode, projectileTemp: SKSpriteNode){
            enemy.removeFromParent()
            projectile.removeFromParent()

            score = score + 1

            updateScore()




        }


    ////////////
        func enemyPlayerCollision(enemyTemp: SKSpriteNode, playerTemp: SKSpriteNode) {

            mainLabel.fontSize = 50
            mainLabel.alpha = 1.0
            mainLabel.text = "Game Over"

            player.removeFromParent()

            isAlive = false

            waitThenMoveToTiltleScreen()
        }

Upvotes: 0

Views: 77

Answers (2)

JonB
JonB

Reputation: 3

thanks ( sorry I'm fairly new to spriteKit) I'm nearly there I think as I've written this code below and it worked better.

just with one small problem! some of the projectiles just go through the enemys.and only some destroy.

func didBegin(_ contact: SKPhysicsContact) {
        let firstBody : SKPhysicsBody = contact.bodyA
        let secondBody : SKPhysicsBody = contact.bodyB

        if ((firstBody.categoryBitMask == physicsCategory.enemy) && (secondBody.categoryBitMask == physicsCategory.projectile) || (firstBody.categoryBitMask == physicsCategory.projectile) && (secondBody.categoryBitMask == physicsCategory.enemy)) {


            projectileCollision(enemy: firstBody.node as! SKSpriteNode, projectile: secondBody.node as! SKSpriteNode)

            }
        else if ((firstBody.categoryBitMask == physicsCategory.enemy) && (secondBody.categoryBitMask == physicsCategory.player) || (firstBody.categoryBitMask == physicsCategory.player) && (secondBody.categoryBitMask == physicsCategory.enemy)) {


            enemyPlayerCollision(enemy: firstBody.node as! SKSpriteNode, person: secondBody.node as! SKSpriteNode)

        }
    }
    ///////////
    func projectileCollision(enemy: SKSpriteNode, projectile: SKSpriteNode){

        enemy.removeFromParent()
        projectile.removeFromParent()

        score = score + 1

        updateScore()


    }



    ////////////
    func enemyPlayerCollision(enemy: SKSpriteNode, person: SKSpriteNode) {

        mainLabel.fontSize = 50
        mainLabel.alpha = 1.0
        mainLabel.text = "Game Over"

        person.removeFromParent()
      enemy.removeFromParent()

        isAlive = false

        waitThenMoveToTiltleScreen()
    }

Upvotes: 0

Knight0fDragon
Knight0fDragon

Reputation: 16827

Your first issue is static let projectile : UInt32 = 3

If you want to declare a unique bitMasks, it needs to be in a power of 2 (2^0,2^1,2^2,..etc)

What 3 really means, is your projectile is both a player and an enemy ( 1 = 2^0, 2 = 2^1)

Your second issue is your logic

let f = firstBody.categoryBitMask
let s = secondbody.categoryBitmask
let p = physicsCategory.projectile
let x = physicsCategory.player
let e = physicsCategory.enemy

This is your projectile if statements:

if ((f == p) && (s == e) || (f == e) && (s == p)) {
   projectileCollision(enemyTemp: firstBody.node as! SKSpriteNode, projectileTemp: secondBody.node as! SKSpriteNode)
}

In your if statement, you are saying either first or second could be the enemy, but in your projectile collision method, you are claiming that first body is always the enemy, and second body is always the projectile.

You need to handle the condition where your first body is projectile, and your second body is enemy, because chances are, your projectile will move into enemy, so it would be the first body.

Upvotes: 0

Related Questions