why my contact recognizer do not work

I made contact recogniser using physics body, category bit mask and SKPhysics contact. Unfortunately it do not work. Could You help me somehow to find mistake? This code do not print statement Touched.

Is it because one body is SKSpriteNode and second SKShapeNode? Could we recognise contact between SpriteNode and ShapeNode?



import Foundation
import SpriteKit
import GameplayKit
import UIKit
enum BodyType:UInt32{
    case TheCircle = 1
    case TheEightBack = 2
    case SthElse = 4
}

class TouchLevel3SceneClass: SKScene, SKPhysicsContactDelegate{
   
    var Eight = SKSpriteNode(imageNamed: "8.png")
    var EightBack = SKSpriteNode(imageNamed: "8Back.png")
    var Circle = SKShapeNode(circleOfRadius: 25)
   
    var counter : Int = 0;
   
    override func didMove(to view: SKView) {
   
        self.physicsWorld.contactDelegate = self
       
       
        Eight.position = CGPoint(x: 0, y: -50)
        Eight.name = "Eight"
       
        addChild(Eight)
       
       
        EightBack.position = CGPoint(x: 0, y: -50)
        EightBack.name = "EightBack"
        EightBack.zPosition = 2
        EightBack.physicsBody? = SKPhysicsBody(rectangleOf: CGSize(width: 200, height: 150), center: CGPoint(x: 0, y: -150))
        EightBack.physicsBody?.usesPreciseCollisionDetection = true
        EightBack.physicsBody?.isDynamic = true
        EightBack.physicsBody?.affectedByGravity = false
        EightBack.physicsBody?.categoryBitMask = BodyType.TheEightBack.rawValue
        EightBack.physicsBody?.collisionBitMask = BodyType.TheCircle.rawValue
        EightBack.physicsBody?.contactTestBitMask = BodyType.TheCircle.rawValue
        addChild(EightBack)
       
        Circle.position = CGPoint(x: 0, y: 450)
        Circle.zPosition = 2;
        Circle.fillColor = SKColor.black;
        Circle.name = "Circle"
        Circle.physicsBody? = SKPhysicsBody(circleOfRadius: 25)
        Circle.physicsBody?.usesPreciseCollisionDetection = true
        Circle.physicsBody?.isDynamic = true
        Circle.physicsBody?.affectedByGravity = false
        Circle.physicsBody?.categoryBitMask = BodyType.TheCircle.rawValue
        Circle.physicsBody?.collisionBitMask = BodyType.TheEightBack.rawValue
        Circle.physicsBody?.contactTestBitMask = BodyType.TheEightBack.rawValue
        addChild(Circle)  
    }
   
    override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
        for t in touches{
            let location = t.location(in: self);
           
           
            if atPoint(location).name == "Circle"{
                Circle.position.x = location.x
                Circle.position.y = location.y
            }
        }
    }

    func didBegin(_ contact: SKPhysicsContact) {
        if (contact.bodyA.categoryBitMask == BodyType.TheCircle.rawValue && contact.bodyB.categoryBitMask == BodyType.TheEightBack.rawValue){
            print("Touched")
        } else if (contact.bodyB.categoryBitMask == BodyType.TheCircle.rawValue && contact.bodyA.categoryBitMask == BodyType.TheEightBack.rawValue){
            print("Touched")
    }
    }
}

Replies

Hello,


At first glance I would suggest refactoring your if statement in didBegin. Don't try and check for multiple conditions, for now...


if (contact.bodyA.contactTestBitMask == BodyType.TheCircle.rawValue

{

//Touched

}


I'm assuming didBegin is being called?


PS. Sorry but I'm unable to try your code. Since I installed XCode 10, beta 4, my iMac keeps freezing. Very annoying...