在我的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代码中,但它似乎没有效果。
任何建议都非常感谢
答案 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]
})
}
})
}
这太伤害了我的眼睛,如果有人有更优雅的方式来实现这一点,我会非常感激!