timeInterval变量不起作用

时间:2016-10-16 19:15:16

标签: ios swift

我试图更改scheduledTimer中的timeInterval。我试图通过将变量更改为间隔而不是将timeInterval设置为此变量来执行此操作。我没有收到任何错误,但timeInterval不会发生变化。有人能帮助我吗?

var enemyTimer = Timer()
var playTime = 0
var enemySpawnTime: Double = 3
enemyTimer = Timer.scheduledTimer(timeInterval: Double(enemySpawnTime), target: self, selector: #selector(GameScene.enemySpawn), userInfo: nil, repeats: true)
playTimer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(GameScene.ingameTimer), userInfo: nil, repeats: true)
    func enemySpawn() {

    let enemy = SKSpriteNode(imageNamed: "Enemy")

    let minValue = self.size.width / 8
    let maxValue = self.size.width - 20

    let spawnPoint = UInt32(maxValue - minValue)

    enemy.position = CGPoint(x: CGFloat(arc4random_uniform(spawnPoint)), y: self.size.height)

    let action = SKAction.moveTo(y: -70, duration: 5)
    enemy.run(action)

    self.addChild(enemy)
}

func ingameTimer() {

    playTime += 1

    if(playTime >= 10 && playTime < 30){
        enemySpawnTime = 2
        print(enemySpawnTime)
    }else
    if(playTime >= 30 && playTime < 60){
        enemySpawnTime = 1
        print(enemySpawnTime)
    }else
    if(playTime >= 60 && playTime < 120){
        enemySpawnTime = 0.75
        print(enemySpawnTime)
    }else
    if(playTime >= 120 && playTime < 180){
        enemySpawnTime = 0.5
        print(enemySpawnTime)
    }else
    if(playTime >= 180 && playTime < 240){
        enemySpawnTime = 0.25
        print(enemySpawnTime)
    }
}

我希望有人可以帮助我! 谢谢!

1 个答案:

答案 0 :(得分:1)

您的代码无法正常工作的原因是因为Timer对象不知道其间隔需要与您的enemySpawnTime同步。解决方案很简单,只需在更改敌人产卵时间时重新创建计时器。

但是...

你应该从不使用Timer(Swift 3之前的NSTimer)或GCD来延迟你使用SpriteKit时的内容。有关详细信息,请参阅this

执行此操作的正确方法是创建一系列SKAction s。

假设selfSKScene的子类,您可以这样做:

override func didMove(to view: SKView) {
    let waitAction = SKAction.wait(forDuration: enemySpawnTime)
    let enemySpawnAction = SKAction.run { self.enemySpawn() }
    let sequence = SKAction.sequence([waitAction, enemySpawnAction])
    somePlaceholderNode.run(SKAction.repeatForever(sequence))
}

其中somePlaceholderNode只是一个除了运行操作之外什么都不做的节点。我稍后会解释一下。

你也应该为另一个计时器做这个。

现在每当你改变定时器间隔时,也要这样做:

somePlaceholderNode.removeAllActions()
let waitAction = SKAction.wait(forDuration: enemySpawnTime)
let enemySpawnAction = SKAction.run { self.enemySpawn() }
let sequence = SKAction.sequence([waitAction, enemySpawnAction])
somePlaceholderNode.run(SKAction.repeatForever(sequence))

这里我首先删除节点正在运行的操作,并告诉它运行几乎相同的操作,但使用不同的时间间隔。您可以将此代码块添加到didSet的{​​{1}}块:

enemySpawnTime

现在你的代码应该可以运行了!

我们在此处想要占位符节点的原因是,当我们通过调用var enemySpawnTime: Double = 3 { didSet { let waitAction = SKAction.wait(forDuration: enemySpawnTime) let enemySpawnAction = SKAction.run { self.enemySpawn() } let sequence = SKAction.sequence([waitAction, enemySpawnAction]) somePlaceholderNode.run(SKAction.repeatForever(sequence)) } } 删除操作时,我们不想删除所有正在运行的操作。