努力在我的iOS橄榄球游戏应用程序中实现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]

我尝试将上述约束代码放入防御者生成代码中,但似乎没有效果。

任何建议,不胜感激

最佳答案

如果还有其他人遇到这个问题,我已经解决了这个问题-但是它的代码笨拙而且在编码人员看来并不容易!

我解决的上述问题是,当我在迭代循环中一次添加一个防御者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]
                })

            }
        })

    }


这让我的眼睛非常疼痛,以至于如果有人能以更优雅的方式实现这一目标,我将不胜感激!

07-26 00:32