随机时间产生的节点在一个SKAction序列中结合waitForDuration:withRange和runBlock :.

时间:2015-06-15 17:43:54

标签: swift sprite-kit skspritenode skaction

我正在使用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
}

1 个答案:

答案 0 :(得分:5)

If I remember well, the waitForDuration:withRange: method works like so : if you put a duration of 3 (seconds) and a range of 1 seconds the random value that you get will be between 2 and 4 seconds. That said, you should use those value for what you described : let wait = SKAction.waitForDuration(1.55, withRange: 1.45)

For the freeze problem, if you pasted your code correctly here the problem come with this line self.runAction(SKAction.repeatActionForever(spawn)) where you should instead be calling your sequence like this : self.runAction(SKAction.repeatActionForever(sequence)).

PS : At a certain point you still might want to control the amount of tears on screen at the same time.

Let me know if it helped.