我需要一种方法来创建更多硬币并在玩家收集硬币或硬币进入屏幕时将其删除。游戏运行正常,但当我尝试添加NSTimer
时,如此:
var timer = NSTimer.scheduledTimerWithTimeInterval(2, target: self, selector: Selector("genrateRandomPositions"), userInfo: nil, repeats: true)
游戏崩溃并给我一个错误:
Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Attemped to add a SKNode which already has a parent: <SKSpriteNode> name:'(null)' texture:[<SKTexture> 'coin' (50 x 68)] position:{1024, 350} size:{50, 68} rotation:0.00
“
我知道这意味着什么,来自同一个父级的节点有多个,但我需要知道是否有办法代替NSTimer
。
我的addCoin功能:
func addcoins(positionY:CGFloat){
self.coinTexture = SKTexture(imageNamed: "coin")
self.coin = SKSpriteNode(imageNamed: "coin")
self.coin.position = CGPointMake(CGRectGetMaxX(self.frame), positionY)
self.coin.physicsBody = SKPhysicsBody(circleOfRadius: self.coin.size.width / 2 )
self.coin.physicsBody?.dynamic = false
self.coin.physicsBody?.categoryBitMask = coinCategory
self.coin.physicsBody?.contactTestBitMask = helicopterCategory
self.coin.physicsBody?.collisionBitMask = NoneCategory
self.coin.physicsBody?.usesPreciseCollisionDetection = true
var moveCoin = SKAction.moveByX(-bgTexture.size().width, y: 0, duration: bgSpeed)
self.addChild(self.coin)
self.coin.runAction(moveCoin)
}
答案 0 :(得分:1)
每次制作新硬币时都需要创建一个新节点,并且应该在将SKAction添加到场景后运行SKAction。最后,错误意味着当节点已经有父节点时,您正在向父节点添加节点。错误不意味着一个父节点有多个节点,因为它不应该抛出错误。这是一些更新的代码:
func addcoins(positionY:CGFloat){
var coinTexture = SKTexture(imageNamed: "coin")
var newCoin = SKSpriteNode(imageNamed: "coin")
newCoin.position = CGPointMake(CGRectGetMaxX(self.frame), positionY)
newCoin.physicsBody = SKPhysicsBody(circleOfRadius: coin.size.width / 2 )
newCoin.physicsBody?.dynamic = false
newCoin.physicsBody?.categoryBitMask = coinCategory
newCoin.physicsBody?.contactTestBitMask = helicopterCategory
newCoin.physicsBody?.collisionBitMask = NoneCategory
newCoin.physicsBody?.usesPreciseCollisionDetection = true
var moveCoin = SKAction.moveByX(-bgTexture.size().width, y: 0, duration: bgSpeed)
addChild(coin)
coin.runAction(moveCoin)
}