随机生成节点,组合 waitForDuration:withRange 和 runBlock: 在 SKAction 序列中

Spawn nodes at random times combing waitForDuration:withRange and runBlock: in an SKAction sequence

我正在用 SpriteKit 制作一个游戏,我的节点在屏幕顶部生成并掉落。但是,我希望这些节点以 0.1 到 3 秒之间的随机时间间隔生成。例如,第一个节点在 1.3 秒内生成,下一个节点在 1.8 秒内生成,然后是 2.5 秒,然后是 0.8 秒,等等。我不确定如何利用 waitForDuration 函数来执行此操作。我目前拥有的代码是:

let wait = SKAction.waitForDuration(3, withRange: 2)
let spawn = SKAction.runBlock { addTears()
}

let sequence = SKAction.sequence([wait, spawn])
self.runAction(SKAction.repeatActionForever(spawn))

当我尝试 运行 时,此代码冻结了我的游戏。我删除了 addTears() 并放置了一个日志,日志上出现了一个无限循环。我需要知道如何摆脱它。

我的 addTears() 函数的代码是:

func addTears() {
    let Tears = SKSpriteNode (imageNamed: "Tear")
    Tears.position = CGPointMake(Drake1.position.x, Drake1.position.y - 2)
    Tears.zPosition = 3
    addChild(Tears)

//gravity
Tears.physicsBody = SKPhysicsBody (circleOfRadius: 150)
Tears.physicsBody?.affectedByGravity = true

//contact
Tears.physicsBody = SKPhysicsBody (circleOfRadius: Tears.size.width/150)
Tears.physicsBody!.categoryBitMask = contactType.Tear.rawValue
Tears.physicsBody!.contactTestBitMask = contactType.Bucket.rawValue
}

如果我没记错的话,waitForDuration:withRange: 方法的工作原理如下: 如果你设置 3(秒)的持续时间1 秒的范围,你得到的随机值将是 介于2秒和4秒。也就是说,您应该将这些值用于您所描述的内容:let wait = SKAction.waitForDuration(1.55, withRange: 1.45)

对于冻结问题,如果您在此处正确粘贴了代码,那么此行 self.runAction(SKAction.repeatActionForever(spawn)) 就会出现问题,您应该在其中调用 sequence,如下所示:self.runAction(SKAction.repeatActionForever(sequence)).

PS : 在某些时候你可能还想同时控制屏幕上的撕裂量。

如果有帮助请告诉我。