Help SKPhysicsContact

Hi,


I am asking you for a problem of contact between two objects.

I am currently using PNG images and the contact is on the outline of the image and not the image itself. I would like that the transparent part is not taken into account for the contacts between the objects, I do not find my error. here is my code:




my SKSpriteNode:

let EnnemisOrdinateur1Category:UInt32 = 0b0100 //4
let PouvoirPlayer1Category:UInt32 = 0b01000 //8


 func ennemis1() {
  let EnnemisOrdinateur11 = SKSpriteNode()
    EnnemisOrdinateur11.name = "EnnemisOrdinateur1"

    EnnemisOrdinateur11.size.width = WidthDelEnnemis //Largeur
    EnnemisOrdinateur11.size.height = EnnemisOrdinateur11.frame.width //Hauteur
    EnnemisOrdinateur11.position = positionDepartEnnemisOrdinateur
          
    EnnemisOrdinateur11.physicsBody = SKPhysicsBody(rectangleOf: EnnemisOrdinateur11.size)
    EnnemisOrdinateur11.physicsBody?.isDynamic = true
          
    EnnemisOrdinateur11.physicsBody?.categoryBitMask = EnnemisOrdinateur1Category
    EnnemisOrdinateur11.physicsBody?.contactTestBitMask = MurOUobjetCategory | PouvoirPlayer1Category
          
    EnnemisOrdinateur11.physicsBody?.collisionBitMask = MurOUobjetCategory | PouvoirPlayer1Category
    EnnemisOrdinateur11.physicsBody?.usesPreciseCollisionDetection = true
    Vueprincipale.addChild(EnnemisOrdinateur11)
}

 override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
      for touch in touches {
          if (touchedNode.name?.contains(« EnnemisOrdinateur1 »))! {
                 let CategoryContactAttaque1 = EnnemisOrdinateur1Category
                     DeployerPouvoir(Texture1: TexturePouvoirBouleDeFeu, Child1: BouleDeFeu1, Parent: Vueprincipale, TimeInter: 0.1, NombreDImage: 4, NameImage: "BouleDeFeu", NameDuPouvoir1: "BouleDeFeu", Taille1:"1", PositionDoigt2:PositionDoigt1, PositionDeDepart1: player1.position, CategoryContactAttaque:CategoryContactAttaque1, CategoryDuChild:PouvoirPlayer1Category)
}
}
}


func DeployerPouvoir(Texture1:[SKTexture], Child1:SKSpriteNode, Parent:SKSpriteNode, TimeInter:Double, NombreDImage: Int, NameImage:String, NameDuPouvoir1:String, Taille1:String, PositionDoigt2:CGPoint, PositionDeDepart1:CGPoint, CategoryContactAttaque:UInt32, CategoryDuChild:UInt32) {
        var texture1 = [SKTexture]()
        var Child = Child1
        var Taille:CGFloat = Parent.frame.height/10
        if Taille1 == "1" {
            
        }
        func Texture() {
            for i in 1...NombreDImage {
                let textureName = "\(NameImage)\(i)"
                texture1.append(SKTexture(imageNamed: textureName))
            }
            if (texture1.count>1) {
                Child = SKSpriteNode(imageNamed: "\(NameImage)1")
                Child.position = PositionDeDepart1
                Child.size.width = Taille
                Child.size.height = Taille
                Child.zPosition = 99
            }

        }
        Texture()
        let ImageCase1 = Child
        ImageCase1.name = "\(NameDuPouvoir1)"
        ImageCase1.size.width = Taille
        ImageCase1.size.height = Taille
        ImageCase1.physicsBody = SKPhysicsBody(circleOfRadius: ImageCase1.size.width / 2)
        ImageCase1.physicsBody?.categoryBitMask = CategoryDuChild
        ImageCase1.physicsBody?.isDynamic = true
        ImageCase1.physicsBody?.contactTestBitMask = CategoryContactAttaque
        ImageCase1.physicsBody?.collisionBitMask = CategoryContactAttaque
        ImageCase1.physicsBody?.usesPreciseCollisionDetection = true
        Parent.addChild(ImageCase1)
        let titi = SKAction.repeatForever((SKAction.animate(with: texture1, timePerFrame: TimeInterval(TimeInter))))
        var actionArray = [SKAction]()
        actionArray.append(SKAction.move(to: CGPoint(x: PositionDoigt2.x, y: PositionDoigt2.y), duration: 1))
        ImageCase1.run(titi)
        actionArray.append(SKAction.removeFromParent())
        ImageCase1.run(SKAction.sequence(actionArray))
        var angle:CGFloat = 0
        angle = atan2(PositionDoigt2.x - PositionDeDepart1.x , PositionDoigt2.y - PositionDeDepart1.y)
        ImageCase1.zRotation =  -angle
    }





contact:

func didBegin(_ contact: SKPhysicsContact) {
           let bodyA = contact.bodyA.categoryBitMask
           //let bodyB = contact.bodyB.categoryBitMask il nest pas utilise
           let collision = contact.bodyA.categoryBitMask | contact.bodyB.categoryBitMask
           print("BodyA:\(contact.bodyA.categoryBitMask) //BodyB \(contact.bodyB.categoryBitMask) // Colision:\(collision)")
           
        


        if collision == EnnemisOrdinateur1Category | PouvoirPlayer1Category {
            if bodyA == 0b100 {
                print(«contact1»)
            }
        }
}



thank you for your help !


Max

Replies

Which line of code do you expect will take care of transparent parts (it is a bit long to search) ?


Could you show the results of the print ?


PS: this post should better be in Scenkit section.

I think that the problem comes from there, but I am not sure, and I do not know how to avoid that the transparency of the images is integrated in the contacts:


     EnnemisOrdinateur11.physicsBody = SKPhysicsBody(rectangleOf: EnnemisOrdinateur11.size)
    EnnemisOrdinateur11.physicsBody?.isDynamic = true
          
    EnnemisOrdinateur11.physicsBody?.categoryBitMask = EnnemisOrdinateur1Category
    EnnemisOrdinateur11.physicsBody?.contactTestBitMask = MurOUobjetCategory | PouvoirPlayer1Category
          
    EnnemisOrdinateur11.physicsBody?.collisionBitMask = MurOUobjetCategory | PouvoirPlayer1Category
    EnnemisOrdinateur11.physicsBody?.usesPreciseCollisionDetection = true


thank for your help !