在随机时间结合 waitForDuration:withRange 和 runBlock: 在 SKAction 序列中生成节点
Posted
技术标签:
【中文标题】在随机时间结合 waitForDuration:withRange 和 runBlock: 在 SKAction 序列中生成节点【英文标题】:Spawn nodes at random times combing waitForDuration:withRange and runBlock: in an SKAction sequence 【发布时间】:2015-06-15 17:43:54 【问题描述】:我正在使用 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】:如果我没记错的话,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:在某些时候,您可能仍想同时控制屏幕上的眼泪量。
如果有帮助,请告诉我。
【讨论】:
这非常有效,谢谢。如果我也想随机化这些眼泪落下的速度,有没有一种方法可以用来做这件事?他们目前正在使用以下方法以恒定速度下降:physicsWorld.gravity = CGVectorMake(0, -7) 你可能会改变你眼泪的physicsBody(质量,...)的一些设置。但是,如果你正在寻找的是,例如,让一些眼泪不断掉下来,我认为你应该看看 SKEmitterNode / Particle Emitter 在 .sks 文件中的位置,或者以编程方式,你将能够设置几个变量与范围。尝试玩它:) 感谢您的回复。我会投票,但我需要更多的声誉。 没问题,很高兴我能帮上忙 :) 这是有史以来最好的解释,你是对的 :) 所以基本上它所做的计算是持续时间 -+ 范围。因此,如果持续时间为 10 且范围为 5,则随机数将从 5 变为 15。以上是关于在随机时间结合 waitForDuration:withRange 和 runBlock: 在 SKAction 序列中生成节点的主要内容,如果未能解决你的问题,请参考以下文章