2015-02-08 58 views
4

我目前正在使用SpriteKit遊戲技術開發一個用Swift編寫的iOS應用程序。在這場比賽中,雨滴從屏幕頂部下降到底部。當他們擊中底部時,以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功能,我得到通知時下降擊中底部。然後我的控制檯顯示「撞地」。

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

你試過設置(質量)的下降物理身體? – 2015-02-08 17:52:16

+2

爲什麼不使用粒子發射器?在XCode中創建新的粒子文件時,您甚至可以選擇一個下雨模板。 – prototypical 2015-02-08 18:07:33

+0

另外,儘管我認爲使用物理系統對於你想要做的事情來說是過分的,但這些下降不應該需要衝動。水滴會受到重力的影響。 – prototypical 2015-02-08 18:14:02

回答

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

每次下降到底部時,滴的數量乘以2,所以我最終會遇到它們。如果我刪除掉,然後告訴它添加一個新的drop,它怎麼能得到兩個。 – ecoguy 2015-02-10 16:20:47

+0

你使用了相同的代碼嗎? – rakeshbs 2015-02-10 16:25:34

+0

是的,我認爲使用圖像進行放置時會更清晰。然後它倍增。 – ecoguy 2015-02-10 16:37:00