2015-02-08 6 views
4

В настоящее время я работаю над приложением iOS, написанным в Swift, используя технологию игры SpriteKit. В этой игре капли дождя падают с верхней части экрана вниз. Когда они попадают в нижнюю часть, которая представлена ​​physicsBody, они должны вернуться в исходное положение в верхней части экрана, чтобы анимация продолжалась в течение всей жизни игры.Создание анимации дождя с физикой

Поскольку мне нужно лишь несколько капель я создаю их, как это:

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

Затем я создаю битмаски:

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

Я добавить функцию didBeginContact и я получить уведомление, когда падение попадает в нижнюю часть. Затем моя консоль отображает «hit ground».

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) 
    } 
} 

Однако положение капли не изменяется. Синтаксической ошибки нет, так что в чем моя проблема?

Если я заменяю это:

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

с этим:

firstBody.applyImpulse(CGVector) 

это дает падение импульсную. Как я могу сделать первый вариант работы?

+0

Вы пробовали настройки массы для тела физики капли? –

+2

Почему бы не использовать эмиттер частиц? Существует даже шаблон дождя, который вы можете выбрать при создании нового файла частиц в XCode. – prototypical

+0

Кроме того, хотя я считаю, что использование физической системы является излишним для того, что вы пытаетесь сделать, капли не нуждаются в импульсе. Капли просто пострадали бы от гравитации. – prototypical

ответ

2

Вы можете попробовать удалить узел, когда он касается дна, и снова добавить новый узел вверху. Загрузите текстуру для повторного использования в отдельной переменной SKTexture. Как это

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

использовать его как это

let drop = SKSpriteNode(texture: dropTexture) 

Тогда внутри 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) 
     } 
    } 
} 
+0

Каждый раз, когда падение падает в нижней части, количество капель увеличивается на два, поэтому я получаю хундрады из них. Если я удалю падение, а затем скажу, чтобы он добавил еще одно новое падение, как он может получить два. – ecoguy

+0

Вы использовали тот же код? – rakeshbs

+0

Да, я думаю, что яснее, когда вы используете изображение для капли. Затем он умножается. – ecoguy

Смежные вопросы