在spriteKit swift中使用waitForDuration()

时间:2014-07-26 08:51:03

标签: ios swift sprite-kit

我想在生成节点之间等待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)    

}

3 个答案:

答案 0 :(得分:1)

关于函数SKScene.Update()

的Apple文档

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

因此,如果在update()中你不加区分地运行动作,它将无限循环地创建节点并尝试运行动作。

您应该选择一个更好的地方来制作场景内容。也许在viewDidLayoutSubviews()之后?或者,至少是为了回应你场景中的某些动作。

编辑: 看起来你想创建内容,让它移动然后从场景中删除它。你可能最好只创建一些精灵,保存对它们的引用然后让它们出现,移动并在需要时消失。那会更安全。

答案 1 :(得分:1)

我最好摆脱使用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]]]];
}

答案 2 :(得分:0)

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:操作不会对原始代码产生明显影响。