No se produce rebote al arrastrar un object para colisionar con otro object en el Kit de Sprite

Aquí hay un video del problema que estoy teniendo. Como puedes ver en el video, muevo una bola gris para intentar chocar con una bola roja. Cuando los dos objects colisionan, no ocurre rebote, la bola roja simplemente se mueve. Intenté jugar con las densidades de las bolas rojas, como hacer las densidades de bola roja 0.00001. No hubo diferencias en el comportamiento de colisión.

¿Cómo puedo cambiar el comportamiento de colisión para que haya rebote?

Estas son las properties de la bola gris:

func propertiesGrayBall() { gray = SKShapeNode(circleOfRadius: frame.width / 10 ) gray.physicsBody = SKPhysicsBody(circleOfRadius: frame.width / 10 ) gray.physicsBody?.affectedByGravity = false gray.physicsBody?.dynamic = true gray.physicsBody?.allowsRotation = false gray.physicsBody?.restitution = 1 } 

Aquí están las properties de la bola roja:

 func propertiesRedBall { let networkingBall = SKShapeNode(circleOfRadius: self.size.width / 20 networkingBall.physicsBody = SKPhysicsBody(self.size.width / 20) networkingBall.physicsBody?.affectedByGravity = false networkingBall.physicsBody?.dynamic = true networkingBall.physicsBody?.density = networkingBall.physicsBody!.density * 0.000001 networkingBall.physicsBody?.allowsRotation = false networkingBall.physicsBody?.restitution = 1 } 

Aquí es cómo muevo la bola gris.

 override func touchesMoved(touches: Set<UITouch>, withEvent event: UIEvent?) { if fingerIsOnGrayBall { let touch = touches.first var position = touch!.locationInView(self.view) position = self.convertPointFromView(position) grayBall.position = position } } 

Ediciones principales La bola originalmente tenía files adjuntos. Los eliminé para simplificar el problema. Es por eso que los comentarios pueden no coincidir con el código.

Si mueve un nodo (con un cuerpo de física) configurando su position, directamente o con una SKAction , el nodo no será parte de la simulación física. En su lugar, debe mover el nodo aplicando una fuerza / impulso o estableciendo su velocidad. Aquí hay un ejemplo de cómo hacerlo:

Primero, defina una variable para almacenar la position del tacto

 class GameScene: SKScene { var point:CGPoint? 

Luego, borre la siguiente statement de su código

 networkingBall.physicsBody?.density = networkingBall.physicsBody!.density * 0.000001 

Por último, agregue los siguientes manejadores táctiles

 override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) { /* Called when a touch begins */ for touch in touches { let location = touch.locationInNode(self) let node = nodeAtPoint(location) if (node.name == "RedBall") { point = location } } } override func touchesMoved(touches: Set<UITouch>, withEvent event: UIEvent?) { /* Called when a touch begins */ for touch in touches { let location = touch.locationInNode(self) if point != nil { point = location } } } override func touchesEnded(touches: Set<UITouch>, withEvent event: UIEvent?) { point = nil } override func update(currentTime: CFTimeInterval) { if let location = point { let dx = location.x - networkingBall.position.x let dy = location.y - networkingBall.position.y let vector = CGVector(dx: dx*100, dy: dy*100) networkingBall.physicsBody?.velocity = vector } }