如何在Swift 2中循环时创建延迟?

时间:2015-12-09 11:21:43

标签: swift sprite-kit

我需要帮助这个循环 - 我正在尝试做的是减慢删除和添加新圆圈的整个过程,而半径在每次发生这种情况时都会发生变化。我变得非常绝望,我已经尝试在循环中使用dispatch_after和sleep(我在网上找到),但它们都不合适,它们基本上停止了整个应用程序。如果我把它们放在while循环中,没有任何反应。提前谢谢!

while radius < 100 {

    self.removeAllChildren()
    addCircle()
    radius++
    print(radius)            
}

2 个答案:

答案 0 :(得分:3)

基本上你只需要做一些简单的事情:

以下是您如何做到这一点的示例。重要的部分是行动顺序。您创建上面的步骤,并永远重复它。每次检查半径值并根据该值停止操作(通过键将其删除)。就是这样。您可以通过更改操作的持续时间参数来更改产卵速度。

使用NSTimer似乎是一种更简单的解决方案,但NSTimer并不尊重节点(或场景或视图)暂停状态。所以,想象一下这种情况:

  • 您开始产生节点
  • 用户接听电话和应用自动转到后台

由于NSTimer未自动暂停,因此节点将继续生成。因此,您必须采取额外的步骤并使自己无效/重新启动计时器。使用SKAction时,会自动完成。在SpriteKit中使用NSTimer还有一些其他缺陷,搜索所有这些内容,有一些帖子涵盖了所有这些。

import SpriteKit

class GameScene: SKScene{

    var radius:UInt32 = 0

    override func didMoveToView(view: SKView) {

        startSpawning()
    }

    func startSpawning(){

        let wait = SKAction.waitForDuration(0.5)

       // let wait = SKAction.waitForDuration(1, withRange: 0.4) // randomize wait duration

        let addNode = SKAction.runBlock({

            [unowned self] in //http://stackoverflow.com/a/24320474/3402095 - read about strong reference cycles here

            if(self.radius >= 30){ 

                if self.actionForKey("spawning") != nil {

                    self.removeActionForKey("spawning")
                }
            }

            self.radius++
            let sprite = self.spawnNode()
            sprite.position = CGPoint(x: Int(arc4random()) % 300,  y: Int(arc4random()) % 300) // change this to randomize sprite's position to suit your needs

            self.addChild(sprite)
        })
        //wait & add node   
        let sequence = SKAction.sequence([wait, addNode])
        //repeat forever
        runAction(SKAction.repeatActionForever(sequence), withKey: "spawning")

    }

    func spawnNode()->SKSpriteNode{
        let sprite = SKSpriteNode(color: SKColor.purpleColor(), size: CGSize(width: 50, height: 50))
        //Do sprite initialization here
        return sprite
    }
}

答案 1 :(得分:-1)

睡眠会停止整个应用程序,因为您正在主线程上运行循环。

您可以通过以下两种方式解决此问题......

1)使用NSTimer。将其设置为您想要延迟的时间。将循环体放入计时器的触发功能中,并在计时器被调用足够次时禁用计时器。这是最好的解决方案。

2)将调度异步块中的循环包装到后台线程,并在循环中进行休眠。如果你这样做,你将不得不将UI代码包装在另一个调度异步块中,该异步块返回到主线程。