2017-06-04 53 views
0

在我的iOS橄欖球遊戲應用中努力實現SKConstraint。Swift SKConstraint

基本上我創建了多個節點,稱爲'捍衛者',數量取決於具體級別需要多少。每個節點都被命名爲後衛+號碼。

因此,如果3個維護者催生我有稱爲3後衛節點:defender1,defender2,defender3

這是我用於產卵與初始定位的後衛節點的代碼:

for defenderNumber in 1 ..< (numberDefenders+1) { 
     let defender = Defender(imageNamed: "defender_\(teamShirt)") 
     defender.position = CGPoint(x: defenderXposition, y: defenderYposition) 
     defender.size = CGSize (width: 50, height: 35) 
     defender.zPosition = 2 
     defender.name = "defender\(defenderNumber)" 
     defenderXposition = defenderXposition + defenderSpacing 
     addChild(defender) 

     } 

作爲部分然後防守者以各種防守模式追逐攻擊者。不過我注意到防守隊員往往會組隊在一起,我想在防守隊員之間保持一個距離最小的限制。

我想我會用一個SKConstraint如:

let range = SKRange(lowerLimit:150, upperLimit:1000) let constraint = SKConstraint.distance(range, to:defender) defender.constraints = [constraint]

我試圖把上述約束的代碼在我的後衛產卵代碼,但它似乎並沒有產生效果。

任何意見,不勝感激

回答

0

如果其他人是否有這個問題,我創建了一個解決辦法 - 但其可怕的笨重,不是特別容易對眼睛的編碼器!

上面我遇到的問題是,因爲我在迭代循環中每次添加一個防禦者childNode,所以我無法將該特定防禦者節點約束爲另一個防禦者,因爲他們不存在於該循環中。

因此,爲了解決這個問題,在將每個防禦者節點添加到遊戲場景後,我將一個節點迭代循環放置在另一個循環內。兩者都是通過同一套防禦者節點迭代的,但我在第一次迭代循環中調用了第二次迭代「下一個防禦者」。因此,對於第一個循環中出現的每個防守隊員來說,所有防守隊員都會在第二個隊員中出現,並指定一個不同的節點名稱,然後將所有第二個迭代節點的約束鏈接到第一個迭代節點。

for defenderNumber in 1 ..< (self.numberDefenders+1) { 
     enumerateChildNodes(withName: "defender\(defenderNumber)", using: {node, stop in 

      let defender = node as! Defender 

      for defenderNumber in 1 ..< (self.numberDefenders+1) { 
       self.enumerateChildNodes(withName: "defender\(defenderNumber)", using: {node, stop in 

        let nextdefender = node as! Defender 
        let range = SKRange(lowerLimit:50) 
        let constraint = SKConstraint.distance(range, to:nextdefender) 
        defender.constraints = [constraint] 
       }) 

      } 
     }) 

    } 

這傷害了我的眼睛這麼多,如果任何人有實現這一目標的一個更優雅的方式,我將不勝感激!