Increasing/Decreasing等待持续时间()?

Increasing/Decreasing waitForDuration( )?

我想知道是否可以使用变量增加 withForDuration( )。简而言之,这就是我试图做到的。这也是 SpriteKit,这是我第一次使用它,所以我还是有点不确定。虽然这段代码可以改变浮点数,但它实际上并没有改变 waitForDuration(difficulty)

var timer: NSTimer!
var difficulty = 1.0


override func didMoveToView(view: SKView) {
    backgroundColor = SKColor.whiteColor()

    player.position = CGPoint(x: size.width * 0.5, y: size.height * 0.25)
    player.physicsBody = SKPhysicsBody(circleOfRadius: player.size.width/2)
    player.physicsBody?.dynamic = true

    addChild(player)

    physicsWorld.gravity = CGVectorMake(0, 0)
    physicsWorld.contactDelegate = self

    var timer = NSTimer.scheduledTimerWithTimeInterval(1.0, target: self, selector: "increaseDifficulty", userInfo: nil, repeats: true)

    runAction(SKAction.repeatActionForever(
        SKAction.sequence([
            SKAction.runBlock(addEnemy),
            SKAction.waitForDuration(difficulty)
            ])
        ))
}

func increaseDifficulty() {
  difficulty -= 0.1
}

你没有得到预期的效果,因为 'difficulty' 的值在你的 SKAction 的第一个声明中被捕获并且它再也没有引用外部声明。

两种解决方法:

而不是 SKAction.repeatActionForever(),转储 SKAction.sequence() in increaseDifficulty。您必须稍微调整一下数字才能使其正常工作,但 NSTimer 已经 运行 重复,您可以改用它。

第二种方法(不是100%确定)是在难度前面加上'&'符号。这通过引用而不是通过值来传递难度,这应该会给你预期的效果。我只是不确定 Swift 是否允许这样做,但在 C++ 中这是我们可以做的。

一种方法是使用 runAction functioncompletionHandler。例如。

func addEnemyWithChangingDifficulty() {

    let waitAction = SKAction.waitForDuration(difficulty)
    let addEnemyAction = SKAction.runBlock { () -> Void in
        self.addEnemy()
    }

    runAction(SKAction.sequence([addEnemyAction,waitAction]), completion: { () -> Void in
        self.addEnemyWithChangingDifficulty()
    })
}

另一种方法是使用 update function 来跟踪 waitDuration

var lastAddedTime : CFTimeInterval = 0

override func update(currentTime: CFTimeInterval) {

    if currentTime - lastAddedTime > CFTimeInterval(difficulty) {
        addEnemy()
        lastAddedTime = currentTime
    }
}