【问题标题】:Using waitForDuration() in spriteKit swift在 spriteKit swift 中使用 waitForDuration()
【发布时间】:2014-07-26 08:51:03
【问题描述】:

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

}

【问题讨论】:

  • 发布 self.generateNode 块代码
  • 使用M_PI作为常量,而不是3.14。
  • 不应将 generateNode 函数放在 update() 中。您应该创建一个由具有 waitForDuration 和 generateNode 的序列组成的 SKAction,并具有操作 repeatActionForever。

标签: ios swift sprite-kit


【解决方案1】:

来自关于函数 SKScene.Update() 的苹果文档

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

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

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

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

【讨论】:

  • 感谢您的回答。听起来很合乎逻辑。不幸的是,我正在使用 swift、spriteKit 和 XCode 大约两天,我真的不知道该怎么做。 :(
  • 如果你能让我更好地了解你想要完成的工作,我可能会提供帮助。
【解决方案2】:

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

- (void)didMoveToView:(SKView *)skView {
    SKAction *wait = [SKAction waitForDuration:2.];
    SKAction *generateNode = [SKAction runBlock:^{ 
        [self generateNode];
    }];
    [self runAction:[SKAction repeatActionForever:
        [SKAction sequence:@[wait, generateNode]]]];
}

【讨论】:

    【解决方案3】:
    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: 操作不会在您的原始代码中产生可见的效果。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-04-08
      • 2016-07-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-16
      • 1970-01-01
      相关资源
      最近更新 更多