随机生成节点,组合 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 : 在某些时候你可能还想同时控制屏幕上的撕裂量。
如果有帮助请告诉我。
我正在用 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 : 在某些时候你可能还想同时控制屏幕上的撕裂量。
如果有帮助请告诉我。