import SpriteKit import GameplayKit class GameScene: SKScene, SKPhysicsContactDelegate { let balls = [ SKSpriteNode(imageNamed: "blueball.png"), SKSpriteNode(imageNamed: "greenball.png"), SKSpriteNode(imageNamed: "realredball.png"), ] let redRectangle = SKSpriteNode(imageNamed: "redrectangle.png") let blueRectangle = SKSpriteNode(imageNamed: "bluerectangle.png") let greenRectangle = SKSpriteNode(imageNamed: "greenrectangle.png") let blueBallCategory :UInt32 = 0x1 << 0 let greenBallCategory :UInt32 = 0x1 << 1 let realRedBallCategory :UInt32 = 0x1 << 2 let redRectangleCategory : UInt32 = 0x1 << 3 let blueRectangleCategory : UInt32 = 0x1 << 4 let greenRectangleCategory : UInt32 = 0x1 << 5 override func didMove(to view: SKView) { spawnBallsandRectangles() physicsWorld.contactDelegate = self } override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { physics() } func didBegin(_ contact: SKPhysicsContact) { var firstBody: SKPhysicsBody var secondBody: SKPhysicsBody if contact.bodyA.categoryBitMask < contact.bodyB.categoryBitMask { firstBody = contact.bodyA secondBody = contact.bodyB } else { firstBody = contact.bodyB secondBody = contact.bodyA } if firstBody.categoryBitMask == blueBallCategory && secondBody.categoryBitMask == blueRectangleCategory { print("alive") } else if firstBody.categoryBitMask == greenBallCategory && secondBody.categoryBitMask == greenRectangleCategory { print("alive") } else if firstBody.categoryBitMask == realRedBallCategory && secondBody.categoryBitMask == redRectangleCategory { print("alive") } else if firstBody.categoryBitMask == blueBallCategory || firstBody.categoryBitMask == greenBallCategory && secondBody.categoryBitMask == redRectangleCategory{ print("dead") } else if firstBody.categoryBitMask == realRedBallCategory || firstBody.categoryBitMask == greenBallCategory && secondBody.categoryBitMask == blueRectangleCategory { print("dead") } else if firstBody.categoryBitMask == realRedBallCategory || firstBody.categoryBitMask == blueBallCategory && secondBody.categoryBitMask == greenBallCategory { print("dead") } } func spawnBallsandRectangles() { let ball = balls[Int(arc4random_uniform(UInt32(balls.count)))] ball.position = CGPoint(x: -200, y: 250) ball.size = CGSize(width: 70, height: 70) redRectangle.position = CGPoint(x: 0, y: -600) redRectangle.size = CGSize(width: 200, height: 20) blueRectangle.position = CGPoint(x: -200, y: -600) blueRectangle.size = CGSize(width: 200, height: 20) greenRectangle.position = CGPoint(x: 200, y: -600) greenRectangle.size = CGSize(width: 200, height: 20) self.addChild(ball) self.addChild(redRectangle) self.addChild(blueRectangle) self.addChild(greenRectangle) } func physics(){ for ball in balls{ ball.physicsBody = SKPhysicsBody(circleOfRadius: ball.size.height/2) } redRectangle.physicsBody = SKPhysicsBody(rectangleOf: redRectangle.size) redRectangle.physicsBody?.affectedByGravity = false redRectangle.physicsBody?.isDynamic = false blueRectangle.physicsBody = SKPhysicsBody(rectangleOf: redRectangle.size) blueRectangle.physicsBody?.affectedByGravity = false blueRectangle.physicsBody?.isDynamic = false greenRectangle.physicsBody = SKPhysicsBody(rectangleOf: redRectangle.size) greenRectangle.physicsBody?.isDynamic = false greenRectangle.physicsBody?.affectedByGravity = false balls[0].physicsBody?.categoryBitMask = blueBallCategory balls[1].physicsBody?.categoryBitMask = greenBallCategory balls[2].physicsBody?.categoryBitMask = realRedBallCategory balls[0].physicsBody?.contactTestBitMask = redRectangleCategory balls[1].physicsBody?.contactTestBitMask = redRectangleCategory balls[1].physicsBody?.contactTestBitMask = blueRectangleCategory balls[2].physicsBody?.contactTestBitMask = blueRectangleCategory balls[0].physicsBody?.contactTestBitMask = greenRectangleCategory balls[2].physicsBody?.contactTestBitMask = greenRectangleCategory balls[0].physicsBody?.contactTestBitMask = blueRectangleCategory balls[1].physicsBody?.contactTestBitMask = greenRectangleCategory balls[2].physicsBody?.contactTestBitMask = redRectangleCategory redRectangle.physicsBody?.categoryBitMask = redRectangleCategory blueRectangle.physicsBody?.categoryBitMask = blueRectangleCategory greenRectangle.physicsBody?.categoryBitMask = greenRectangleCategory } }
I have set up collision detection so that if a ball collides into a rectangle that match colors, the program prints (“alive”). And the program is supposed to print (“dead”) if the colors don’t match. It detects collision if the colors match and it prints (“alive”) but it doesn’t print (“dead”). Could someone please help ,thanks.