Crear animation de lluvia con la física

Actualmente estoy trabajando en una aplicación de iOS escrita en Swift usando la tecnología de juego SpriteKit. En este juego, las gotas de lluvia caen desde la parte superior de la pantalla hasta la parte inferior. Cuando tocan el background, que es representado por un physicsBody , deben regresar a su position original en la parte superior de la pantalla, permitiendo que la animation continúe durante la vida del juego.

Como solo necesito unas gotas, las crea así:

 let drop = SKSpriteNode(imageNamed: "drop") drop.position = CGPointMake(x,y) drop.physicsBody = SKPhysicsBody(rectangleOfSize: drop.size) addChild(drop) 

Luego creo las máscaras de bits:

 drop.physicsBody!.categoryBitmask = DropCategory bottom.physicsBody!.categoryBitmask = BottomCategory drop.physicsBody!.contactTestBitmask = BottomCategory 

Agrego la function didBeginContact y recibo una notificación cuando la caída golpea la parte inferior. Entonces, mi console muestra "tocar tierra".

 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 == BlockCategory && secondBody.categoryBitMask == GroundCategory { println("hit ground") firstBody.node?.removeFromParent() let drop = SKSpriteNode(imageNamed: "drop") drop.name = "testNode" drop.position = CGPointMake(self.frame.width - self.frame.width/3*2, self.frame.height) // At start Position drop.physicsBody = SKPhysicsBody(rectangleOfSize: drop.size) drop.physicsBody?.categoryBitMask = BlockCategory drop.physicsBody?.contactTestBitMask = GroundCategory addChild(drop) } } 

Sin embargo, la position de la gota no cambia. No hay un error de syntax, ¿cuál es mi problema?

Si reemploop esto:

 firstBody.node!.position = CGPointMake(x, y) 

con este:

 firstBody.applyImpulse(CGVector) 

le da a la caída el impulso. ¿Cómo puedo hacer que la primera opción funcione también?

Puede intentar eliminar el nodo cuando toca la parte inferior, y agregar nuevo nodo en la parte superior nuevamente. Cargue la textura para su reutilización en una variable de SKTexture separada. Me gusta esto

 let dropTexture = SKTexture(imageNamed: "drop.png") 

utilizarlo de esta manera

 let drop = SKSpriteNode(texture: dropTexture) 

Luego dentro didBeginContact

 func didBeginContact(contact: SKPhysicsContact) { println("collided") var bodyA : SKPhysicsBody! var bodyB : SKPhysicsBody! if contact.bodyA.categoryBitMask < contact.bodyB.categoryBitMask { bodyA = contact.bodyA! bodyB = contact.bodyB! } else { bodyB = contact.bodyA! bodyA = contact.bodyB! } if bodyA.categoryBitMask == bottomCategoryBitMask && bodyB.categoryBitMask == raindropCategoryBitMask { if bodyB.node?.parent != nil // Added line { bodyB.node?.removeFromParent() let drop = SKSpriteNode(imageNamed: "1.png") drop.name = "testNode" drop.position = CGPointMake(self.frame.width - self.frame.width/3*2, self.frame.height) // At start Position drop.physicsBody = SKPhysicsBody(rectangleOfSize: drop.size) drop.physicsBody?.categoryBitMask = raindropCategoryBitMask drop.physicsBody?.contactTestBitMask = bottomCategoryBitMask addChild(drop) } } }