我试图更改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)
}
}
我希望有人可以帮助我! 谢谢!
答案 0 :(得分:1)
您的代码无法正常工作的原因是因为Timer
对象不知道其间隔需要与您的enemySpawnTime
同步。解决方案很简单,只需在更改敌人产卵时间时重新创建计时器。
但是...
你应该从不使用Timer
(Swift 3之前的NSTimer
)或GCD来延迟你使用SpriteKit时的内容。有关详细信息,请参阅this。
执行此操作的正确方法是创建一系列SKAction
s。
假设self
是SKScene
的子类,您可以这样做:
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))
}
}
删除操作时,我们不想删除所有正在运行的操作。