2017-08-08 122 views
1

我有一堆對象(SKNode)從屏幕頂部通過SKAction.move(to:duration:)node.run(moveAction)「下降」到底部。另外我在屏幕的中心有一個節點,它有自己的物理主體,可以通過觸摸輸入左右拖動。我可以很好地檢測碰撞,但是我想知道是否有一個「暫停」所有對象的範例,而中心節點與任何對象都有聯繫。此外,我希望能夠在其他對象「暫停」的時候移動中心節點,這樣我就可以將它移開,然後讓對象恢復運動。我想我可以迭代所有現有對象並設置它們的屬性,但我不確定應用程序如何知道中心節點何時不再「碰撞」,因此我可以切換回屬性。如何控制SpriteKit中節點的速度

回答

2

要暫停某些操作,您必須檢測didBegin()中的聯繫人,向某些陣列添加應該暫停的節點並最終暫停節點。例如,實際暫停可以在didSimulatePhysics()中完成。要暫停所有節點可以使用

self.enumerateChildNodesWithName("aName") { 
    node, stop in 
    // do something with node or stop 
} 

或(通過應暫停您的節點的容器,如:循環)使用節點和環children財產穿過。

您也可以暫停某些行動:

if let action = square.actionForKey("aKey") { 

     action.speed = 0  
} 

action.speed = 1取消暫停,或使其緩慢謨與action.speed = 0.5

放緩的物理模擬,有一個名爲physicsWorld.speed財產(確定模擬運行的速率)。

1

哦,男孩,事情肯定會變得複雜。 Whirlwind說的每件事都是正確的,但是遍歷場景中的每個節點都會變得很麻煩。

相反,我建議爲SKNode創建一個特殊的子類。現在,這家特別的需要,由於引起蘋果框架

class UserPausableNode : SKNode 
{ 
    public var userPaused = false 
    { 
     didSet 
     { 
      super.isPaused = userPaused 
     } 
    } 
    override var isPaused : Bool 
     { 
     get 
     { 
      return userPaused 
     } 
     set 
     { 
      //Yes, do nothing here 
     } 
    } 
} 

爲什麼我們需要做的,這是因爲每當isPaused得到被調用,它遍歷所有兒童,並將兒童isPaused屬性的原因的錯誤。

這將成爲一個問題,當場景暫停和取消暫停,因爲它會改變孩子們,這是我們不希望做的暫停狀態。

該類防止isPaused變量發生變化。

既然這個類存在,我們想要做的就是將它添加到場景中,並將所有移動節點添加到這個新節點。

由於所有節點都是這個新的節點上,我們需要做的是設置userPaused爲真,這將停止所有節點。

現在確保要移動的節點不是該分支的一部分,它應該是外面,讓你可以移動它。

​​