我需要帮助这个循环 - 我正在尝试做的是减慢删除和添加新圆圈的整个过程,而半径在每次发生这种情况时都会发生变化。我变得非常绝望,我已经尝试在循环中使用dispatch_after和sleep(我在网上找到),但它们都不合适,它们基本上停止了整个应用程序。如果我把它们放在while循环中,没有任何反应。提前谢谢!
while radius < 100 {
self.removeAllChildren()
addCircle()
radius++
print(radius)
}
答案 0 :(得分:3)
基本上你只需要做一些简单的事情:
以下是您如何做到这一点的示例。重要的部分是行动顺序。您创建上面的步骤,并永远重复它。每次检查半径值并根据该值停止操作(通过键将其删除)。就是这样。您可以通过更改操作的持续时间参数来更改产卵速度。
使用NSTimer似乎是一种更简单的解决方案,但NSTimer并不尊重节点(或场景或视图)暂停状态。所以,想象一下这种情况:
由于NSTimer未自动暂停,因此节点将继续生成。因此,您必须采取额外的步骤并使自己无效/重新启动计时器。使用SKAction时,会自动完成。在SpriteKit中使用NSTimer还有一些其他缺陷,搜索所有这些内容,有一些帖子涵盖了所有这些。
import SpriteKit
class GameScene: SKScene{
var radius:UInt32 = 0
override func didMoveToView(view: SKView) {
startSpawning()
}
func startSpawning(){
let wait = SKAction.waitForDuration(0.5)
// let wait = SKAction.waitForDuration(1, withRange: 0.4) // randomize wait duration
let addNode = SKAction.runBlock({
[unowned self] in //http://stackoverflow.com/a/24320474/3402095 - read about strong reference cycles here
if(self.radius >= 30){
if self.actionForKey("spawning") != nil {
self.removeActionForKey("spawning")
}
}
self.radius++
let sprite = self.spawnNode()
sprite.position = CGPoint(x: Int(arc4random()) % 300, y: Int(arc4random()) % 300) // change this to randomize sprite's position to suit your needs
self.addChild(sprite)
})
//wait & add node
let sequence = SKAction.sequence([wait, addNode])
//repeat forever
runAction(SKAction.repeatActionForever(sequence), withKey: "spawning")
}
func spawnNode()->SKSpriteNode{
let sprite = SKSpriteNode(color: SKColor.purpleColor(), size: CGSize(width: 50, height: 50))
//Do sprite initialization here
return sprite
}
}
答案 1 :(得分:-1)
睡眠会停止整个应用程序,因为您正在主线程上运行循环。
您可以通过以下两种方式解决此问题......
1)使用NSTimer。将其设置为您想要延迟的时间。将循环体放入计时器的触发功能中,并在计时器被调用足够次时禁用计时器。这是最好的解决方案。
2)将调度异步块中的循环包装到后台线程,并在循环中进行休眠。如果你这样做,你将不得不将UI代码包装在另一个调度异步块中,该异步块返回到主线程。