2016-01-20 54 views
2

我正在使用SpriteKit在Swift上進行遊戲。我有一個帶有SKPhysicsBody和幾個子節點以及它們自己的物理體的父節點。所有的子節點都有一些相對於父節點的速度。給父節點一個速度時如何保持相對速度?下面是僞代碼,以顯示我想要做的事:如何在移動家長時保持兒童SKNode速度?

let parent:SKNode = SKNode() 
let child:SKNode = SKNode() 
parent.physicsBody = SKPhysicsBody() 
child.physicsBody = SKPhysicsBody() 
parent.addChild(child) 

child.physicsBody!.velocity = CGVectorMake(dx: 5, dy: 5) 
// child now has velocity 
parent.physicsBody!.velocity = CGVectorMake(dx: 10, dy:10) 
// parent has velocity, but child velocity is still (5,5) 

我怎麼會得到孩子的速度進行設置,使得其保持相對於母公司的速度? (例如,一旦父母被給予(10,10)的速度以使其相對於父母保持(5,5)),則孩子的絕對速度應該變爲(15,15)。 我嘗試使用SKPhysicsJoint但似乎修復節點,不允許速度。任何解決方案(我確定我忽略了一些明顯的東西,但我是SpriteKit的新手)
謝謝!

回答

0

如果您希望孩子的速度相對於其父母,請在update方法中將父母的速度添加到孩子的恆定速度。例如,

override func update(currentTime: CFTimeInterval) { 
    child.physicsBody?.velocity = CGVectorMake(parentNode.physicsBody!.velocity.dx + 5.0, parentNode.physicsBody!.velocity.dy + 5.0) 
} 

順便說一句,你不應該使用parent在雪碧包一個變量名,因爲它的SKNode的屬性。

更新

你也可以遍歷用下面的父節點的所有兒童。

override func update(currentTime: CFTimeInterval) { 
    for (i, child) in parentNode.children.enumerate() { 
     child.physicsBody?.velocity = CGVectorMake(parentNode.physicsBody!.velocity.dx + velocity[i].dx, parentNode.physicsBody!.velocity.dy + velocity[i].dy) 
    } 
} 

velocity是包含每個子的速度CGVector秒的陣列。

+0

是的,父母不是我的實際變量名稱,只是一個例子。如果有50或60個孩子,這是不是變得低效?是否沒有辦法讓SKPhysicsBody移動所有的孩子,就像孩子們被固定一樣? –

+0

如果您不需要孩子獨立於父母移動,您可以設置每個孩子的'''physicalbody'的'pinned'屬性。 – Epsilon

+0

是的,問題是我需要它們獨立移動,但是如果父項被移動,它們會保持與父項的相對速度。是否有可能通過某種聯合來實現?如果不是,我將使用您建議的方法,但是我必須獲得父級中每個節點的列表,並單獨執行每個節點,這可能是低效的。 –