Reputation: 3
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
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
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