runAction()内部的值不变

时间:2015-11-22 18:41:11

标签: swift sprite-kit

我有一个运行动作循环,它会产生一个敌人然后等待并产生另一个敌人。目的是得分越高,敌人产生的速度就越快。

但是现在的代码无论如何都会以相同的速度产生敌人。我一直在覆盖func update(currentTime:NSTimeInterval)方法中更新速率,所以我不知道出了什么问题。

override func update(currentTime: NSTimeInterval){
spawnRate = 2.0-(0.1*(Double)(((Double)(Score))/(10.0)))
    if(spawnRate < 0.5){
        spawnRate = 0.5
    }
}
override func didMoveToView(view: SKView) {
    runAction(SKAction.repeatActionForever(
            SKAction.sequence([
                SKAction.runBlock(addEnemy),
                SKAction.waitForDuration(spawnRate)
                ])
            ))
}

2 个答案:

答案 0 :(得分:1)

问题在于:

SKAction.sequence([
     SKAction.runBlock(addEnemy),
     SKAction.waitForDuration(spawnRate)
])

成为一个人,然后永远重复。

尝试将代码放在

runAction(SKAction.repeatActionForever(runblock(spawnAndWait()))

然后制作一个单独的函数。

spawnAndWait() { // put here the code for spawning the enemy and waiting spawnrate duration.

b.t.w
将更新spawnRate的代码放在分数增加的位置。因为那样更有效率。然后在更新方法中因为不断调用。

答案 1 :(得分:1)

目前正在发生的事情是你:

  • 行动中存储的持续时间参数
  • 一遍又一遍地重复使用该行动

所以没有任何改变。要解决这个问题,一种方法是每次使用递归调用和更改持续时间参数:

import SpriteKit

class GameScene: SKScene {

    let  shape = SKSpriteNode(color: UIColor.redColor(), size: CGSize(width: 20, height: 20))

    var delay:NSTimeInterval = 1.0

    override func didMoveToView(view: SKView) {

       recursiveMethod()

    }

    func recursiveMethod(){



        let recursive = SKAction.sequence([

            SKAction.waitForDuration(delay),
            SKAction.runBlock({self.recursiveMethod();println("delay \(self.delay)")})
         ])

        runAction(recursive)

    }

    override func update(currentTime: NSTimeInterval) {
        if(delay > 0.2){delay = delay - 0.001}
    }

}