Im trying to make a cowboy/gunslinger game. I need a collision between the projectile (coming from the first cowboy) to hit the second cowboy. However, the didBegin function isn't being run/called.
Ive tried messing with the physics bodies, by using code from previous games with no prevail. showPhysics = true.
Physics Category:
struct PhysicsCategory {
static let none :UInt32 = 0
static let cowboy1Physics :UInt32 = 0x1 << 1
static let cowboy2Physics :UInt32 = 0x1 << 1
static let projectile1Physics:UInt32 = 0x1 << 0
static let projectile2Physics:UInt32 = 0x1 << 0
}
Fire Bullet1 :
func fireProjectile1() {
let projectile1 = SKSpriteNode(imageNamed: "bullet1")
projectile1.position = cowboyNo1.position
projectile1.position.x += 5
projectile1.size = CGSize(width: projectile1.size.width / 4, height: projectile1.size.height / 4)
self.addChild(projectile1)
projectile1.physicsBody = SKPhysicsBody(rectangleOf: projectile1.size )
projectile1.physicsBody?.isDynamic = true
projectile1.physicsBody?.categoryBitMask = PhysicsCategory.projectile1Physics
projectile1.physicsBody?.contactTestBitMask = PhysicsCategory.cowboy2Physics
projectile1.physicsBody?.collisionBitMask = PhysicsCategory.none
projectile1.physicsBody?.usesPreciseCollisionDetection = true
projectile1.zPosition = 1
var actionArray = [SKAction]()
actionArray.append(SKAction.move(to: CGPoint(x: size.height + 1500, y: cowboyNo1.position.y), duration: TimeInterval(1.5)))
actionArray.append(SKAction.wait(forDuration: 1))
actionArray.append(SKAction.removeFromParent())
print("fire")
projectile1.run(SKAction.sequence(actionArray))
}
Cowboy2 Physics:
func createCowboyNo2() {
cowboyNo2.position = CGPoint(x: 1800, y: 200)
cowboyNo2.zPosition = 1
cowboyNo2.size = CGSize(width: cowboyNo2.size.width / 2, height: cowboyNo2.size.height / 2)
// Cowboy2 physics
cowboyNo2.physicsBody = SKPhysicsBody(rectangleOf: cowboyNo2.size) // 1
cowboyNo2.physicsBody?.isDynamic = true // 2
cowboyNo2.physicsBody?.categoryBitMask = PhysicsCategory.cowboy2Physics // 3
cowboyNo2.physicsBody?.contactTestBitMask = 2 // 4
cowboyNo2.physicsBody?.collisionBitMask = PhysicsCategory.none
cowboyNo2.physicsBody?.usesPreciseCollisionDetection = true
physicsWorld.gravity = .zero
addChild(cowboyNo2)
}
DidBegin:
func didBegin(_ contact: SKPhysicsContact) {
// 1
var firstBody:SKPhysicsBody
var secondBody:SKPhysicsBody
print("test")
if contact.bodyA.categoryBitMask < contact.bodyB.categoryBitMask{
firstBody = contact.bodyA
secondBody = contact.bodyB
print("contact body's")
}
else{
firstBody = contact.bodyB
secondBody = contact.bodyA
print("more contact bodys")
}
if (firstBody.categoryBitMask & PhysicsCategory.projectile1Physics) != 0 && (secondBody.categoryBitMask & PhysicsCategory.cowboy2Physics) != 0{
projectileDidCollideWithCowboy2(nodeA: firstBody.node as! SKSpriteNode, nodeB: secondBody.node as! SKSpriteNode)
print("remove child")
}
DidCollideWithCowboy function:
func projectileDidCollideWithCowboy2(nodeA: SKSpriteNode, nodeB: SKSpriteNode) {
print("hit")
nodeA.removeFromParent()
nodeB.removeFromParent()
score1 += 1
}
The expected output is for the bullet to be removed and for the console to print "test", but nothing is being printed. The projectile is firing and going straight past the cowboy. It seems as if the didBegin function isn't being called at all in the code when it should be running.