努力在我的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]
})
}
})
}
这让我的眼睛非常疼痛,以至于如果有人能以更优雅的方式实现这一目标,我将不胜感激!