在swift中,下面的代码以didMoveToView()
的特定速率(每秒2次)调用。每次调用此函数时,屏幕上都会出现一个新的圆形节点。但是,不是不断添加它们,当它尝试添加第二个时,它会抛出一个错误:尝试添加已经拥有父项的sknode
。我发现你不能在同一个视图上创建一个重复的节点。有了这个想法,我得出的结论是,我需要创建一个SKShapeNodes
数组,所以每当调用该函数时,它将从数组中取出一个并将其添加到视图中。在我的情况下,当一个节点到达底部(y = -20)时,它需要删除该节点,并再次使其可用。
所以,我的问题:如何创建一个SKShapeNode
的数组,所以当我调用下面的函数时,它将需要一个新节点并将其显示给视图?此外,当节点退出视图时,需要再次使节点可用。
let circlenode = SKShapeNode(circleOfRadius: 25) //GLOBAL
func thecircle() {
circlenode.strokeColor = UIColor.whiteColor()
circlenode.fillColor = UIColor.redColor()
let initialx = CGFloat(20)
let initialy = CGFloat(1015)
let initialposition = CGPoint(x: initialx, y: initialy)
circlenode.position = initialposition
self.addChild(circlenode)
let action1 = SKAction.moveTo(CGPoint(x: initialx, y: -20), duration: NSTimeInterval(5))
let action2 = SKAction.removeFromParent()
circlenode.runAction(SKAction.sequence([action1, action2]))
}
答案 0 :(得分:2)
所以你说得对,上面代码的问题是SKNode
只能有一个父母。
您可以采取两种方法。
SKShapeNode
SKShapeNode
前者有一个限制,你需要密切关注你的总圈数,否则你将超出你的界限。如果删除项目,这也意味着要考虑它。后者具有在需要时生成SKShapeNode
的开销。这很可能不会成为一个问题。
要创建数组,您可以执行类似(选项1)的操作:
var circleArray:[SKShapeNode] = [SKShapeNode]() // Property in your class
// Code in your init or wherever else you want, depending on what class this is.
// 10 is just an arbitrary number
for var i=0;i<10;i++ {
circleArray.append(SKShapeNode(circleOfRadius: 25))
}
如果您想在thecircle
中添加,请拨打self.addChild(circlenode)
,例如:
if numCircles < circleArray.count {
SKShapeNode *circlenode = circleArray[numCircles]
// Do other initialization here
self.addChild(circlenode)
numCircles++
}
或者你可以做(选项2):
SKShapeNode *circlenode = SKShapeNode(circleOfRadius: 25)
// Do other initialization here
self.addChild(circle node)
我可能会做选项2,以便不必处理数组中任何未完成的圆圈的任何管理。如果您删除了圈子并想要回收它们,这一点尤其重要。