contactos no reconocidos cuando el cuerpo se cambia de círculo a rectángulo

Con la ayuda deaquí He hecho que un cuerpo circular atraviese un camino dado. Tengo algunos cuerpos en algunos de los puntos de ruta y he registrado el contacto endidBeginContact. Cuando el cuerpo entra en contacto con un cuerpo específico, el cuerpo del círculo se cambia a un rectángulo. Se supone que este cuerpo rectangular atraviesa la misma ruta que el cuerpo del círculo original, pero no alcanza los puntos de la ruta ya que el contacto no está registrado. Traté de cambiarradiusPoint al ancho o la altura del rectángulo también, pero eso no funcionó. Además, el cuerpo del rectángulo es más grande que el cuerpo del círculo. ¿Cómo puedo hacer que el rectángulo atraviese los puntos con el contacto reconocido? Por favor vea el código a continuación.

Código relacionado con el recorrido de la ruta:

    let repeats: Bool = true //Whether to repeat the path.
    var pathIndex = 0 //The index of the current point to travel.
    var pointRadius: CGFloat = SKTexture(imageNamed: "circle").size().width //How close the node must be to reach the destination point.
    let travelSpeed: CGFloat = 250 //Speed the node will travel at.
    let rate: CGFloat = 0.9 //Motion smoothing. 0.5

    circlePath = [
    CGPoint(x:screenSize.width , y: screenSize.height/3),
    CGPoint(x: screenSize.width/2, y: platform.sprite.frame.height),
    CGPoint(x: 0.0, y: screenSize.height/3),
    CGPoint(x: CGFloat(pos1) + screenSize.width/20, y: upperSpearPosHeight)]

    final func didReachPoint() {
    //reached point!
    pathIndex++

    if pathIndex >= ballPath.count && repeats {
    pathIndex = 0
    }
    }

    func updatePath() {

    if pathIndex >= 0 && pathIndex < circlePath.count {
    let destination = circlePath[pathIndex]
    //currentPosition = destination
    let displacement = CGVector(dx: destination.x-circle!.sprite.position.x, dy: destination.y-circle!.sprite.position.y)
    let radius = sqrt(displacement.dx*displacement.dx+displacement.dy*displacement.dy)
    let normal = CGVector(dx: displacement.dx/radius, dy: displacement.dy/radius)
    let impulse = CGVector(dx: normal.dx*travelSpeed, dy: normal.dy*travelSpeed)
    let relativeVelocity = CGVector(dx:impulse.dx-circle!.sprite.physicsBody!.velocity.dx, dy:impulse.dy-circle!.sprite.physicsBody!.velocity.dy);
    circle!.sprite.physicsBody!.velocity=CGVectorMake(circle!.sprite.physicsBody!.velocity.dx+relativeVelocity.dx*rate, circle!.sprite.physicsBody!.velocity.dy+relativeVelocity.dy*rate);

    if radius < pointRadius {
        didReachPoint()
        }
        }
    }

Código de contacto:

        func didBeginContact(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 == circleCategory && secondBody.categoryBitMask == bonusCategory  {
    let img = SKTexture(imageNamed: "rectangular")
   (firstBody.node! as? SKSpriteNode)?.size = img.size()       
   firstBody.node!.physicsBody = SKPhysicsBody(texture: img, size: img.size())
   firstBody.node!.physicsBody?.allowsRotation = false 
   changeCircleAction = SKAction.setTexture(img)   
   firstBody.node!.runAction(changeCircleAction)
 }

    if firstBody.categoryBitMask == circleCategory && secondBody.categoryBitMask == platformCategory  {

    print("touched platform")
    }

    if firstBody.categoryBitMask == circleCategory && secondBody.categoryBitMask == smallStarCategory  {

    removeStar(secondBody.node!)
    }

Respuestas a la pregunta(1)

Su respuesta a la pregunta