在spriteKit swift中使用waitForDuration()

我想在生成节点之间等待2秒钟。 所以我写了这个代码:

override func update(currentTime: CFTimeInterval) { let releaseNodes = SKAction.sequence([SKAction.runBlock(self.generateNode), SKAction.waitForDuration(2)]) self.runAction(releaseNodes) } 

但它不起作用。 它是疯狂的生成节点。 (如20秒)。 我该如何处理? 任何人都可以帮我吗?

编辑:这是self.generateNode块

 func generateNode(){ var node: SKSpriteNode = SKSpriteNode(imageNamed: "node") fish.anchorPoint = CGPoint(x:CGFloat(-0.5),y:CGFloat(-0.2)) fish.position = CGPoint(x:CGFloat(10),y:CGFloat(30)) var move = SKAction.rotateToAngle(CGFloat(3.14), duration: NSTimeInterval(1)) var remove = SKAction.removeFromParent() var seq = SKAction.sequence([move, remove]) node.runAction(seq) self.addChild(node) } 

从函数SKScene.Update()的苹果文档中,

Performs any scene-specific updates that need to occur before scene actions are evaluated.

所以如果在update()内你不分青红皂白地运行动作,它将无限循环地创build节点并尝试运行动作。

你应该select一个更好的地方来创build你的场景内容。 也许在viewDidLayoutSubviews()之后? 或者至less是回应你场景中的一些行动。

编辑:它看起来像你想创build内容,让它移动,然后将其从场景中删除。 创build几个精灵可能会更好,为他们保留一个引用,然后让他们出现,移动,并在需要时消失。 这会更安全。

我最好摆脱使用update:方法,并使用SKAction s做所有事情:

 - (void)didMoveToView:(SKView *)skView { SKAction *wait = [SKAction waitForDuration:2.]; SKAction *generateNode = [SKAction runBlock:^{ [self generateNode]; }]; [self runAction:[SKAction repeatActionForever: [SKAction sequence:@[wait, generateNode]]]]; } 
 override func update(currentTime: CFTimeInterval) { static var previousTime = 0.0 if (currentTime - previousTime) > 2.0 { let releaseNodes = SKAction.runBlock(self.generateNode) self.runAction(releaseNodes) } previousTime = currentTime } 

update(currentTime:)给你当前帧的时间戳。 不要忘记使用该属性。

另外,最后的waitForDuration:操作在原始代码中不会有明显的效果。