定期将节点添加到场景中,中间有一个随机的时间间隔

Bre*_*uro 3 ios sprite-kit sknode swift

简单地说,我试图弄清楚如何在一段时间内向我的场景添加 10 个节点,每个节点由一些随机时间间隔分隔。

例如:

Loop 10 times:

A. Create and add node to scene

B. Wait some random amount of time, 1-5 seconds

C. Back to A
Run Code Online (Sandbox Code Playgroud)

也很高兴知道它何时完成运行,当最后一个节点添加到场景时让布尔值翻转,但这需要知道最后一个节点何时完成添加。我不太确定如何实现这一点。我读了一些关于dispatch_after但这不会解决我添加节点问题之间的随机时间。

Whi*_*ind 5

在 SpriteKit 中,你通常使用SKAction它的waitForDuration(withRange:)方法来做到这一点。重要的部分是withRange参数(引用自文档):

每次执行动作时,动作都会为持续时间计算一个新的随机值。持续时间可能会在任一方向上变化,最多可达 durationRange 参数值的一半。

例如,如果您的等待持续时间为 3 秒,并且范围参数设置为 2,您将获得 2 到 4 秒的延迟。

所以这里是你如何做到这一点:

class GameScene: SKScene, SKPhysicsContactDelegate {

    var lastSpawnTime:Date?

    override func didMove(to view: SKView) {

        let wait = SKAction.wait(forDuration: 3, withRange: 4)

        let block = SKAction.run {[unowned self] in
            //Debug
            let now = Date()

            if let lastSpawnTime = self.lastSpawnTime {

                let elapsed = now.timeIntervalSince(lastSpawnTime)

                print("Sprite spawned after : \(elapsed)")
            }
            self.lastSpawnTime = now
            //End Debug

            let sprite = SKSpriteNode(color: .purple, size: CGSize(width: 50, height: 50))
            self.addChild(sprite)
        }

        let sequence = SKAction.sequence([block, wait])
        let loop = SKAction.repeat(sequence, count: 10)

        run(loop, withKey: "aKey")
    }
}
Run Code Online (Sandbox Code Playgroud)

你会在控制台看到类似的东西:

Spawning after : 1.0426310300827
Spawning after : 1.51278495788574
Spawning after : 3.98082602024078
Spawning after : 2.83276098966599
Spawning after : 3.16581499576569
Spawning after : 1.84182900190353
Spawning after : 1.21904700994492
Spawning after : 3.69742399454117
Spawning after : 3.72463399171829
Run Code Online (Sandbox Code Playgroud)