Swift SKConstraint

时间:2017-06-04 18:30:15

标签: ios constraints sknode

在我的iOS橄榄球游戏应用程序中实施SKConstraint时苦苦挣扎。

基本上我创建了多个称为“防御者”的节点,数量取决于特定级别所需的数量。每个节点都被命名为defender + number。

因此,如果产生了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]

我尝试将上面的约束代码放在我的后卫spawn代码中,但它似乎没有效果。

任何建议都非常感谢

1 个答案:

答案 0 :(得分:1)

如果有其他人遇到这个问题,我已经创造了一个解决方案 - 但它的可怕性很笨拙而且在编码器眼中并不是特别容易!

上面我解决的问题是,当我在迭代循环中一次添加一个后卫childNode时,我无法将该特定后卫节点约束到另一个后卫,因为它们在该循环中不存在

因此,为了解决这个问题,在将每个后卫节点添加到游戏场景之后,我将一个节点迭代循环嵌套在另一个中。两者都通过同一组后卫节点进行了迭代,但我调用了第二次迭代&#39;下一个后卫&#39;在第一个迭代循环中。因此,对于在第一个循环中提出的每个防御者,所有防御者都在第二个中被提出,分配了不同的节点名称,然后我将约束链接到所有第二个迭代节点到第一个。

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

            }
        })

    }

这太伤害了我的眼睛,如果有人有更优雅的方式来实现这一点,我会非常感激!