我是swift和spriteKit的新手。我正在创建一个侧滚动游戏。我想让它在任何高度从屏幕右侧添加多个节点(称为Impenitrible)并向左移动。我创建“Impenitrible”节点的功能是:
func spawnImpenitrible(){
Impenitrible.physicsBody = SKPhysicsBody(rectangleOfSize: Impenitrible.size)
let actionDone = SKAction.removeFromParent()
var MinValue = sand.size.height
var MaxValue = self.size.height - Impenitrible.size.height / 2
var spawnPoint = UInt32(MaxValue - MinValue)
Impenitrible.position = CGPoint(x: self.size.width - 60 , y: CGFloat(arc4random_uniform(spawnPoint)))
Impenitrible.physicsBody?.categoryBitMask = physicsCategory.impenitrible
Impenitrible.physicsBody?.contactTestBitMask = physicsCategory.sub
Impenitrible.physicsBody?.affectedByGravity = false
Impenitrible.physicsBody?.dynamic = true
self.addChild(Impenitrible)
}
我用以下方法调用此函数:
var impenitribleTimer = NSTimer.scheduledTimerWithTimeInterval(2.0, target: self, selector: Selector("spawnImpenitrible"), userInfo: nil, repeats: true)
我通过从“更新”功能中的x位置减去一个数字来移动它。
添加Impenitrible曾经很好。但是一旦它再次调用该函数,应用程序崩溃的错误为:
由于未捕获的异常'NSInvalidArgumentException'而终止应用程序,原因:'尝试添加已有父级的SKNode
我哪里做错了?任何帮助都会很棒!谢谢。
答案 0 :(得分:0)
首先,我想指出您的代码行:let actionDone = SKAction.removeFromParent()
实际上没用,因为您从不致电runAction
来使用它。
错误消息很好地总结了它。 "尝试添加已有父母"的SKNode。你实际上从未打电话给removeFromParent()
。
添加Impenitrible
一次就可以正常工作了,因为在开始时,Impenitrible
没有父级。后续调用将发生冲突,因为Impenitrible
已经拥有通过第一次调用添加的父级。
快速而肮脏的解决方法是在runAction(SKAction.removeFromParent())
的下一次调用之前执行spawnImpenitrible
,在某处,引用Imprenitrible
。